Comment crypter des messages / texts avec RSA et OpenSSL?

J'ai la key publique d'Alice. Je veux envoyer à Alice un message chiffré RSA. Comment puis-je le faire en utilisant la command openssl ?

Le message est:

Salut Alice! S'il vous plaît apporter malacpörkölt pour le dîner!

Dans le manuel openssl (page de manuel openssl ), searchz RSA , et vous verrez que la command pour le chiffrement RSA est rsautl . Lisez ensuite la page de manuel rsautl pour voir sa syntaxe.

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

Le schéma de remplissage par défaut est l'original PKCS # 1 v1.5 (encore utilisé dans de nombreux procotols); openssl prend également en charge le chiffrement OAEP (maintenant recommandé) et le chiffrement brut (utile uniquement dans des circonstances particulières).

Notez qu'utiliser openssl directement est principalement un exercice. En pratique, vous utiliseriez un outil tel que gpg (qui utilise RSA, mais pas directement pour crypter le message).

Tout d'abord, si vous voulez juste un bon encryption, vous devriez regarder GnuPG . Mais si vous expérimentez et que vous voulez juste apprendre comment cela fonctionne, vous devez comprendre ce qu'est le RSA . RSA n'est pas conçu pour chiffrer une string arbitraire, c'est un algorithm qui chiffre un entier. Spécifiquement, un entier de 0 à n-1 où n est la valeur de module de la key publique. Lorsque vous parlez d'une key RSA de 1024 bits, cela signifie qu'il faut 1024 bits pour stocker le module en binary. C'est l'une des raisons, RSA est utilisé en combinaison avec un chiffre de key symésortingque comme DES ou AES . Vous pouvez générer une key random 256 bits pour AES et chiffrer cette key avec une key publique RSA 1024 bits. Ensuite, toute personne qui accède à la key privée peut extraire la key symésortingque et décoder le message avec AES. Le standard complet pour RSA s'appelle PKCS # 1

De plus, DES et AES sont des chiffrements de blocs. Ils chiffrent uniquement datatables en bloc d'une taille spécifique. Le DES utilise des blocs de 64 bits et AES utilise des blocs de 128 bits. Pour chiffrer plus d'un bloc, vous devez utiliser un mode de fonctionnement tel que CBC ou CTR. Ces modes spécifient comment chiffrer un stream de bits en utilisant un chiffrement en mode bloc.

Enfin, il est important de vérifier datatables que vous recevez. Bien qu'un attaquant puisse ne pas être capable de lire datatables en transit, il peut être capable de returnner des bits sans détection si aucune intégrité ou authenticité n'est appliquée au stream de données. Un attaquant peut facilement deviner qu'une connection SSL au port 443 est probablement une requête de page Web commençant par GET / et il pourrait basculer le bit en le changeant en PUT / sans interférer avec le rest du encryption. Une approche simple de l'intégrité consiste à append une sum MD5 ou SHA-1 à la fin, mais qui ne fournit que l'intégrité des données et non l'authenticité des données. Toute personne ayant une connaissance complète du stream de données peut générer une sum correcte, une approche plus sécurisée consiste à utiliser un hachage à key comme HMAC qui nécessite la connaissance d'une key secrète à générer fournissant ainsi l'authenticité des données en plus de l'intégrité.

Dans la partie ci-dessous, notez que vous pouvez spécifier n'importe quel algorithm que vous voulez, que ce soit ceux listés ou RSA (bien que je ne connaisse pas le nom exact utilisé pour RSA par OpenSSL)

utilisez "openssl enc -help" pour get une list des chiffrements pris en charge sur votre système, et transmettez-la comme argument. Par exemple, "-aes256"

Note sur mon système Je n'ai pas RSA dans mes options – au less par ce nom.


Comment chiffrer un message S / MIME?

Disons que quelqu'un vous envoie son certificate public et vous request de lui chiffrer un message. Vous avez enregistré son certificate comme son-cert.pem. Vous avez enregistré votre réponse sous le nom my-message.txt.

Pour get le chiffrement RC2-40 par défaut, mais assez faible, il suffit de dire openssl où se trouvent le message et le certificate.

openssl smime her-cert.pem -encrypt -dans mon-message.txt

Si vous êtes certain que votre correspondant distant dispose d'une boîte à outils SSL robuste, vous pouvez spécifier un algorithm de encryption plus fort comme le sortingple DES:

openssl smime her-cert.pem -encrypt -des3 -dans mon-message.txt

Par défaut, le message crypté, y compris les en-têtes de courrier, est envoyé à la sortie standard. Utilisez l'option -out ou votre shell pour le redirect vers un file. Ou, beaucoup plus délicat, canaliser la sortie directement vers 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 

Comment signer un message S / MIME?

Si vous n'avez pas besoin de crypter l'intégralité du message, mais que vous souhaitez le signer afin que votre destinataire puisse être assuré de l'intégrité du message, la recette est similaire à celle du encryption. La principale différence est que vous devez avoir votre propre key et certificate, puisque vous ne pouvez rien signer avec le certificate du destinataire.

  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 

(à partir de http://www.madboa.com/geek/openssl/ )

(eh … toutes ces backslashes – ceux-ci sont censés être échappés newline. pas sûr de ce qui se passe, car il affiche bien dans ma boîte d'édition ici!