web-dev-qa-db-fra.com

Comment crypter des messages / textes avec RSA & OpenSSL?

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

Le message est:

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

29
LanceBaynes

Dans la page de manuel openssl manual (openssl), recherchez RSA, et vous verrez que la commande de 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 défaut schéma de remplissage 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 (utile uniquement 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).

Tout d'abord, si vous voulez juste un bon chiffrement, vous devriez regarder GnuPG . Mais si vous expérimentez et voulez simplement savoir comment cela fonctionne, vous devez comprendre ce qu'est 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 pour lesquelles 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 crypter 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 chiffrent uniquement les données en bloc d'une taille spécifique. DES utilise des blocs 64 bits et AES utilise 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 requête de page Web commençant par GET / et il pourrait le retourner en le changeant en PUT / sans interférer avec le reste du chiffrement. Une approche simple de l'intégrité consiste à ajouter une somme MD5 ou SHA-1 à la fin, mais qui fournit uniquement 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 qui nécessite la connaissance d'un clé secrète à générer fournissant ainsi l'authenticité des données en plus de l'intégrité.

25
penguin359

Dans ce qui suit, notez que vous pouvez spécifier l'algorithme que vous souhaitez, 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?

Supposons 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 certain 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 délicat, dirigez la sortie directement vers 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]

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

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

5
draeath