Creación clave simétrica OpenSSL

Iniciado por mestebanrg, 1 Diciembre 2016, 19:15 PM

0 Miembros y 1 Visitante están viendo este tema.

mestebanrg

Buenas tardes,

Soy nuevo en este foro y en el mundo de la criptografía, y a ver si podéis echarme una mano, ya que tengo la cabeza como un platillo.
Para un proyecto que estoy desarrollando, necesito generar claves simétricas aleatorias de 128 bits. Exactamente en la documentación del proyecto detalla la Key como matriz de bytes con clave simétrica de 128 bits producido de acuerdo con la norma AES.
Posteriormente, tengo que cifrar esta Key con una clave pública que me han suministrado desde un organismo público con un algoritmo RSA y codificado todo esto en base 64.
Estoy usando openssl para realizar estas tareas, pero no se si lo que estoy probando es lo necesario para crear estas claves simétricas y las codificaciones.
Gracias.

kub0x

#1
Por lo que veo te dan una clave pública en formato .pem y tu debes generar una clave simétrica AES-128 bit para posteriormente cifrarla con dicha pública y enviarla. No veo que uses firmas digitales o mecanismos de integridad, lo cual en una aplicación real pone en peligro este mecanismo.

Comentas que es un proyecto, por lo tanto estarás usando uno o varios lenguajes de programación. En la mayoría de lenguajes existen librerías que te permiten hacer esto, pero yo te pondré un ejemplo con OpenSSL. Aunque en AES-CBC no se puede reutilizar el mismo IV dos veces.

Primero genera una clave AES-128 bit para cifrar en modo CBC:

openssl enc -aes-256-cbc -k pass -P -md sha1

Obviamente donde pone pass pones una password, si quieres, aleatoria. El output del comando será la key+iv+salt. Guarda la key en un fichero llamado key.bin, ya que no has dicho nada de cifrar con AES, por lo tanto el IV y salt no nos sirven para este ejemplo.

Ahora cifra la clave AES-128 con la RSA que te han suministrado:

openssl rsautl -encrypt -inkey id_rsa.pub.pem -pubin -in key.bin -out key.bin.enc

Donde id_rsa.pub.pem es la pública que te han suministrado, key.bin es la AES-128 que has generado y key.bin.enc es el fichero que se creará después de ejecutar el comando, con la AES-128 cifrada por la pública RSA.

Saludos!
Viejos siempre viejos,
Ellos tienen el poder,
Y la juventud,
¡En el ataúd! Criaturas Al poder.

Visita mi perfil en ResearchGate


mestebanrg

Hola kub0x,

Muchas gracias por la respuesta.

La verdad que el lenguaje que utilizo está basado en la BBDD Universe de Rocket Software y en cuestiones de encriptaciones y cifrados, no está tan avanzado como el resto de lenguajes existentes.
Una duda que tengo para generar la clave simétrica aleatoria de 128, yo estaba probando con openssl rand -base64 48 -out key.txt, pero no se si tiene sentido y verdaderamente éste comando me lo crea dicha clave con los 128 bits.

Gracias nuevamente y saludos.

kub0x

De nada hombre, aquí estamos para ayudar.

Cita de: mestebanrg en  2 Diciembre 2016, 13:43 PM
Una duda que tengo para generar la clave simétrica aleatoria de 128, yo estaba probando con openssl rand -base64 48 -out key.txt, pero no se si tiene sentido y verdaderamente éste comando me lo crea dicha clave con los 128 bits.

Ahí estás generando una clave aleatoria de 128 bits, pero sin seguir el estandar de generación de claves para cifrado simétrico, y tampoco sigues las directivas que OpenSSL recomienda en https://wiki.openssl.org/index.php/Enc . Existen clave simétricas no deseables para el cifrado, imagínate que por casualidades de la vida ese comando te generá una clave aleatoria no deseable para el cifrado :P Si guardas el Salt, podrás recuperar la clave en cualquier momento. Si cifras con la misma clave AES asegurate de generar un IV distinto. ¿Cómo se genera la clave y el IV? Pues a través de un salt + la password usando PBDKF2. En el link que te he dado arriba también verás que puedes guardarla en B64, y otras opciones que son muy útiles a la hora de trabajar con OpenSSL.

Saludos!
Viejos siempre viejos,
Ellos tienen el poder,
Y la juventud,
¡En el ataúd! Criaturas Al poder.

