Cryptographie asymétrique

De SoHWiki.

La cryptographie asymétrique est une méthode de chiffrement se basant sur l'utilisation de paires de clés, composées d'une clé publique et d'une clé privée, et d'un algorithme de chiffrement.


La clé publique a pour vocation d'être distribuée à l'ensemble des utilisateurs du système. A l'inverse, la clé privée doit rester connue uniquement de son propriétaire. L'algorithme, lui, peut être publique, afin de respecter le principe de Kerckhoffs.

Sommaire

Propriété et relations

Dans un système de chiffrement asymétrique, plusieurs relations lient les clés et l'algorithme.

Tout d'abord, la clé publique étant censée être distribuée, et la clé privée devant rester secrète, il est impératif que la connaissance de la clé publique ne permette pas de découvrir la clé privée.

Ensuite, il parait évident qu'un message chiffré avec l'une ou l'autre des deux clés ne doit pas pouvoir être décrypté sans la connaissance de l'autre clé.

Pourtant, ces deux clés sont liées. En effet, un message chiffré avec l'une des deux doit être déchiffrable grâce à l'autre clé. En d'autres termes, si l'on note F{k}[m] l'application de l'algorithme F au message m en utilisant la clé k, alors on a :

F{priv}[C{pub}[m]] = F{pub}[C{priv}[m]] = m

Principe

Chiffrement

Théorie

Supposons maintenant qu'Alice souhaite envoyer un message m à Bob. Alice possède une paire de clé (PRIValice, PUBalice), et Bob (PRIVbob, PUBbob). On suppose également qu'Alice connaît la clé publique de Bob.

Pour envoyer son message, Alice va utiliser la clé publique de Bob pour chiffrer son message. Elle obtient le message chiffré c :

c = F{PUBbob}[m]

Ce message ne peut être déchiffré qu'avec la clé de Bob, d'après les relations et propriétés vues ci-dessus. Alice peut donc envoyer son message en toute tranquilité, puisqu'elle sait que seul Bob connait sa clé secrète.

Bob reçoit le message c, et applique l'algorithme avec sa clé privée afin de le déchiffrer :

m' = F{PRIVbob}[c]

Or, le message a été chiffré avec sa clé publique. On a donc :

c = F{PUBbob}[m]

Ce qui entraîne :

m' = F{PRIVbob}[F{PUBbob}[m]]

La relation énoncée ci-dessus entraîne :

m' = m

Bob retrouve donc le message en clair m envoyé par Alice !


Analogie

Afin de faciliter sa compréhension, on peut comparer l'utilisation de chiffrement asymétrique à celle d'un coffre vérouillé : Bob et Alice dispose de cadenas (la clé publique), et de l'unique clé qui permet d'ouvrir ces cadenas (la clé privée). Les cadenas sont distribués librement à quiconque veut utiliser le système, la clé reste detenue uniquement par son propriétaire.

Lorsqu'Alice souhaite envoyer un message à Bob, elle le met dans un coffre inviolable (c'est l'algorithme de chiffrement), qu'elle ferme avec un des cadenas de Bob. Elle peut alors envoyer le coffre par n'importe quel moyen : le coffre étant inviolable, elle est sûre que personne ne pourra accéder à son message. Comme Bob possède la seule et unique clé permettant d'ouvrir le cadenas, lorsqu'il reçoit le coffre, il ouvre le cadenas, et peut alors accéder au messagcoffre et cadenase envoyé par Alice.


Signature

La signature est un mécanisme permettant de prouver à la fois qu'un message a bien été écrit par celui qui le prétend, et qu'il n'a pas été modifié entre son émission et sa réception. Là encore, l'utilisation de mécanisme cryptographique asymétrique permet d'assurer cette propriété.

Théorie

Rappelons nous : la cryptographie asymétrique repose sur des paires de clés, dont l'une est censée n'être connue que de son propriétaire. N'est-il pas possible de se servir de cette propriété afin d'authentifier le créateur d'un message ?

Pour le chiffrement, le principe était d'utiliser la clé du destinataire afin de s'assurer que seul lui pourra lire le contenu du message. Pour la signature, c'est exactement l'inverse.

Supposons qu'Alice souhaite envoyer un message à Bob. Ce message est important, et Alice souhaite que Bob n'ait aucun doute sur le fait qu'elle soit bien à l'origine du message, et qu'il n'est pas modifié entre le moment où elle l'envoit, et celui où Bob le reçoit.

Pour envoyer son message, Alice va utiliser sa clé privée pour chiffrer son message. Elle obtient le message chiffré c :

c = F{PRIValice}[m]

Ce message ne peut être déchiffré qu'avec la clé publique d'Alice, que tout le monde peut obtenir, puisque, d'après la propriété vue au debut :

m = F{PUBalice}[F{PRIValice}[m]]

Le fait que tout le monde puisse obtenir la clé d'Alice ne permet pas d'assurer qu'un intrus ne pourra lire le message. En revanche, on s'assure de deux choses :

  • Alice est bien l'émetrice du message: en effet, si le message est déchiffrable avec sa clé publique, c'est qu'il a été chiffré avec sa clé publique. Or, seule elle la connait. Elle a donc bien écrit le message.
  • Le message n'a pas été modifié : si cela avait été le cas, la modification après chiffrement aurait entraîné une impossibilité de le déchiffrer. Si l'on obtient un texte cohérent, c'est qu'aucune modification n'a été faite entre le moment du chiffrement et celui du déchiffrement, donc le message n'a pas été changé.


