¿Cómo usar la clave pública ssh-rsa para cifrar un texto?

55

Entonces, el escenario es: dado que soy Bob, quiero encriptar algún mensaje para Alice. La única clave pública que tengo es su ssh-rsaid_rsa.pub así:

ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAyb + qaZLwgC7KAQJzYikf3XtOWuhlMXVv2mbTKa5dp0sHPRd2RaYnH8ZRkt7V8bjqct1IHGCuxI8xyoEp4at3FHe6j9RfWiarc1ldLUCmTtryI0GGpRs6Zpvqdtpcq / 1NCIYtUQAvsImyEFCtqmB2suDo1ZSllZQ0x9TCKHdCANYIOeaniuFzR57POgE3vxk / r6PO24oy8BIWqxvi29r0n1LUigVBJ7CmMHuzb4 / + i1v6PxV1Lqnj6osPP9GpXpsh8kLUCby / KcmcryWNdSP0esyCdDxkA5hlIuk8qL1vzsyPluUQuc0BEHu6nuw8WQlCF1mFFxcpJL + MhWEr01WIIw == [email protected]

Entonces, ¿hay alguna manera de cifrar una cadena usando esta clave pública para que pueda usar su clave privada de id_rsa(generada desde ssh-keygen) para descifrar el mensaje?

(Sé que es posible de inmediato si está utilizando .pemun archivo de par de claves. Si puede mostrarme cómo convertir esto al formato opensslcompatible, ¡también sería genial!)

¡Gracias!

sikachu
fuente
55
Tú y Alice realmente deberían investigar gpg ... gnupg.org ; D
tink
44
Jajaja, de hecho! Sin embargo, el escenario que tengo aquí es que ya tengo acceso a su ssh-rsaclave pública, y no quiero agregar otra capa de complejidad (como pedirle al destinatario que instale gpg, etc.)
sikachu

Respuestas:

71

Es posible convertir su clave pública ssh a formato PEM (que 'openssl rsautl' puede leerla):

Ejemplo:

ssh-keygen -f ~/.ssh/id_rsa.pub -e -m PKCS8 > id_rsa.pem.pub

Suponiendo que 'myMessage.txt' es su mensaje, que debe estar cifrado con clave pública.

Luego, encripte su mensaje con openssl rsautl y su clave pública PEM convertida como lo haría normalmente:

openssl rsautl -encrypt -pubin -inkey id_rsa.pem.pub -ssl -in myMessage.txt -out myEncryptedMessage.txt

El resultado es su mensaje cifrado en 'myEncryptedMessage.txt'

Para probar su trabajo para descifrar con la clave privada de Alice:

openssl rsautl -decrypt -inkey ~/.ssh/id_rsa -in myEncryptedMessage.txt -out myDecryptedMessage.txt
Dirk Thannhäuser
fuente
55
Terminé esto en un script que extrae la clave pública de los usuarios de GitHub. github.com/twe4ked/catacomb
twe4ked
Esto no funciona para mi. Mi ssh-keygenno tiene una -mopción. (No puedo entender cómo pedirle a ssh-keygen su versión). Reemplazar -mcon -ttrabajos, pero luego opensslme dice "no se puede cargar la clave pública". Ver stackoverflow.com/questions/18285294/… .
Jason Gross
1
El mismo problema que Jason tiene en MaxOS Mavericks. Reemplazado -m con -t para la generación de claves habilitada por keygen.
Robert Christian
8
Tenga en cuenta que esto solo funciona si el archivo es lo suficientemente pequeño. Por ejemplo, 200 bytes. Ver stackoverflow.com/questions/7143514/…
h__
1
Haciéndose eco de lo que dijo @hyh, esto funciona solo si el archivo de entrada es pequeño (la línea es de alrededor de 254 bytes, de lo contrario dará "rutinas rsa: RSA_padding_add_SSLv23: datos demasiado grandes para el tamaño de la clave: /SourceCache/OpenSSL098/OpenSSL098-52.20. 2 / src / crypto / rsa / rsa_ssl.c: error de 73 ".
Devy
1

Intente con ssh-vault , utiliza las claves públicas ssh-rsa para cifrar "crear una bóveda" y la clave privada ssh-rsa para descifrar "ver contenido de la bóveda"

nbari
fuente
-3

¿Por qué no hacer esto de la manera súper obvia que no requiere rodar su propia criptografía?

Alice se envía a [email protected], que está configurada para permitir solo la autenticación de clave pública para la cuenta alice. Las propiedades de ssh aseguran que solo alice pueda autenticar. Incluso un hombre en el medio del ataque falla ya que (suponiendo que deshabilite ssh1 e insista en la configuración correcta) la comunicación inicial usando DH crea un valor conocido por Alice y Bob, pero no por ningún hombre en el medio y esto se puede usar para autenticar que ninguna respuesta o ataque MITM puede ver el contenido del comunicador.

Así que ten a Alice SFTP en tu caja y descarga el archivo.

Peter Gerdes
fuente
99
¿Cómo está usando openssl rodando su propia criptografía?
cmc
Como ejemplo, el uso de RSA para cifrar una cadena de 1024 caracteres podría fallar debido al tamaño del mensaje. Para superar este problema, el implementador se encuentra en una situación precaria, especialmente si los mensajes se repiten. Es más seguro usar RSA para cifrar una nueva clave de cifrado simétrica y un vector de inicialización que es poco probable que se repita, por lo tanto, genere un texto de cifrado único para cada mensaje enviado, y obtenga la velocidad de cifrado simétrico, y reduzca la cantidad de cifrado y texto sin formato para atacar la clave RSA con. Espero que tenga sentido. :)
Sam
Este método requiere que Bob confíe en Alice o que cierre bobserver.com para que Alice no pueda hacer nada malicioso.
mwfearnley
Es rodar el tuyo en el sentido de que Alice tiene que lanzar una cantidad considerable de operaciones inusuales para descifrar, no en el sentido de que las matemáticas subyacentes sean las tuyas. Como se preguntó en términos de utilidades de línea de comandos en lugar de una API o una perspectiva teórica, se asumió que el individuo realmente quería transferir cierta información concreta, no un nuevo protocolo además de ssh. Como tal, prácticamente sftp parecía mucho más fácil y sí, requiere mirar hacia abajo en el servidor, confiar en Alice o limpiar el servidor después.
Peter Gerdes
Me parece que en el anterior es realmente vulnerable a que alguien intercepte el correo electrónico en el que le explica a Alice exactamente cómo puede descifrar este mensaje inusual y darle una secuencia de comandos que en su lugar descifran con seguridad el mensaje MITM de Charlie (los comandos openssl son como magia encantamientos para la mayoría) mientras que la idea del servidor evita todo esto a favor de los comandos estándar con los que muchos están familiarizados y si Bob lo ejecuta desde la computadora en la que está encriptando, de todos modos está confiando. Obviamente, la mejor respuesta depende del modelo de amenaza, pero desde el contexto q esto probablemente les sirva mejor.
Peter Gerdes