Come crittografare messaggi / testo con RSA e OpenSSL?


29

Ho la chiave pubblica di Alice. Voglio inviare ad Alice un messaggio crittografato RSA. Come posso farlo usando il opensslcomando?

Il messaggio è:

Ciao alice! Si prega di portare Malacpörkölt per cena!

Risposte:


36

Nel manuale di openssl ( opensslpagina man), cerca RSAe vedrai che il comando per la crittografia RSA è rsautl. Quindi leggi la rsautlpagina man per vedere la sua sintassi.

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

Lo schema di imbottitura predefinito è l'originale PKCS # 1 v1.5 (ancora usato in molti procotoli); openssl supporta anche OAEP (ora consigliato) e crittografia grezza (utile solo in circostanze speciali).

Nota che usare openssl direttamente è principalmente un esercizio. In pratica, useresti uno strumento come gpg (che usa RSA, ma non direttamente per crittografare il messaggio).


Qual è il problema con l'utilizzo openssl?
Bratchley,

2
@Bratchley Lo opensslstrumento da riga di comando è una combinazione di diversi comandi. Alcuni, principalmente quelli che manipolano i certificati, possono essere utili, ma sono difficili da usare correttamente perché la loro sintassi e parametri sono bizzarri. Alcuni, ad esempio rsautl, vanno bene, ma non forniscono funzionalità utili, espongono solo primitive crittografiche grezze - ad esempio la crittografia RSA è praticamente utilizzata solo per crittografare una chiave simmetrica per la crittografia ibrida. Alcuni, come enc, sono molto difficili da usare in sicurezza e il mondo sarebbe meglio se non esistessero.
Gilles 'SO- smetti di essere malvagio' il

Bella risposta. Ho aggiunto il riempimento con questo flag -oaep Quindi su decrypt, specifica lo stesso ... openssl rsautl -decrypt -in message.encrypted -inkey private_key.pem -oaep
rustyMagnet

24

Innanzitutto, se vuoi solo una buona crittografia, dovresti guardare GnuPG . Ma se stai sperimentando e vuoi solo imparare come funziona, devi capire cos'è RSA . RSA non è progettato per crittografare qualsiasi stringa arbitraria, è un algoritmo che crittografa un numero intero. In particolare, un numero intero compreso tra 0 e n-1 dove n è il valore del modulo della chiave pubblica. Quando si parla di una chiave RSA di 1024 bit, ciò significa che sono necessari 1024 bit per memorizzare il modulo in binario. Questo è uno dei motivi, RSA viene utilizzato in combinazione con un codice di chiave simmetrica come DES o AES. È possibile generare una chiave casuale a 256 bit per AES e crittografarla con una chiave pubblica RSA a 1024 bit. Quindi chiunque abbia accesso alla chiave privata può estrarre la chiave simmetrica e decodificare il messaggio con AES. Lo standard completo per RSA si chiama PKCS # 1

Inoltre, DES e AES sono cifre di blocco. Crittografano i dati solo in blocchi di dimensioni specifiche. DES utilizza blocchi a 64 bit e AES utilizza blocchi a 128 bit. Per crittografare più di un blocco, è necessario utilizzare una Modalità operativa come CBC o CTR. Queste modalità specificano come crittografare un flusso di bit usando una cifra in modalità blocco.

Infine, è importante verificare i dati che stai ricevendo. Mentre un utente malintenzionato potrebbe non essere in grado di leggere i dati in transito, potrebbe essere in grado di capovolgere i bit senza essere rilevato se non viene applicata integrità o autenticità al flusso di dati. Un utente malintenzionato può facilmente intuire che una connessione SSL alla porta 443 è probabilmente una richiesta di pagina Web che inizia con GET /e potrebbe capovolgere il bit cambiandolo PUT /senza interferire con il resto della crittografia. Un semplice approccio all'integrità è quello di aggiungere una somma MD5 o SHA-1 alla fine, ma che fornisce solo integrità dei dati, non autenticità dei dati. Chiunque abbia una conoscenza completa del flusso di dati può generare una somma corretta, un approccio più sicuro consiste nell'utilizzare un hash con chiave come HMAC che richiede la conoscenza di una chiave segreta da generare, fornendo quindi autenticità dei dati oltre all'integrità.


2
Questo è davvero buono
mko

5

Nel seguito, nota che puoi specificare qualunque algoritmo tu voglia, sia quello elencato o RSA (anche se non conosco il nome esatto usato per RSA da OpenSSL)

usa "openssl enc -help" per ottenere un elenco di cifre supportate sul tuo sistema e passalo come argomento. ad es. "-aes256"

Nota sul mio sistema Non ho RSA tra le mie opzioni - almeno con quel nome.


Come crittografare un messaggio S / MIME?

Diciamo che qualcuno ti manda il suo certificato pubblico e ti chiede di crittografare un messaggio per lei. Hai salvato il suo certificato come her-cert.pem. Hai salvato la tua risposta come my-message.txt.

Per ottenere la crittografia predefinita, sebbene abbastanza debole, RC2-40, basta dire a openssl dove si trovano il messaggio e il certificato.

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

Se sei abbastanza sicuro che il tuo corrispondente remoto abbia un robusto toolkit SSL, puoi specificare un algoritmo di crittografia più forte come il triplo DES:

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

Per impostazione predefinita, il messaggio crittografato, comprese le intestazioni della posta, viene inviato all'output standard. Utilizzare l'opzione -out o la shell per reindirizzarla a un file. O, molto più complicato, reindirizza l'output direttamente a sendmail.

openssl smime her-cert.pem \
   -encrypt \
   -des3 \
   -in my-message.txt \
   -from 'Your Fullname <you@youraddress.com>' \
   -to 'Her Fullname <her@heraddress.com>' \
   -subject 'My encrypted reply' |\
 sendmail her@heraddress.com

Come posso firmare un messaggio S / MIME?

Se non è necessario crittografare l'intero messaggio, ma si desidera firmarlo in modo che al destinatario sia garantita l'integrità del messaggio, la ricetta è simile a quella per la crittografia. La differenza principale è che devi avere la tua chiave e il tuo certificato, poiché non puoi firmare nulla con il certificato del destinatario.

 openssl smime \
   -sign \
   -signer /path/to/your-cert.pem \
   -in my-message.txt \
   -from 'Your Fullname <you@youraddress.com>' \
   -to 'Her Fullname <her@heraddress.com>' \
   -subject 'My signed reply' |\
 sendmail her@heraddress.com

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

(ehm ... tutte quelle barre rovesciate - quelle che dovrebbero essere evase newline. Non sono sicuro di cosa stia succedendo, dato che appare bene nella mia casella di modifica qui!


1
È necessario inserire quattro spazi all'inizio di ogni riga per preservare le nuove righe. Ho modificato il primo blocco per mostrarti come. Puoi sistemare il secondo?
Mikel,

1
Non hai trovato RSA openssl encperché encè solo per la crittografia simmetrica. Sì, le opzioni di openssl non sono molto ben organizzate. Gli algoritmi asimmetrici hanno i loro comandi: rsa/ dsa/ dhper manipolare le chiavi, rsautl/ dsautlper crittografare / decrittografare / verificare / firmare e genrsa/ gendsa/ gendhper generare chiavi.
Gilles 'SO- smetti di essere malvagio' il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.