/**
  * Decifratura di un messaggio con DES
  * NB: richiede la IAIK-JCE
  @author Enrico Denti
  @version 1.0, 2/3/99
*/
import java.io.IOException;
import java.io.BufferedReader;
import java.io.InputStreamReader;

import java.security.Security;
import java.security.SecureRandom;
import java.security.NoSuchAlgorithmException;
import java.security.InvalidKeyException;
import java.security.NoSuchProviderException;
import java.security.Key;

import javax.crypto.*;
import iaik.security.provider.*;

class Esempio4 {

  public static void main(String args[]){

	System.out.print("Aggiunta del nuovo provider IAIK....");

	IAIK provider = new IAIK();
	Security.addProvider(provider);

	System.out.println(" aggiunta riuscita.");

	// -------- lettura chiave da input -------------------------------
	// -------- (nella realt sar cablata nel codice)-----------------

	byte[] chiave = new byte[8];
	BufferedReader in = new BufferedReader(new InputStreamReader(System.in));

	System.out.println("Inserire la chiave (8 byte, uno per riga):");
	try {
		for(int i=0; i<8; i++) {
			String buf = in.readLine();
			chiave[i] = Byte.parseByte(buf);
		}
	}
	catch (IOException e) {
	  System.out.println("Lettura da input fallita");
	}

	System.out.println("Chiave introdotta:");
	for (int i=0; i<chiave.length; i++)
		System.out.print("" + chiave[i] + "\t");
	System.out.println("");

	// ----- rigenerazione chiave a partire da array di byte:
	// ----- SCONSIGLIATO - lo faccio solo qui perch leggo
	// ----- la chiave da input, nella realt la chiave verr
	// ----- generata come nell'Esempio2 e nell'EsempioGlobale

	iaik.security.cipher.SecretKey k = new iaik.security.cipher.SecretKey(chiave,"DES");

	System.out.println("Chiave generata: ");
	for (int i=0; i<k.getEncoded().length; i++)
		System.out.print("" + k.getEncoded()[i] + "\t");
	System.out.println("");

	// -------- creazione Cifratore -----------------

	System.out.println("Generazione del Cipher");

	Cipher des =  null;
	try {
	  // ----- creazione Cipher per algoritmo prescelto
	  // ----- a partire dal provider indicato

	  des = Cipher.getInstance("DES","IAIK");

	  // ----- inizializzazione Cipher per decifratura

	  des.init(Cipher.DECRYPT_MODE, k);

	  // -------- acquisizione messaggio cifrato da input

	  byte[] xxx = null;
	  try {
		System.out.print("Lunghezza in byte del messaggio cifrato: ");
		int msglen = Integer.parseInt(in.readLine());
	  	System.out.println("");
		xxx = new byte[msglen];

		System.out.println("Inserire il messaggio cifrato (un valore per riga):");
		for(int i=0; i<msglen; i++) 
			xxx[i] = Byte.parseByte(in.readLine());
	  }
	  catch (IOException e) {
	    System.out.println("Lettura da input fallita");
	  }

	  // -------- decifratura messaggio

	  byte[] newdata = des.doFinal(xxx);

	  System.out.println("Messaggio decifrato: ");
	  for (int i=0; i<newdata.length; i++)
		System.out.print("" + newdata[i] + "\t");
	  System.out.println("");
	}
	catch (NoSuchProviderException e2) {
	  System.out.println("Provider non supportato");
	  System.exit(2);
	}
	catch (NoSuchAlgorithmException e2) {
	  System.out.println("Algoritmo non supportato");
	  System.exit(2);
	}
	catch (NoSuchPaddingException e2) {
	  System.out.println("Tipo di padding non supportato");
	  System.exit(2);
	}
	catch (BadPaddingException e3) {
          System.out.println("Bad Padding");
          System.exit(3);
	}
	catch (InvalidKeyException e3) {
	  System.out.println("Chiave non valida");
	  System.exit(3);
	}
	catch (IllegalBlockSizeException ex) {
          System.out.println("Dimensione del blocco illegale");
          System.exit(3);
    	}
   }
}
