Les réseaux informatiques actuels comme Fidonet et Internet sont dans l'esprit fort similaire à notre bonne vieille poste. Dans ces réseaux, tout message envoyé passe en général par un certain nombre de relais intermédiaires avant d'arriver finalement à la destination. Dans le système postal, ces relais intermédiaires sont soient des machines à trier automatiques, soient (et c'est généralement le cas) des postiers en chair et en os. Dans Fidonet, ces relais intermédiaires sont des noeuds que fonctionnent généralement sans l'aide de leur sysop. Dans l'Internet ces relais sont soient des routeurs soient des ordinateurs servant de relais pour par exemple le courrier électronique.
D'une façon générales, à moins de prendre des précautions particulières (par exemple envoyer le netmail en crash dans Fidonet), il est très difficile de prévoir à l'avance par quels relais intermédiaires le message passera avant d'arriver à destination, surtout lorsque la destination est éloignée.
Lorsque nous envoyons du courrier par la poste nous sommes conscients des particularités du système postal. La loi postale garantit la confidentialité des informations qui transitent par la poste. Nous devrions donc faire totalement confiance à la poste et utiliser exclusivement des cartes postales pour tous nos envois. En pratique, et probablement inconsciemment, nous préférons protéger nos envois des regards indiscrets par une bonne enveloppe bien opaque...
Sur les réseaux informatiques, et malgré l'importance croissante de ceux-ci, nous continuons à utiliser l'équivalent des cartes postales. Pourtant, depuis quelques années, on peut facilement disposer de très bonnes enveloppes électroniques. Et en plus, PGP, l'un des meilleurs logiciels permettant de réaliser de telles enveloppes "numériques" (et d'autres choses) est disponible gratuitement.
La technologie nécessaire pour réaliser des enveloppes "numériques" se base sur la cryptographie à clé publique. La cryptographie est l'étude des algorithmes d'encryptage. Depuis des siècles, les militaires, les diplomates mais aussi les amoureux et d'autres ont cherché à pouvoir s'échanger des messages le plus confidentiellement possible. L'un des plus anciens algorithmes d'encryptage est celui qui était utilisé par Jules César. Lorsque Jules César communiquait avec ses généraux en temps de guerre, il avait pris l'habitude d'utiliser un alphabet codé. Même si un ennemi interceptait un message de César à ses généraux, il se retrouvait devant un message apparemment incompréhensible. Par exemple, le message "OHMRXUQDOGHUWIP" codé par l'algorithme de César signifie "LEJOURNALDERTFM". Si vous êtes un peu perspicace, vous aurez remarqué que l'algorithme de César revient simplement à remplacer chaque lettre par la lettre qui se trouve trois lettres plus loin dans l'alphabet. Pourtant, cet algorithme simple a permis à César de tromper ses ennemis pendant longtemps. L'algorithme de César fait partie des algorithmes d'encrypage dits "à clé privée". En général, un tel algorithme fonctionne avec un paramètre appelé clé. Lorsque deux personnes veulent communiquer de façon confidentielle, elles peuvent choisir un algorithme à clé privée et une clé. Sur base de cette clé, l'algorithme va brouiller tout message transmis de façon à ce qu'il soit complètement illisible par quelqu'un qui ne possède pas la clé pour le décoder.
On pourrait imaginer d'utiliser exclusivement de tels algorithmes pour envoyer des messages de façon confidentielle sur Internet par exemple, mais ce serait peu pratique. En effet, avant de pouvoir communiquer de façon sûre avec un correspondant, il faudrait d'abord se mettre d'accord avec ce correspondant sur une clé à utiliser pour encrypter les messages. Le seul problème est qu'on ne peut pas envoyer cette clé via Internet car elle pourrait être interceptée par quelqu'un de malveillant dans l'intention de l'utiliser pour décoder toutes les messages qui seraient ultérieurement encodés avec cette clé. Ceci est le principal inconvénient des algorithmes à clé privée, et c'est la raison pour laquelle on ne les utilise pas exclusivement sur Internet.
Heureusement, deux découvertes importantes ont étés faites en cryptographie durant les années septante. La première a été la définition de la cryptographie à clé publique par Diffie et Hellmann. La seconde est la découverte d'un premier algorithme (RSA) à clés publiques utilisable en pratique par Rivest, Shamir et Adleman. Avec les algorithmes fonctionnant avec une clé privée, chaque message est protégé par une clé privée qui est connue par l'expéditeur et le destinataire du message. Les algorithmes à clé publique fonctionnent différemment. Chaque utilisateur dispose de deux clés, une clé privée et une clé publique. Ces deux clés sont en général liées par une relation mathématique, mais il est extrèmement difficile de trouver la clé publique à partir de la clé privée ou inversément. Ces deux clés sont utilisées par paires. Lorsqu'un message est encrypté avec une clé privée, il doit être décrypté avec la clé publique correspondante. La clé privée, servant à ecnrypter, doit comme son nom l'indique être tenue secrète, et ne doit jamais être divulgée. La clé publique, servant à décrypter, peut être largement diffusée. Pour bien comprendre le fonctionnement des dispositifs à clé publique, le plus facile est de prendre un exemple.
Considérons deux utilisateurs, Alice et Bob. Ces deux utilisateurs ont respectivement les paires de clé (Privée_Alice, Publique_Alice) et (Privée_Bob, Publique_Bob). Supposons que l'encryptage et le décryptage soient réalisés par la fonction C qui prend comme paramètre une clé et un nom de message.
Par exemple, Privée_Alice,"Message") représente le message "Message" encrypté avec la clé privée d'Alice. Si Alice veut communiquer de façon sûre avec Bob, il faut qu'elle obtienne la clé publique de Bob et qu'elle encode son message de la façon suivante :
message_encrypté = (Publique_Bob,"Message_d'Alice").
Lorsque Bob recevra ce message, il pourra le décrypter en faisant:
message_décrypté = C ( Privée_Bob, message_encrypté )
= C ( Privée_Bob, C(Publique_Bob,"Message_d'Alice")
= "Message_d'Alice"
Bob étant le seul à disposer de la clé privée Privée_Bob, il est le seul à pouvoir décoder ce message.
Ce système de cryptographie à clé publique permet également de "signer" numériquement des messages. C'est très utile dans les réseaux informatiques tels qu'Internet ou Fidonet où n'importe qui peut très facilement se faire passer pour un autre. Si l'on veut utiliser Internet pour autre chose que de surfer sur les pages web.
Avec la cryptographie à clé publique, la "signature" numérique se fait très simplement. Si
Alice veut envoyer une message à Bob et signer ce message, il suffit qu'elle l'encrypte de la
façon suivante :
message_signé = C (Privée_Alice, "Message_à_signer" )
Toute personne recevant ce message pourra vérifier que le message vient bien d'Alice si il
peut être décrypté par l'opération suivante :
message_décodé = C (Publique_Alice, message_signé )
= C (Publique_Alice, C ( Privée_Alice, "Message_à_signer")
= "Message_à_signer"
Ce message n'a pu venir que d'Alice, puisqu'elle est la seule à connaître la clé Privée_Alice.
Si Alice veut à la fois signer un message et l'encrypter pour que seul Bob puisse le lire, elle
procède de la façon suivante :
message_à_Bob = C ( Publique_Bob, C ( Privée_Alice, "msg") )
Comme Bob est le seul à disposer de la clé Privée_Bob, lui seul pourra décoder le premier
niveau d'encodage et obtenir le message :
message_d'Alice = C ( Privée_Alice , "msg" )
Il pourra alors vérifier que ce message vient bien d'Alice en le décodant avec la clé Publique_Alice.
Cette possibilité de signer de façon numérique des messages est l'application la plus intéressante de la cryptographie à clé publique.
L'algorithme RSA se base sur l'arithmétique modulo (c'est-à-dire le reste de la division d'un nombre par un autre) et tire sa sécurité du fait qu'il n'existe pas d'algorithme efficace permettant de factoriser facilement un nombre en ses facteurs premiers (un nombre premier est un nombre qui n'est divisible que par un et lui même - par exemple 2, 3, 5, 7, ... sont des nombres premiers).
L'opération modulo (x mod y) se définit comme étant le reste de la division de x par y. Voici quelques exemples :
5 mod 2 = 1
4 mod 2 = 0
13 mod 3 = 1
29 mod 5 = 4
483 mod 10 = 3
Par exemple, si p=47 et q=71, n=3337.
Ensuite, on choisit un nombre e tel que e et (p-1)*(q-1) n'ont pas de facteurs communs (deux nombres n'ont pas de facteurs communs s'il n'y a pas de facteur qui permet de diviser ces deux nombres - par exemple, 12(=3*2*2) et 7 n'ont pas de facteurs communs, mais 12(=3*2*2) et 10(=5*2) ont un facteur commun (2) ).
Dans l'exemple ci dessus, (p-1)*(q-1)=46*70=3220, et on peut par exemple choisir e=79 qui n'a pas de facteurs communs avec 3220.
Ensuite, on calcule la clé privée de la façon suivante :
e*d=1 mod ( (p-1)*(q-1) )
Dans notre exemple, 79*d= 1 mod 3220 et donc d=1019. Les nombres e et n constituent la clé publique et d est la clé privée. Les nombres p et q ne sont plus utiles, mais ils ne doivent pas être divulgés.
Pour encrypter un message, il faut d'abord le découper en nombres Mi plus petits que n (comme un message est toujours une chaîne de bits, c'est facile à faire) et ensuite il faut coder chaque nombre Mi de la façon suivante :
Ci = Mi ^e ( mod n ) = (Mi*Mi*...*Mi) (mod n) (e fois Mi)
Pour décrypter les nombres Ci de façon à obtenir les nombres Mi (c'est-à-dire le message non-encrypté), il suffit de calculer :
Mi = Ci ^d mod n = (Ci*Ci*...*Ci) (mod n) (d fois Ci)
Dans notre exemple, si le message M1= 688, on peut calculer
C1 = 688^79 mod 3337 = 1570
et inversément :
M1 = 1570^1019 mod 3337 = 688
Et donc l'algorithme RSA basé sur l'arithmétique modulo permet bien d'encrypter et de décrypter des message.
Olivier Bonaventure olivier@rtfm.be
Retour à la page principale de En-Ligne
Dernière modification de cette page : 9 novembre 1996