/* Author: Alberto Gil Tesa WebSite: http://giltesa.com License: CC BY-NC-SA 3.0 http://goo.gl/CTYnN File: MainCifrarFirmar.java Date: 26/02/2013 NOTAS: El cliente firma con su privada Despues cifra con la publica del servidor El servidor descifra con su privada Despues desfirma con la publica del cliente */ import java.math.BigInteger; public class MainCifrarFirmarPlus { public static void main(String[] args) { // Lo primero es crear dos objetos RSA, el primero hara de Cliente y el segundo de Servidor. // Cada uno cuenta con sus claves publicas y privadas generadas: // Estas claves solo se usarán para transmitir la nueva clave publica (cifrada y firmada) Rsa inseguraC = new Rsa(1024); Rsa inseguraS = new Rsa(1024); // Se crean otro par de claves (las definitivas) Rsa seguraC = new Rsa(1024); Rsa seguraS = new Rsa(1024); // Se extrae la clave publica buena BigInteger clientec0 = seguraC.getPublicKey()[0]; BigInteger clientec1 = seguraC.getPublicKey()[1]; // El Cliente firma con su privada: BigInteger firmadoc0 = inseguraC.encrypt(clientec0, inseguraC.getPrivateKey()); BigInteger firmadoc1 = inseguraC.encrypt(clientec1, inseguraC.getPrivateKey()); // El Cliente cifra con la publica del servidor: BigInteger cifradoc0 = inseguraC.encrypt(firmadoc0, inseguraS.getPublicKey()); BigInteger cifradoc1 = inseguraC.encrypt(firmadoc1, inseguraS.getPublicKey()); // El Servidor usa su clave privada para descifrar: BigInteger descifradoc0 = inseguraS.decrypt(cifradoc0); BigInteger descifradoc1 = inseguraS.decrypt(cifradoc1); // El Servidor usa la clave publica del cliente para Desfirmar: BigInteger desfirmadoc0 = inseguraS.decrypt(descifradoc0, inseguraC.getPublicKey()); BigInteger desfirmadoc1 = inseguraS.decrypt(descifradoc1, inseguraC.getPublicKey()); /* Ahora el servidor tiene una nueva clave publica, que puede usar para enviar * mensajes al cliente de manera más segura todavía.*/ // Estos son los datos que se van a cifrar y descifrar: byte[] misDatos = new byte[] { 'H', 'o', 'l', 'a', ' ', 'm', 'u', 'n', 'd', 'o', '!' }; BigInteger cifrado = seguraS.encrypt(new BigInteger(misDatos), new BigInteger[]{desfirmadoc0,desfirmadoc1}); BigInteger descifrado = seguraC.decrypt(cifrado); /* Se deberia hacer el mismo proceso con la clave publica seguraS para enviarsela al cliente Y aun seria mas seguro si se cifra y se firma (no necesario ya que sabemos con seguridad que la nueva clave publica la tiene solo el receptor) */ // Y por ultimo se imprime por pantalla el BigInteger pasandolo a un array de chars: byte[] array = descifrado.toByteArray(); // Se recorre el array: if( array.length > 0 ) { System.out.println("Mensaje:"); for( int i = 0 ; i < array.length ; i++ ) System.out.print((char)array[i]); } } }