it-swarm.it

Come crittografare messaggi / testo con RSA e OpenSSL?

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

Il messaggio è:

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

29
LanceBaynes

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

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

L'impostazione predefinita schema di riempimento è l'originale PKCS # 1 v1.5 (ancora usato in molti procotoli); openssl supporta anche OAEP (ora consigliato) e crittografia raw (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).

Innanzitutto, se vuoi solo una buona crittografia, dovresti guardare GnuPG . Ma se stai sperimentando e vuoi solo imparare come funziona, devi capire cosa è RSA . RSA non è progettato per crittografare alcuna 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 simmetrico 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 cifrature a blocchi. Crittografano solo i dati in blocchi di dimensioni specifiche. DES utilizza blocchi a 64 bit e AES utilizza 128 bit Per crittografare più di un blocco, è necessario utilizzare un Mode of Operation come CBC o CTR. Queste modalità specificano come crittografare un flusso di bit usando un codice 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 capovolgerlo cambiandolo in 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 un chiave segreta da generare fornendo quindi autenticità dei dati oltre all'integrità.

25
penguin359

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 nelle mie opzioni - almeno con quel nome.


Come crittografare un messaggio S/MIME?

Supponiamo che qualcuno ti mandi il suo certificato pubblico e ti chieda 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 Shell per reindirizzarlo 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 <[email protected]>' \
   -to 'Her Fullname <[email protected]>' \
   -subject 'My encrypted reply' |\
 sendmail [email protected]

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 <[email protected]>' \
   -to 'Her Fullname <[email protected]>' \
   -subject 'My signed reply' |\
 sendmail [email protected]

(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!

5
draeath