On s'assure donc de l'identité de l'émetteur du message, et de son intégrité. Attention : Les mécanismes de signature permettent d'assurer que la personne à l'origine d'un message est bien celle qu'elle prétend être. En revanche, ils ne prouvent rien concernant l'émetteur réel du message. Dans l'exemple cité ci-dessus, rien n'empêche un intru d'intercepter le message d'Alice, puis de le renvoyer plus tard. Aucune modification étant apporté au message, la vérification de la signature reste correcte.


La technique de signature telle qu'expliquée ici impose une contrainte lourde : afin d'accéder au contenu du message, les destinataires doivent connaître la clé publique de l'émetteur, ce qui peut être lourd. Afin d'éviter ceci, les mécanismes usuels de signature utilise une méthode un peu différente : Lorsqu'Alice veut signer un message :

  • Un hash de son message est calculé ;
  • Ce hash est chiffré avec sa clé privée, et joint au message clair.

Lorsque Bob reçoit le message, accompagné de son hash chiffré :

  • Il recalcule le hash du message d'Alice ;
  • Il déchiffre le hash signé accompagnant le message grâce à la clé publique d'Alice : il obtient alors un hash en clair ;
  • Il compare les deux hash : S'ils sont identiques, alors il est sûr qu'Alice est à l'origine du message, et que ce dernier n'a pas été modifié.

Ainsi, si Bob ne possède pas la clé publique d'Alice, il a quand même accès au message (puisqu'il n'est pas chiffré), même s'il ne peut pas vérifier la signature.

Analogie

On peut comparer l'utilisation de mécanisme asymétrique pour effectuer des signatures à une armoire fermée dont la porte est en verre. L'armoire est inviolable (c'est l'algorithme de chiffrement), et ne s'ouvre qu'avec une unique clé (la clé privée). En revanche, l'endroit où se trouve cette armoire est publique (c'est la clé publique).

Lorsqu'Alice veut signer un message, elle le dépose dans son armoire avec sa clé privée. Le destinataire, qui connait l'adresse de l'armoire, peut venir lire le message, sans avoir à ouvrir la porte (vu qu'elle est en verre). L'armoire étant inviolable, il s'assure ainsi que c'est bien Alice qui a déposé le message (elle seule possède la clé), et que ce dernier n'a pas été modifié.


Propriétés de sécurité

L'utilisation de cryptographie asymétrique permet donc d'assurer plusieurs propriétés de sécurité :

  • Si le message est chiffré avec la clé publique du destinataire, on assure :
    • sa confidentialité, puisque seul le propriétaire de la clé privée peut le déchiffrer, et que la clé n'est connue que de son propriétaire ;
    • son intégrité : si l'on est capable de déchiffrer le message avec la clé privée, c'est qu'aucune modification n'a été apportée. En effet, une différence d'un seul bit dans un chiffré entraîne l'obtention d'un clair totalement différent.
  • Si le message est chiffré avec la clé privée de l'émetteur, on assure :
    • l'authenticité de la personne à l'origine, puisque le message a été signé avec la clé privée de celui qui l'a écrit, et que lui seul la connaît ;
    • son intégrité, pour la même raison que précedemment.

Utilisation conjointe du chiffrement et de la signature

Il est tout à fait possible de combiner à la fois le chiffrement et la signature lorsqu'on envoit un message. Il est cependant préférable de d'abord le signer, pour ensuite le chiffrer. Cela permet de masquer l'identité de l'émetteur à un éventuel intru qui intercepterait le tout.

Ainsi, lorsqu'Alice veut envoyer à Bob un message m, elle le signe et obtient le message signé s :

s = C{PRIValice}[m]

Elle le chiffre ensuite avec la clé publique de Bob, et obtient le message chiffré c, qu'elle envoit :

c = C{PUBbob}[s] = C{PUBbob}[C{PRIValice}[m]]

Lorsque Bob reçoit le message, il le déchiffre avec sa clé privée, et retrouve le message signé s :

s' = C{PRIVbob}[c] = C{PRIVbob}[C{PUBbob}[C{PRIValice}[m]]] = C{PRIValice}[m] = s

Il utilise ensuite la clé publique d'Alice afin de vérifier son intégrité et son authenticité, et retrouve m :

m' = C{PUBalice}[s] = C{PUBalice}[C{PRIValice}[m]] = m

Avantages et inconvénients

La cryptographie asymétrique présente plusieurs avantages sur la cryptographie symétrique (ou à clé secrète) :

  • D'une part, elle permet de mettre en place simplement des mécanismes de signature et d'authentification, en se basant sur la non diffusion de la clé privée ;
  • D'autre part, elle ne nécessite pas une phase de partage des clés secrètes entre les différents acteurs du système : on ne publie que les clés publiques, ce qui ne met pas en péril la sécurité du système.

Mais elle a en contrepartie quelques inconvénients :

  • Les opérations mises en jeu sont plus consomatrices en temps et en ressource, ce qui freine son déploiement sur des systèmes embarqués par exemple ;
  • Les clé privées et publiques étant liées par des propriétés mathématiques lourdes, il y a beaucoup moins de clés possibles qu'en cryptographie symétrique. Ceci explique que les clés soient beaucoup plus longues (2048 en général, contre 256 pour AES).
Outils personnels