package chat;



import cryptix.provider.Cryptix;

import java.io.FileOutputStream;

import java.security.KeyPairGenerator;

import java.security.KeyPair;

import java.security.NoSuchAlgorithmException;

import java.security.SecureRandom;

import java.security.Security;



/**
 * Classe di utilità per creare le chiavi relative all'algoritmo RSA.
 * Redirigendo lo <i>standard output</i> su file è possibile salvare
 * in un vettore <code>byte[]</code> di Java le chiavi generate.
 * Vengono creati inoltre due file "Pubblica.bin" e "Segreta.bin" i
 * quali contengono, rispettivamente, la chiave pubblica e la chiave
 * privata appena generate.
 * Per riottenere le chiavi partendo dal vettore di byte è sufficiente:
 * <p>
 * <code><b>new</b> cryptix.provider.rsa.RawRSAPublicKey(<b>new</b> java.io.ByteArrayInputStream(<i>public_byte_array</i>));</code>
 * <p>
 * oppure:
 * <p>
 * <code><b>new</b> cryptix.provider.rsa.RawRSAPrivateKey(<b>new</b> java.io.ByteArrayInputStream(<i>private_byte_array</i>));</code>
 * <p>
 * Analoga cosa si può fare a partire dai file su disco, incapsulandoli
 * entro un <code>java.io.FileInputStream</code> piuttosto che in un
 * <code>java.io.ByteArrayInputStream</code>.
 * <p>
 *
 * @author    <em>Marco Cimatti</em>
 * @version   1.0
 */
public class CreaChiaviRSA {

  /**
   * L'<i>entry point</i> del programma.
   * Il primo parametro sulla linea di comando indica la lunghezza in
   * bit delle chiavi da generare. Ad esempio, per generare chiavi RSA
   * lunghe 512 bit:
   * <p>
   * <code><i>java</i> chat.CreaChiaviRSA 512</code>
   * <p>
   *
   * @param   args   gli argomenti della linea di comando.
   */
  public static void main(String[] args) {
    if (args.length != 1)
      System.out.println("Uso:   <java> CreaChiaviRSA [lunghezza delle chiavi (in bit)]");
    else
      try {
        Security.addProvider(new Cryptix());
        KeyPairGenerator gen = KeyPairGenerator.getInstance("RSA");
        gen.initialize(Integer.parseInt(args[0]), new SecureRandom());
        Cronometro c = new Cronometro();
        c.avanza();
        KeyPair k = gen.generateKeyPair();
        c.ferma();
        System.out.println("Coppia di chiavi generata in " + c + " millisecondi.\n");
        System.out.println("\nChiave pubblica = { "
          + Utili.hexByteArrayToString(k.getPublic().getEncoded())
          + " }   // " + k.getPublic().getEncoded().length + " byte\n");
        System.out.println("\nChiave privata  = { "
          + Utili.hexByteArrayToString(k.getPrivate().getEncoded())
          + " }   // " + k.getPrivate().getEncoded().length + " byte");
        new FileOutputStream("Pubblica.bin").write(k.getPublic().getEncoded());
        new FileOutputStream("Segreta.bin").write(k.getPrivate().getEncoded());
      } catch (Exception e) { e.printStackTrace(); }
  }
}


syntax highlighted by Code2HTML, v. 0.8.11