Tengo la clave pública de Alice. Quiero enviarle a Alice un mensaje cifrado RSA. ¿Cómo puedo hacerlo usando el openssl
comando?
El mensaje es:
¡Hola Alice! Por favor traiga malacpörkölt para la cena!
fuente
Tengo la clave pública de Alice. Quiero enviarle a Alice un mensaje cifrado RSA. ¿Cómo puedo hacerlo usando el openssl
comando?
El mensaje es:
¡Hola Alice! Por favor traiga malacpörkölt para la cena!
En el manual de openssl ( openssl
página man), busque RSA
y verá que el comando para el cifrado RSA es rsautl
. Luego lea la rsautl
pá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).
openssl
?openssl
herramienta 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, comorsautl
, 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, comoenc
, son muy difíciles de usar de forma segura y el mundo estaría mejor si no existieran.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 pocoPUT /
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 integridadfuente
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.
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:
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.
¿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.
(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í!
fuente
openssl enc
porqueenc
es 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
/dh
para manipular claves,rsautl
/dsautl
para cifrar / descifrar / verificar / firmar, ygenrsa
/gendsa
/gendh
para generar claves.