Visita mi perfil en ResearchGate


mestebanrg

Estupendo.

Voy a probar y te comento que tal va las encriptaciones, porque al final tengo que conseguir esto:

Result=Base64(CRSA,Kpub(Ks))

Donde Ks es la clave simétrica aleatoria de 128 bits
Kpub es la clave pública que me han dado para encriptarla con el algoritmo RSA.

Bueno, y lo mejor de todo es que con esa clave simétrica se tienen que cifrar posteriormente otros dos campos con el algoritmo AES, Modelo ECB y PKCS5Padding. Casi nada  :-(

Muchas gracias.

kub0x

Cita de: mestebanrg en  2 Diciembre 2016, 17:59 PM
Bueno, y lo mejor de todo es que con esa clave simétrica se tienen que cifrar posteriormente otros dos campos con el algoritmo AES, Modelo ECB y PKCS5Padding. Casi nada  :-(

¿Modo ECB? En serio :D Si este proyecto es para un entorno profesional (no académico) entonces olvídate de ECB por completo. Te explico el problema:

Imagina que tienes un mensaje de 512bits en un entorno ideal, así que divides el mensaje en 8 bloques de 64 bits. Imagina que el primer bloque y el segundo tienen secuencias parecidas, como ECB no concatena los bloques como otros modos de cifrado como CBC entonces comparando los dos primeros bloques ganas información, y el atacante sabría que información se repite, aunque no sepa que hay detrás de la información. Otra vulnerabilidad sería si dos mensajes distintos tienen información repetida, como un substring. El atacante podría distinguir entre ambos ciphertexts que partes se repiten.

La gracia del cifrado simétrico es que dos mismos plaintext al cifrarse sean completamente distintos, y ECB no lo consigue.

Sobre PKCS5Padding se utiliza en cifrados de bloque con tamaño de 64bit así que al cifrar por AES usaras bloques de dicho tamaño. Si tienes alguna duda con ello preguntame, ya que conozco su implementación, aunque OpenSSL u otra librería ya lo implementará de serie al cifrar.

Saludos!
Viejos siempre viejos,
Ellos tienen el poder,
Y la juventud,
¡En el ataúd! Criaturas Al poder.

Visita mi perfil en ResearchGate


mestebanrg

#6
Hola kub0x,

El proyecto consiste en crear un XML para realizar una petición SOAP.
En el Header tienen que ir una serie de etiquetas con su contenido cifrado como te he comentado y utilizan estos tipos de codificaciones y encriptaciones.
Ya te contare cuando vaya a realizarlo si todo ha ido bien, ya que el Web Service me responderá si todo está correcto.

Gracias por todo y saludos.


Hola kub0x,

Me he dado cuenta que la clave pública que me han proporcionado, no viene con formato PEM, sino viene cómo un certificado .cer.
Ahora sí que me he quedado  :o, ya que no tengo la clave privada, ni he conseguido extraer una clave pública en formato PEM, ni cifrar la clave simétrica generada aleatoriamente con el comando openssl smime.
Si me puedes echar una mano para poder cifrar con openssl y con un certificado público (.cer)

Muchas gracias de antemano.


MOD: No hacer doble post. Usa el botón modificar.

kub0x

Buenas, siento la tardanza.

No hay mucha diferencia entre cifrar con .DER o .PEM:

Citaropenssl rsautl -encrypt -keyform der -inkey id_rsa.pub.der -pubin -in key.bin -out key.bin.enc

Es el comando que puse arriba modificado para cifrar la clave simétrica AES con la pública de dentro del certificado en formato DER.

Con smime:

Citaropenssl smime -encrypt -aes256 -inform DER -in fichero_a_cifrar.extension -binary -outform DER -out fichero_cifrado.extension cert.pem

Lo que hará será generar una AES-256 aleatoria, cifrar el fichero con la AES y cifrar la AES con la pública del certificado. Para descifrar basta con:

Citaropenssl smime -decrypt -in fichero_cifrado.extension -inform DER -inkey tu_privada.pem -out fichero_en_plano.extension

He testeado OpenSSL sMIME generando claves en .DER desde cero y puedo decir que funciona 100%.

Saludos!
Viejos siempre viejos,
Ellos tienen el poder,
Y la juventud,
¡En el ataúd! Criaturas Al poder.

Visita mi perfil en ResearchGate