Muchos de vosotros nos habéis comentado que el primer artículo de cifrado estaba muy bien como teoría, pero quizás le faltaba algo de como se hace todo esto en la práctica. Bueno, este post viene a ser la continuación de “cifrado para dummies” y antes de leer este es muy recomendable leer el anterior (Ya que allí se explica toda la teoría que aquí se omite).

Uno de los problemas que solucionamos en este artículo se da al intentar guardar o transmitir textos cifrados bajo otro protocolo, los textos cifrados devuelven arrays de Byte que algunos protocolos no son capaces de manejar. La solución se llama Base64 y también la implementamos en las clases que os dejamos al final.

Por otra parte todos los tutoriales prácticos que he encontrado hablan de como utilizar certificados generados con OpenSSL para guardarlos en ficheros PEM y utilizarlos de claves pública, privada en los cifrados RSA. En eKameno se nos ha planteado la duda de cómo hacerlo sin ficheros, de forma quizás más volátil y segura según el protocolo, estamos seguros de que no seremos los únicos que lo quieren hacer así, y poder guardar llaves públicas o privadas en Strings.

¿Y cómo se usa esto? Vamos a dar uno par de ejemplos de lo que se puede hacer con las :

Encriptado y desencriptado con AES (clave simétrica)

// Encriptado y desencriptado en AES:
String text = “Texto para encryptar”;

// Se genera la llave simétrica y la guardamos en String
Security sec0 = new Security();
sec0.setKeyLength(128);
String SymetricKey = sec0.AESGenerateKey();

// Se carga la llave simétrica de sec0 en sec1 para ver como se encriptaría sólo utilizando esa llave(String))
Security sec1 = new Security();
sec1.setKeyLength(128);
sec1.AESLoadKey(SymetricKey);
String encryptedText = sec1.toBase64(sec1.AESencrypt(text));

System.out.println(“ENCRYPT TEXT: ” + encryptedText);

// El mismo formato de carga se puede utilizar para desencryptar el texto:
Security sec2 = new Security();
sec2.setKeyLength(128);
sec2.AESLoadKey(SymetricKey);
String decryptedText = sec2.AESdecrypt(sec2.fromBase64(encryptedText));

System.out.println(“DECRYPTED TEXT: ” + decryptedText);

Encriptado y desencriptado con RSA (clave asimétrica)

// Encriptado y desencriptado en RSA:
String text = “Texto para encryptar”;

// Se genera el PAR de llaves (Público-privado en el objeto sec0)
Security sec0 = new Security();
sec0.setKeyLength(1024);
sec0.RSAGenerateKey();
String PublicKey = sec0.toBase64(sec0.RSAPublic.getEncoded());
String PrivateKey = sec0.toBase64(sec0.RSAPrivate.getEncoded());

// Se carga la llave Pública de sec0 en sec1 para ver como se encriptaría sólo utilizando esa llave(String))
Security sec1 = new Security();
sec1.setKeyLength(1024);
sec1.RSALoadPublicKey(sec1.fromBase64(PublicKey));
String encryptedText = sec1.toBase64(sec1.RSAencryptLong(text));

System.out.println(“ENCRYPT TEXT: ” + encryptedText);

// El mismo formato de carga se puede utilizar para desencryptar el texto:
Security sec2 = new Security();
sec2.setKeyLength(1024);
sec2.RSALoadPrivateKey(sec2.fromBase64(PrivateKey));
String decryptedText = sec2.RSAdecryptLong(sec1.fromBase64(encryptedText));

System.out.println(“DECRYPTED TEXT: ” + decryptedText);

Firma digital

// Firma de un texto:

// Se genera el PAR de llaves (Público-privado en el objeto sec0)
Security sec0 = new Security();
sec0.setKeyLength(1024);
sec0.RSAGenerateKey();

// Se carga la llave Pública de sec0 en sec1 para ver como se firmaría un texto sólo utilizando esa llave
Security sec1 = new Security();
sec1.RSALoadPrivateKey(sec0.RSAPrivate.getEncoded());
String sign = sec0.toBase64(sec1.RSAsign(fakeTextToDecrypt));

System.out.println(“SIGN: ” + sign);

// El mismo formato de carga se puede utilizar para Verificar el firmado del texto:
Security sec2 = new Security();
sec2.RSALoadPublicKey(sec0.RSAPublic.getEncoded());
boolean verified = sec2.RSAverify(sec2.fromBase64(sign), fakeTextToDecrypt);

System.out.println(“VERIFY: ” + (verified ? “OK” : “FAIL”));

Para finalizar, todos los ejemplos están compilados con las clases que adjuntamos aquí debajo y que utilizamos también para el desarrollo de eKameno. Esperamos que os sean útiles ya que están hechas para su simplicidad:

Security_android.java:

  • http://www.ekameno.com/owncloud/apps/files_sharing/get.php?token=2706c19aac4045e31363ea30fbbaac2b5f23af70

Security_java.java:

  • http://www.ekameno.com/owncloud/apps/files_sharing/get.php?token=d99b8986e586311d0ce788d06d5b03cf252b434b
Share →

Deja un comentario