¿Cómo cifrar mensajes / texto con RSA y OpenSSL?

29

Tengo la clave pública de Alice. Quiero enviarle a Alice un mensaje cifrado RSA. ¿Cómo puedo hacerlo usando el opensslcomando?

El mensaje es:

¡Hola Alice! Por favor traiga malacpörkölt para la cena!

LanceBaynes
fuente

Respuestas:

36

En el manual de openssl ( opensslpágina man), busque RSAy verá que el comando para el cifrado RSA es rsautl. Luego lea la rsautlpágina del manual para ver su sintaxis.

echo 'Hi Alice! Please bring malacpörkölt for dinner!' |
openssl rsautl -encrypt -pubin -inkey alice.pub >message.encrypted

El esquema de relleno predeterminado es el PKCS # 1 original v1.5 (todavía se usa en muchos protocolos); openssl también es compatible con OAEP (ahora recomendado) y cifrado sin formato (solo útil en circunstancias especiales).

Tenga en cuenta que usar openssl directamente es principalmente un ejercicio. En la práctica, usaría una herramienta como gpg (que usa RSA, pero no directamente para cifrar el mensaje).

Gilles 'SO- deja de ser malvado'
fuente
¿Cuál es el problema con el uso openssl?
Bratchley
2
@Bratchley La opensslherramienta de línea de comandos es una mezcla de diferentes comandos. Algunos, principalmente los que manipulan certificados, pueden ser útiles, pero son difíciles de usar correctamente porque su sintaxis y parámetros son extravagantes. Algunos, como rsautl, están bien, pero no proporcionan una funcionalidad útil, solo exponen primitivas criptográficas sin procesar; por ejemplo, el cifrado RSA se usa prácticamente para cifrar una clave simétrica para el cifrado híbrido. Algunos, como enc, son muy difíciles de usar de forma segura y el mundo estaría mejor si no existieran.
Gilles 'SO- deja de ser malvado'
Gran respuesta. Agregué relleno con esta bandera -oaep Luego, en descifrar, especifique lo mismo ... openssl rsautl -decrypt -in message.encrypted -inkey private_key.pem -oaep
rustyMagnet
24

Primero, si solo quieres un buen cifrado, deberías mirar a GnuPG . Pero si está experimentando y solo quiere aprender cómo funciona, debe comprender qué es RSA . RSA no está diseñado para cifrar ninguna cadena arbitraria, es un algoritmo que cifra un número entero. Específicamente, un entero de 0 a n-1 donde n es el valor del módulo de la clave pública. Cuando habla de una clave RSA de 1024 bits, eso significa que se necesitan 1024 bits para almacenar el módulo en binario. Esta es una de las razones, RSA se utiliza en combinación con un cifrado de clave simétrica como DES o AES. Puede generar una clave aleatoria de 256 bits para AES y cifrar esa clave con una clave pública RSA de 1024 bits. Entonces, cualquiera que acceda a la clave privada puede extraer la clave simétrica y decodificar el mensaje con AES. El estándar completo para RSA se llama PKCS # 1

Además, DES y AES son cifras en bloque. Solo encriptan datos en bloque de un tamaño específico. DES usa bloques de 64 bits y AES usa bloques de 128 bits. Para cifrar más de un bloque, debe usar un modo de operación como CBC o CTR. Estos modos especifican cómo cifrar una secuencia de bits utilizando un cifrado en modo de bloque.

Por último, es importante verificar los datos que está recibiendo. Si bien es posible que un atacante no pueda leer datos en tránsito, puede voltear bits sin detección si no se aplica integridad o autenticidad al flujo de datos. Un atacante puede adivinar fácilmente que una conexión SSL al puerto 443 es probablemente una solicitud de página web que comienza GET /y podría cambiar un poco PUT /sin interferir con el resto del cifrado. Un enfoque simple para la integridad es agregar una suma MD5 o SHA-1 al final, pero eso solo proporciona integridad de datos, no autenticidad de datos. Cualquier persona con un conocimiento completo del flujo de datos puede generar una suma correcta, un enfoque más seguro es usar un hash con clave como HMAC que requiere el conocimiento de una clave secreta para generar, proporcionando así autenticidad de datos además de integridad

pingüino359
fuente
2
Esto es realmente bueno
mko
5

En el siguiente, tenga en cuenta que puede especificar el algoritmo que desee, ya sean los enumerados o RSA (aunque no sé el nombre exacto utilizado por OpenSSL para RSA)

use "openssl enc -help" para obtener una lista de cifrados compatibles en su sistema, y ​​pásela como argumento. por ejemplo, "-aes256"

Tenga en cuenta que en mi sistema no tengo RSA en mis opciones, al menos con ese nombre.


¿Cómo cifro un mensaje S / MIME?

Digamos que alguien le envía su certificado público y le pide que cifre algún mensaje para ella. Has guardado su certificado como her-cert.pem. Has guardado tu respuesta como my-message.txt.

Para obtener el cifrado RC2-40 predeterminado, aunque bastante débil, simplemente diga a openssl dónde se encuentran el mensaje y el certificado.

openssl smime her-cert.pem -encrypt -in my-message.txt

Si está seguro de que su corresponsal remoto tiene un sólido kit de herramientas SSL, puede especificar un algoritmo de cifrado más fuerte como el triple DES:

openssl smime her-cert.pem -encrypt -des3 -in my-message.txt

De forma predeterminada, el mensaje cifrado, incluidos los encabezados de correo, se envía a la salida estándar. Use la opción -out o su shell para redirigirlo a un archivo. O, mucho más complicado, canalice la salida directamente a sendmail.

openssl smime her-cert.pem \
   -encrypt \
   -des3 \
   -in my-message.txt \
   -from 'Your Fullname <[email protected]>' \
   -to 'Her Fullname <[email protected]>' \
   -subject 'My encrypted reply' |\
 sendmail [email protected]

¿Cómo firmo un mensaje S / MIME?

Si no necesita cifrar todo el mensaje, pero desea firmarlo para que su destinatario pueda estar seguro de la integridad del mensaje, la receta es similar a la del cifrado. La principal diferencia es que debe tener su propia clave y certificado, ya que no puede firmar nada con el certificado del destinatario.

 openssl smime \
   -sign \
   -signer /path/to/your-cert.pem \
   -in my-message.txt \
   -from 'Your Fullname <[email protected]>' \
   -to 'Her Fullname <[email protected]>' \
   -subject 'My signed reply' |\
 sendmail [email protected]

(de http://www.madboa.com/geek/openssl/ )

(er ... todas esas barras diagonales inversas: se supone que son líneas nuevas escapadas. No estoy seguro de lo que está sucediendo, ¡ya que se muestra bien en mi cuadro de edición aquí!

draeath
fuente
1
Debe poner cuatro espacios al comienzo de cada línea para preservar las nuevas líneas. Cambié el primer bloque para mostrarte cómo. ¿Puedes arreglar el segundo?
Mikel
1
No encontró RSA openssl encporque ences solo para cifrado simétrico. Sí, las opciones de openssl no están muy bien organizadas. Los algoritmos asimétricos tienen sus propios comandos: rsa/ dsa/ dhpara manipular claves, rsautl/ dsautlpara cifrar / descifrar / verificar / firmar, y genrsa/ gendsa/ gendhpara generar claves.
Gilles 'SO- deja de ser malvado'