Cómo usar la clave pública en ~ / .ssh para el cifrado asimétrico con OpenSSL

1

Quiero hacer un cifrado de archivo asimétrico:

openssl genrsa -des3 -out private.key 4096
openssl rsa -in private.key -pubout -out public.key
openssl rsautl -encrypt -pubin -inkey public.key -in a -out b

Pero ya tengo un par de claves en mi directorio ~/.ssh , entonces, ¿cómo uso esto en lugar de generar nuevas claves? Simplemente cambiar los nombres de archivo da un error:

$ openssl rsautl -encrypt -pubin -inkey ~/.ssh/id_rsa.pub -in a -out b
unable to load Public Key

public.key comienza con BEGIN PUBLIC KEY , mientras que ~/.ssh/id_rsa.pub comienza con ssh-rsa , así que creo que es un problema de formato.

¿Cómo puedo generar una clave ~/.ssh que openssl entiende, o cómo puedo indicar a openssl que entienda las claves que tengo en ~/.ssh ?

    
pregunta forthrin 29.05.2013 - 16:37
fuente

3 respuestas

2

¡Esa clave RSA es para autenticación, no para cifrado! No debe usar pares de claves de autenticación para el cifrado (si literalmente quiere decir extraer la clave ssh para almacenar datos cifrados, en lugar de compartir el par de claves con un certificado X509); Debido a que las operaciones públicas y privadas o RSA conmutan. Por ejemplo, si usa la misma clave para ambos:

  • cifrar = verificar = público
  • descifrar = signo = privado
  • public * private = private * public = 1

Esta secuencia incluye el par de claves de cifrado y firma de Alices:

  • Bob a Alice: "aquí hay un mensaje secreto": secretMsg: = message * public
  • Eva a Alicia: "por favor, firma esto por mí": secretMsg
  • Alice to Eve: "okey dokey": toEve: signed: = secretMsg * private
  • Eva:
    • firmado
    • secretMsg * private
    • (mensaje * público) * privado
    • mensaje * (público * privado)
    • mensaje * 1
    • mensaje

Eve recibió el texto en claro de un mensaje que se envió cifrado a Alice. No es exactamente así de simple debido a los formatos; pero es bien sabido que los pares de llaves son para la firma / identidad o para el cifrado, pero no deben utilizarse para ambos usos.

    
respondido por el Rob 08.05.2015 - 20:38
fuente
0

Puede convertir su clave ssh existente a PKCS # 8 con lo siguiente:

mv ~/.ssh/id_rsa{,.old}
umask 0077
openssl pkcs8 -topk8 -v2 des3 -in ~/.ssh/id_rsa.old -out ~/.ssh/id_rsa

Después de probar la clave convertida, puede eliminar el original.

fuente

    
respondido por el demure 29.05.2013 - 16:41
fuente
0

Puede convertir su clave pública SSH (id_rsa.pub) en un archivo de clave pública PEM con el siguiente script de Python (cribbed from esta publicación de blog ):

#!/usr/bin/python

# usage: sshpub2pem.py id_rsa.pub > id_rsa.pub.pem

import sys, base64, struct
from pyasn1.type import univ
from pyasn1.codec.der import encoder as der_encoder

keydata = base64.b64decode(
    open(sys.argv[1]).readlines()[0].split()[1])

parts = []
while keydata:
    dlen = struct.unpack('>I', keydata[:4])[0]
    data, keydata = keydata[4:dlen+4], keydata[4+dlen:]
    parts.append(data)

e_val = long(parts[1].encode('hex'), 16)
n_val = long(parts[2].encode('hex'), 16)

pkcs1_seq = univ.Sequence()
pkcs1_seq.setComponentByPosition(0, univ.Integer(n_val))
pkcs1_seq.setComponentByPosition(1, univ.Integer(e_val))
pkcs1_val = der_encoder.encode(pkcs1_seq)

head_seq = univ.Sequence()
head_seq.setComponentByPosition(0, univ.ObjectIdentifier('1.2.840.113549.1.1.1'))
head_seq.setComponentByPosition(1, univ.Null(''))

out_seq = univ.Sequence()
out_seq.setComponentByPosition(0, head_seq)
out_seq.setComponentByPosition(1, univ.BitString("'%s'H" % pkcs1_val.encode('hex')))

print '-----BEGIN PUBLIC KEY-----'
print base64.encodestring(der_encoder.encode(out_seq)).strip()
print '-----END PUBLIC KEY-----'

Con id_rsa.pub.pem, deberías poder ejecutar

openssl rsautl -encrypt -pubin -inkey ~/.ssh/id_rsa.pub.pem -in sensitive-data -out encrypted-data

y descifrar con

openssl rsautl -decrypt -inkey ~/.ssh/id_rsa -in encrypted-data -out sensitive-data
    
respondido por el kgutwin 08.05.2015 - 20:07
fuente

Lea otras preguntas en las etiquetas