Comment crypter des messages / textes avec RSA & OpenSSL?


29

J'ai la clé publique d'Alice. Je veux envoyer à Alice un message crypté RSA. Comment puis-je le faire en utilisant la opensslcommande?

Le message est:

Salut Alice! Veuillez apporter malacpörkölt pour le dîner!

Réponses:


36

Dans le manuel openssl ( opensslpage de manuel ), recherchez RSAet vous verrez que la commande de chiffrement RSA est rsautl. Lisez ensuite la rsautlpage de manuel 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 le PKCS # 1 v1.5 d'origine (toujours utilisé dans de nombreux procotols); openssl prend également en charge OAEP (maintenant recommandé) et le chiffrement brut (uniquement utile dans des circonstances spéciales).

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).


Quel est le problème avec l'utilisation openssl?
Bratchley

2
@Bratchley L' openssloutil de ligne de commande est un mélange de différentes commandes. Certains, principalement ceux qui manipulent des certificats, peuvent être utiles, mais sont difficiles à utiliser correctement car leur syntaxe et leurs paramètres sont originaux. Certains, comme rsautl, sont très bien mais ne fournissent pas de fonctionnalités utiles, ils exposent simplement des primitives cryptographiques brutes - par exemple, le cryptage RSA est à peu près uniquement utilisé pour crypter une clé symétrique pour le cryptage hybride. Certains, comme enc, sont très difficiles à utiliser en toute sécurité et le monde serait mieux s'ils n'existaient pas.
Gilles 'SO- arrête d'être méchant'

Très bonne réponse. J'ai ajouté un rembourrage avec ce drapeau -oaep Puis lors du décryptage, spécifiez le même ... openssl rsautl -decrypt -in message.encrypted -inkey private_key.pem -oaep
rustyMagnet

24

Tout d'abord, si vous voulez juste un bon chiffrement, vous devriez regarder GnuPG . Mais si vous expérimentez et que vous voulez simplement savoir comment cela fonctionne, vous devez comprendre ce qu'est le RSA . RSA n'est pas conçu pour crypter une chaîne arbitraire, c'est un algorithme qui crypte un entier. Plus précisément, un entier de 0 à n-1 où n est la valeur de module de la clé publique. Lorsque vous parlez d'une clé RSA de 1024 bits, cela signifie qu'il faut 1024 bits pour stocker le module en binaire. C'est l'une des raisons, RSA est utilisé en combinaison avec un chiffrement à clé symétrique comme DES ou AES. Vous pouvez générer une clé aléatoire de 256 bits pour AES et chiffrer cette clé avec une clé publique RSA de 1024 bits. Ensuite, toute personne ayant accès à la clé privée peut extraire la clé symétrique et décoder le message avec AES. La norme complète pour RSA est appelée PKCS # 1

De plus, DES et AES sont des chiffrements par blocs. Ils ne chiffrent que les données en bloc d'une taille spécifique. DES utilise des blocs 64 bits et AES utilise des blocs 128 bits. Pour chiffrer plus d'un bloc, vous devez utiliser un mode de fonctionnement comme CBC ou CTR. Ces modes spécifient comment chiffrer un flux de bits à l'aide d'un chiffrement en mode bloc.

Enfin, il est important de vérifier les données que vous recevez. Bien qu'un attaquant puisse ne pas être en mesure de lire des données en transit, il peut être capable de retourner des bits sans détection si aucune intégrité ou authenticité n'est appliquée au flux de données. Un attaquant peut facilement deviner qu'une connexion SSL au port 443 est probablement une demande de page Web commençant par GET /et il pourrait inverser le bit en le modifiant PUT /sans interférer avec le reste du cryptage. Une approche simple de l'intégrité consiste à ajouter une somme MD5 ou SHA-1 à la fin, mais qui ne fournit que l'intégrité des données, pas l'authenticité des données. Toute personne ayant une connaissance complète du flux de données peut générer une somme correcte, une approche plus sécurisée consiste à utiliser un hachage à clé comme HMAC ce qui nécessite la connaissance d'une clé secrète pour générer, fournissant ainsi l'authenticité des données en plus de l'intégrité.


2
C'est vraiment bien
mko

5

Dans ce qui suit, notez que vous pouvez spécifier l'algorithme que vous voulez, que ce soit ceux répertoriés ou RSA (bien que je ne connaisse pas le nom exact utilisé pour RSA par OpenSSL)

utilisez "openssl enc -help" pour obtenir une liste des chiffrements pris en charge sur votre système, et passez-le comme argument. par exemple, "-aes256"

Remarque sur mon système, je n'ai pas RSA dans mes options - au moins sous ce nom.


Comment chiffrer un message S / MIME?

Disons que quelqu'un vous envoie son certificat public et vous demande de crypter un message pour elle. Vous avez enregistré son certificat sous le nom her-cert.pem. Vous avez enregistré votre réponse sous mon-message.txt.

Pour obtenir le cryptage RC2-40 par défaut, quoique assez faible, il vous suffit d'indiquer à openssl où se trouvent le message et le certificat.

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

Si vous êtes sûr que votre correspondant à distance dispose d'une boîte à outils SSL robuste, vous pouvez spécifier un algorithme de cryptage plus puissant comme le triple DES:

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

Par défaut, le message chiffré, y compris les en-têtes de courrier, est envoyé à la sortie standard. Utilisez l'option -out ou votre shell pour le rediriger vers un fichier. Ou, beaucoup plus compliqué, dirigez 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 cryptage. La principale différence est que vous devez avoir votre propre clé et certificat, car vous ne pouvez rien signer avec le certificat 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

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

(euh ... toutes ces barres obliques inverses - celles-ci sont censées être des sauts de ligne. Je ne sais pas ce qui se passe, car cela s'affiche bien dans ma zone d'édition ici!


1
Vous devez mettre quatre espaces au début de chaque ligne pour conserver les nouvelles lignes. J'ai changé le premier bloc pour vous montrer comment. Pouvez-vous réparer le second?
Mikel

1
Vous n'avez pas trouvé RSA openssl enccar il encs'agit uniquement d'un chiffrement symétrique. Ouais, les options d'OpenSL ne sont pas très bien organisées. Les algorithmes asymétriques ont leurs propres commandes: rsa/ dsa/ dhpour manipuler les clés, rsautl/ dsautlpour crypter / décrypter / vérifier / signer et genrsa/ gendsa/ gendhpour générer des clés.
Gilles 'SO- arrête d'être méchant'
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.