Come utilizzare la chiave pubblica in ~ / .ssh per la crittografia asimmetrica con OpenSSL

1

Voglio fare una crittografia di file asimmetrica:

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

Ma ho già una coppia di chiavi nella mia directory ~/.ssh , quindi come faccio a usare questo invece di generare nuove chiavi? Cambiare semplicemente i nomi dei file dà un errore:

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

public.key inizia con BEGIN PUBLIC KEY mentre ~/.ssh/id_rsa.pub inizia con ssh-rsa , quindi immagino sia una sorta di problema di formato.

Come posso generare una ~/.ssh chiave che openssl capisce, o come posso istruire openssl a capire le chiavi che ho in ~/.ssh ?

    
posta forthrin 29.05.2013 - 16:37
fonte

3 risposte

2

Quella chiave RSA è per l'autenticazione, non per la crittografia! Non utilizzare coppie di chiavi di autenticazione per la crittografia (se si intende letteralmente estrarre la chiave ssh per memorizzare i dati crittografati, piuttosto che condividere la coppia di chiavi con un certificato X509); perché le operazioni pubbliche e private o RSA commutare. Ad esempio, se si utilizza la stessa chiave per entrambi:

  • encrypt = verify = public
  • decrypt = sign = private
  • public * private = private * public = 1

Questa sequenza include la coppia di chiavi di firma e crittografia di Alices:

  • Da Bob a Alice: "ecco un messaggio segreto": secretMsg: = message * public
  • Eve ad Alice: "per favore firmami per me": secretMsg
  • Alice to Eve: "okey dokey": toEve: firmato: = secretMsg * privato
  • Eve:
    • firmato
    • secretMsg * private
    • (messaggio * pubblico) * privato
    • messaggio * (pubblico * privato)
    • messaggio * 1
    • Messaggio

Eve ha ottenuto il testo in chiaro di un messaggio che è stato inviato crittografato ad Alice. Non è esattamente così semplice a causa dei formati; ma è risaputo che i keypair sono per la firma / identità o per la crittografia, ma non dovrebbero essere usati per entrambi gli usi.

    
risposta data 08.05.2015 - 20:38
fonte
0

Puoi convertire la tua chiave ssh esistente in PKCS # 8 con quanto segue:

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

Dopo aver testato la chiave convertita, puoi eliminare l'originale.

source

    
risposta data 29.05.2013 - 16:41
fonte
0

Puoi convertire la tua chiave pubblica SSH (id_rsa.pub) in un file chiave pubblica PEM con il seguente script Python (cribbed from questo post del 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, dovresti essere in grado di eseguire

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

e decifrare con

openssl rsautl -decrypt -inkey ~/.ssh/id_rsa -in encrypted-data -out sensitive-data
    
risposta data 08.05.2015 - 20:07
fonte

Leggi altre domande sui tag