web-dev-qa-db-fra.com

Comment une clé publique vérifie-t-elle une signature?

J'essaie de mieux comprendre le fonctionnement des clés publiques/privées. Je comprends qu'un expéditeur peut ajouter une signature numérique à un document en utilisant sa clé privée pour obtenir essentiellement un hachage du document, mais ce que je ne comprends pas, c'est comment utiliser la clé publique pour vérifier cette signature.

Je croyais comprendre que les clés publiques étaient cryptées, les clés privées décryptées ... quelqu'un peut-il m'aider à comprendre?

127
jcampos8782

Votre compréhension de "chiffrer les clés publiques, déchiffrer les clés privées" est correcte ... pour le chiffrement des données/messages. Pour les signatures numériques, c'est l'inverse. Avec une signature numérique, vous essayez de prouver que le document que vous avez signé vient de vous. Pour ce faire, vous devez utiliser quelque chose que VOUS seul possédez: votre clé privée.

Une signature numérique dans sa description la plus simple est un hachage (SHA1, MD5, etc.) des données (fichier, message, etc.) qui est ensuite crypté avec la clé privée du signataire. Comme c'est quelque chose que seul le signataire a (ou devrait avoir), c'est de là que vient la confiance. TOUT LE MONDE a (ou devrait avoir) accès à la clé publique du signataire.

Donc, pour valider une signature numérique, le destinataire

  1. Calcule un hachage des mêmes données (fichier, message, etc.),
  2. Déchiffre la signature numérique à l'aide de la clé PUBLIC de l'expéditeur, et
  3. Compare les 2 valeurs de hachage.

S'ils correspondent, la signature est considérée comme valide. S'ils ne correspondent pas, cela signifie soit qu'une clé différente a été utilisée pour la signer, soit que les données ont été modifiées (intentionnellement ou non).

J'espère que ça t'as aidé!

170
Shadowman

Les touches fonctionnent inversement:

Chiffrement de clé publique, déchiffrement de clé privée (chiffrement):

openssl rsautl -encrypt -inkey public.pem -pubin -in message.txt -out message.ssl
openssl rsautl -decrypt -inkey private.pem       -in message.ssl -out message.txt

Chiffrement de clé privée, déchiffrement de clé publique (signature):

openssl rsautl -sign -inkey private.pem       -in message.txt -out message.ssl
openssl rsautl       -inkey public.pem -pubin -in message.ssl -out message.txt

Vous trouverez ci-dessous un exemple de script permettant de tester l'ensemble de ce flux avec openssl.

#!/bin/sh
# Create message to be encrypted
echo "Creating message file"
echo "---------------------"
echo "My secret message" > message.txt
echo "done\n"

# Create asymmetric keypair
echo "Creating asymmetric key pair"
echo "----------------------------"
openssl genrsa -out private.pem 1024
openssl rsa -in private.pem -out public.pem -pubout
echo "done\n"

# Encrypt with public & decrypt with private
echo "Public key encrypts and private key decrypts"
echo "--------------------------------------------"
openssl rsautl -encrypt -inkey public.pem -pubin -in message.txt         -out message_enc_pub.ssl
openssl rsautl -decrypt -inkey private.pem       -in message_enc_pub.ssl -out message_pub.txt
xxd message_enc_pub.ssl # Print the binary contents of the encrypted message
cat message_pub.txt # Print the decrypted message
echo "done\n"

# Encrypt with private & decrypt with public
echo "Private key encrypts and public key decrypts"
echo "--------------------------------------------"
openssl rsautl -sign    -inkey private.pem -in message.txt          -out message_enc_priv.ssl
openssl rsautl -inkey public.pem -pubin    -in message_enc_priv.ssl -out message_priv.txt
xxd message_enc_priv.ssl
cat message_priv.txt
echo "done\n"

Ce script génère les éléments suivants:

Creating message file
---------------------
done

Creating asymmetric key pair
----------------------------
Generating RSA private key, 1024 bit long modulus
...........++++++
....++++++
e is 65537 (0x10001)
writing RSA key
done

