import java.security.*;
import javax.crypto.*;
import javax.crypto.spec.*;
import sun.misc.*;

public class RSA
{
  public static void main (String[] args)throws Exception
  {
    // Crear una clave simétrica para Blowfish
    System.out.println("Generando clave Blowfish...");
    KeyGenerator generador = KeyGenerator.getInstance("Blowfish");
    generador.init(128);
    Key claveBlowfish = generador.generateKey();    
    System.out.println("Formato: "+claveBlowfish.getFormat());


    // Generar un par RSA
    System.out.println("Generando par de claves RSA...");
    KeyPairGenerator generadorRSA = KeyPairGenerator.getInstance("RSA");
    generadorRSA.initialize(1024);
    KeyPair claves = generadorRSA.genKeyPair();
    System.out.println("Generada la clave asimétrica.");

    // Crear e inicializar un cifrador adecuado (ECB)
    Cipher cifradorRSA = Cipher.getInstance("RSA/ECB/PKCS1Padding");
    cifradorRSA.init(Cipher.ENCRYPT_MODE, claves.getPublic());

    // Obtener bytes de la clave simétrica y encriptarlos con RSA
    byte[] bytesClaveBlowfish = claveBlowfish.getEncoded();
    byte[] claveBlowfishCifrada = cifradorRSA.doFinal(bytesClaveBlowfish);
    System.out.println("Encriptada la clave simétrica");

    // Reinicializar cifrador RSA para desencriptar con la clave privada
    System.out.println("Comenzamos a desencriptarla");
    cifradorRSA.init(Cipher.DECRYPT_MODE, claves.getPrivate());

    // Desencriptar la clave
    byte[] bytesClaveBlowfish2 = cifradorRSA.doFinal(claveBlowfishCifrada);

    // Recrear la clave Blowfish a partir de los bytes
    SecretKey nuevaClaveBlowfish = new SecretKeySpec(bytesClaveBlowfish2, "Blowfish");
    System.out.println("Clave simétrica conseguida");

  }
}
