Signatures numériques

Une fonction de hachage est une fonction plusieurs donne un qui transforme son entrée en une valeur incluse dans un ensemble fini. Typiquement cet ensemble est un champ de nombres naturels. Une fonction simple de hachage est f(x) = 0 pour tout entier x. Une fonction de hachage plus intéressante est f(x) = x mod 37, qui fait correspondre x avec le reste de la division de x par 37.

La signature numérique d'un document est le résultat de l'application d'une fonction de hachage sur ce document. Toutefois, pour être utile, la fonction de hachage doit vérifier deux propriétés importantes. Premièrement, il doit être difficile de trouver deux documents qui une fois hachés donnent la même valeur. Deuxièmement, pour une valeur résultant d'une fonction de hachage, il doit être difficile de retrouver le document qui a produit cette valeur.

Quelques procédés de chiffrement à clé publique[1] peuvent être utilisés pour signer un document. Le signataire chiffre le document avec sa clé privée. Toute personne désireuse de vérifier la signature et de voir le document utilise simplement la clé publique du signataire pour déchiffrer le document. Cet algorithme satisfait les deux propriétés nécessaires pour une bonne fonction de hachage, mais en pratique, cet algorithme est trop lent pour être utile.

Une alternative est d'utiliser des fonctions de hachage conçues pour satisfaire ces deux propriétés importantes. SHA et MD5 sont des exemples de tels algorithmes. En utilisant un tel algorithme, un document est signé en le hachant et le résultat est la signature. Une autre personne peut vérifier la signature en hachant elle aussi sa copie du document, et en comparant le résultat du hachage avec le résultat du hachage du document original. Si elles correspondent, il est presque certain que les documents sont identiques.

Le problème maintenant est comment utiliser une fonction de hachage pour faire des signatures numériques sans permettre à un attaquant de fausser la vérification de la signature. Si le document et la signature sont envoyés non chiffrés, un attaquant pourrait modifier le document et générer la signature correspondante sans que le destinataire n'en soit conscient. Si le document seulement est chiffré, l'attaquant peut falsifier la signature et entraîner un échec de la vérification de la signature. Une troisième solution est d'utiliser un processus de chiffrement hybride à clé publique pour chiffrer à la fois le document et la signature. Le signataire utilise sa clé privée, et n'importe qui peut utiliser sa clé publique pour vérifier la signature et le document. Cela semble correct, mais en fait ne l'est pas. Si cet algorithme sécurise vraiment le document, il le protège aussi contre les altérations et il n'y aurait plus de raison pour la signature. Plus important, ceci ne protège ni le document ni la signature d'une altération. Avec cet algorithme, seule la clé de session pour le procédé de chiffrement symétrique est chiffrée en utilisant la clé privée du signataire. N'importe qui peut utiliser la clé publique pour récupérer la clé de session. C'est la raison pour laquelle, il est facile pour un attaquant de récupérer la clé de session et de l'utiliser pour chiffrer d'autres documents et les signatures correspondantes, et de les envoyer au nom de l'émetteur.

Une solution consiste à utiliser un algorithme à clé publique pour chiffrer seulement la signature. La valeur retournée par la fonction de hachage est chiffrée en utilisant la clé privée du signataire, et n'importe qui peut vérifier la signature en utilisant sa clé publique. Le document signé peut être envoyé en clair si le document est public ou en utilisant d'autres algorithmes de chiffrement. Si le document est modifié, la vérification de la signature va échouer, mais c'est précisément ce que la vérification d'une signature est censée détecter. Le standard de signature numérique (DSA) est un algorithme de signature à clé publique qui fonctionne comme celui que l'on vient de décrire. DSA est l'algorithme de signature utilisé par défaut dans GnuPG.

Notes

[1]

Le procédé doit avoir la propriété que la clé publique ou la clé privée peuvent être utilisées par l'algorithme de chiffrement comme clé publique. RSA est un exemple d'un tel algorithme, alors qu'ElGamal ne l'est pas.