/**
  * Cifratura 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 Esempio3 {

  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("");

	// -------- messaggio in chiaro------------------

	byte[] data = {10,20,30,40,50,60,70,80}; 

	System.out.println("Messaggio in chiaro: ");
	for (int i=0; i<data.length; i++)
		System.out.print("" + data[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 cifrare

	  des.init(Cipher.ENCRYPT_MODE, k);

	  // -------- cifratura messaggio

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

	  System.out.println("Messaggio cifrato: ");
	  for (int i=0; i<xxx.length; i++)
		System.out.print("" + xxx[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);
    	}
   }
}