Public key encrypts and private key decrypts
--------------------------------------------
00000000: 31c0 f70d 7ed2 088d 9675 801c fb9b 4f95  1...~....u....O.
00000010: c936 8cd0 0cc4 9159 33c4 9625 d752 5b77  .6.....Y3..%.R[w
00000020: 5bfc 988d 19fe d790 b633 191f 50cf 1bf7  [........3..P...
00000030: 34c0 7788 efa2 4967 848f 99e2 a442 91b9  4.w...Ig.....B..
00000040: 5fc7 6c79 40ea d0bc 6cd4 3c9a 488e 9913  [email protected].<.H...
00000050: 387f f7d6 b8e6 5eba 0771 371c c4f0 8c7f  8.....^..q7.....
00000060: 8c87 39a9 0c4c 22ab 13ed c117 c718 92e6  ..9..L".........
00000070: 3d5b 8534 7187 cc2d 2f94 0743 1fcb d890  =[.4q..-/..C....
My secret message
done

Private key encrypts and public key decrypts
--------------------------------------------
00000000: 6955 cdd0 66e4 3696 76e1 a328 ac67 4ca3  iU..f.6.v..(.gL.
00000010: d6bb 5896 b6fe 68f1 55f1 437a 831c fee9  ..X...h.U.Cz....
00000020: 133a a7e9 005b 3fc5 88f7 5210 cdbb 2cba  .:...[?...R...,.
00000030: 29f1 d52d 3131 a88b 78e5 333e 90cf 3531  )..-11..x.3>..51
00000040: 08c3 3df8 b76e 41f2 a84a c7fb 0c5b c3b2  ..=..nA..J...[..
00000050: 9d3b ed4a b6ad 89bc 9ebc 9154 da48 6f2d  .;.J.......T.Ho-
00000060: 5d8e b686 635f b6a4 8774 a621 5558 7172  ]...c_...t.!UXqr
00000070: fbd3 0c35 df0f 6a16 aa84 f5da 5d5e 5336  ...5..j.....]^S6
My secret message
done
53
Jaakko

La clé publique chiffre et seule la clé privée peut la déchiffrer, et l'inverse est vrai. Ils chiffrent tous les deux dans des hachages différents mais chaque clé peut déchiffrer le chiffrement de l'autre.

Il existe différentes manières de vérifier qu'un message provient d'un expéditeur attendu. Par exemple:

L'expéditeur envoie:

  1. Le message

  2. Le hash du message crypté avec sa clé privée

Le récepteur:

  1. Déchiffre la signature (2) avec la clé publique pour obtenir un message, censé être le même message que (1) mais nous ne le savons pas encore. Nous avons maintenant deux messages que nous devons vérifier sont identiques. Pour ce faire, nous allons les chiffrer tous les deux avec notre clé publique et comparer les deux hachages. Donc nous allons ...
  2. Crypter le message d'origine (1) avec la clé publique pour obtenir un hachage
  3. Cryptez le message déchiffré (3) pour obtenir un deuxième hachage et comparez-le à (4) pour vérifier qu'ils sont identiques.

S'ils ne sont pas identiques, cela signifie que le message a été falsifié ou qu'il a été signé avec une autre clé et non celle à laquelle nous pensions ...

Un autre exemple serait que l'expéditeur utilise un hachage commun que le destinataire pourrait également utiliser. Par exemple:

L'expéditeur envoie:

  1. Un message
  2. Prend un hachage connu du message, puis le chiffre avec la clé privée

Le récepteur:

  1. Déchiffre (2) et obtient une valeur de hachage
  2. Hache le message (1) avec le même hash utilisé par l'expéditeur
  3. Compare les deux hachages pour s'assurer qu'ils correspondent

Cela garantit à nouveau que le message n'a pas été falsifié et qu'il provient de l'expéditeur attendu.

7
wueb

Je pensais fournir une explication supplémentaire à quiconque recherchait quelque chose de plus intuitif.

Une grande partie de cette confusion provient de la dénomination de "clés publiques" et de "clés privées", car le fonctionnement de ces éléments est directement en contradiction avec la définition de "clé".

Prenez le cryptage par exemple. On pourrait penser que cela fonctionne comme ceci:

  • Les parties souhaitant pouvoir lire les messages secrets conservent chacune une clé cachée (c'est-à-dire une clé privée)
  • Les parties qui souhaitent pouvoir envoyer des messages secrets ont toutes la possibilité d’obtenir un verrou déverrouillé (c’est-à-dire un verrou public).
  • Envoyer un message secret est aussi simple que de le verrouiller avec un verrou déverrouillé, mais le déverrouiller ensuite ne peut être effectué qu’avec l’une des clés cachées.

Cela permet d’envoyer des messages secrets entre les parties, mais d’un point de vue intuitif, "verrou public" est un nom plus approprié que "clé publique".

Cependant, pour l'envoi de signatures numériques, les rôles sont quelque peu inversés:

  • La partie qui veut signer des messages est la seule à avoir accès aux verrous non verrouillés (c'est-à-dire un verrou privé)
  • Les parties qui souhaitent vérifier la signature ont toutes la possibilité d’obtenir une clé (c.-à-d. Une clé publique).
  • Ensuite, le signataire crée deux messages identiques: celui que tout le monde peut lire et l'autre qui l'accompagne, mais qu'il verrouille avec l'un de ses verrous privés.
  • Ensuite, lorsque le destinataire reçoit le message, il peut le lire, puis utiliser la clé publique pour déverrouiller le message verrouillé et comparer les deux messages. Si les messages sont les mêmes, ils savent que:

    1. Le message déverrouillé n'a pas été altéré pendant le voyage et,

    2. Le message doit provenir de la personne qui a le verrou correspondant sur sa clé publique.

  • Enfin, l'ensemble du système ne fonctionne que si quiconque souhaite valider la signature du signataire dispose d'un emplacement faisant autorité pour obtenir la clé correspondante des verrous du signataire. Sinon, n'importe qui peut dire "Hé, voici la clé du verrou privé de Untel", envoyez-lui un message prétendant être ce qu'il vous faut, mais verrouillez-le avec son verrou privé. Vous effectuez toutes les étapes ci-dessus et croyez que le message doit être réellement de la personne que vous pensiez, mais vous êtes dupe parce que vous avez induit en erreur quant au véritable propriétaire d'une clé publique.

Tant qu'il existe une source digne de confiance pour la récupération de la clé publique du signataire, vous saurez qui est le propriétaire légitime de la clé publique et pourrez valider sa signature.

3
shoe