L'ENCRYPTAGE L'encryptage permet de protéger un message des regards indiscrets. Pour cela, on modifie le message de telle sorte qu'il soit illisible pour ceux qui ne savent pas comment il a été modifié. Cela peut servir à envoyer un message secret à quelqu'un ou à protéger des fichiers sur votre disque dur des regards indiscrets. Petite note: Comme me l'a précisé un internaute, on devrait dire chiffrement et non pas encryptage, ainsi que déchiffrement et non pas décryptage. Le terme de décryptage ne devrait normalement s'appliquer qu'à l'opération qui consiste à s'attaquer à des données chiffrées sans connaître la clé. Dans cette page, je fais une petite entorse: j'utilise les termes d'encryptage et de décryptage. Un exemple simple Prenons un exemple. On va modifier le mot HELLO. On peut décaler les lettres de l'alphabet (A devient B, B->C, C->D, etc.). HELLO IFMMP Cela rend le texte illisible : cette opération est appelée encryptage (ou chiffrement). Pour avoir le message en clair, on fait le décalage inverse (B->A, C->B, D->C, etc.). IFMMP HELLO Cette opération pour rendre le message lisible est appelé décryptage. C'est déjà bien, mais on peut faire mieux: on peut décaler de 1 lettre, 2 lettres ou plus. Décalage de 1 lettre: HELLO IFMMP Décalage de 2 lettres: HELLO JGNNQ Décalage de 3 lettres: HELLO KHOOR Pour avoir le message en clair, il faut savoir de combien de lettres on a décalé. Cela fait 25 possibilités différentes. Essayer les 25 possibilités prend du temps, mais c'est faisable ! On pourrait faire plus compliqué: décaler différemment chaque lettre du mot HELLO. Par exemple décaler de 5 la première lettre, de 12 la seconde, de 7 la troisième, et ainsi de suite. Ces nombres (5,12,7...) seuls permettent de retrouver le message original. On appelle ceci une clé. C'est exactement comme la clé d'un coffre-fort : il existe une seul combinaison qui permet d'obtenir l'information. Sans la clé, il est très difficile d'obtenir l'information. D'autres méthode Il existe des centaines d'autres méthodes d'encryptage pour protéger les données. Citons : DES, IDEA, Blowfish, CAST, GOST, RC4, RC6... Elles sont pour la plupart basées sur des modifications simples : inversions, transpositions, décalage, etc. Quelle est la meilleure ? Difficile à dire. Chacune de ses méthodes a des caractéristiques: Le type et le nombre d'opérations qu'elle réalise pour encrypter/décrypter : additions, multiplication, transpositions, permutations... La solidité mathématique de ces transformations Le nombre de clés différentes possibles pour chaque algorithme. Pour décrypter un message sans connaître la clé, on peut utiliser plusieurs méthodes: Essayer toutes les clés possibles avec son ordinateur, ou bien avec un ordinateur très puissant spécialement fabriqué pour casser un algorithme précis (ce qui a été fait pour le DES...). Se baser sur une faiblesse mathématique de l'algorithme et trouver des moyens de décoder le message ou trouver une partie de la clé. Généralement, plus un algorithme a été testé par les spécialistes mondiaux (cryptographes, matématiciens...), plus on peut le considérer comme sûr. Méfiez-vous des algorithmes ou programmes récents que leurs auteurs présentent comme "impossible à cracker". ('cracker' ou 'casser' c'est trouver la clé ou le message en clair à partir d'un message encrypté). La protection offerte par le chiffrement doit être basée sur la solidité mathématique de l'algorithme, et non pas sur le secret de l'algorithme. Evitez comme la peste les programmes dont les algorithmes ne sont pas connus, ou ceux utilisant des algorithmes maison. Préférez les algorithmes connus (Blowfish, AES, TripleDES, IDEA...) Les algorithmes les plus sûrs sont ceux qui ont été le plus largement testés et approuvés par la communauté scientifique. Cependant, IL N'EXISTE AUCUN ALGORITHME OU PROGRAMME IMPOSSIBLE A CRACKER. (enfin... ce n'est pas tout à fait vrai) Tout est une question de patience et de puissance de calcul de l'ordinateur. Les bons algorithmes - bien utilisés - nécessitent pour être crackés des temps de calcul plus longs que la durée de vie de l'Univers. N'importe qui ne peut pas s'improviser cryptographe. 95% des logiciels de cryptage proposés sur Internet sont totalement bidons du point de vue sécurité, et les grosses sociétés ne font pas exception (ex: Norton For Your Eyes Only, Microsoft, etc.). Généralement, ne faites pas confiance à un logiciel de cryptage dont le code source n'est pas disponible. Pour encrypter vos fichiers et vos emails, je vous recommande PGP. Pour encrypter vos disques, utilisez E4M ou ScramDisk. Les algorithmes asymétriques Les algorithmes que nous venons de voir sont dits symétriques, car on utilise la même clé C pour encrypter et décrypter. Il existe des algorithmes asymétriques : la clé de décryptage est différente de la clé d'encryptage. On les appelle aussi algorithmes à clé publique. Il est impossible de trouver D (la clé de décryptage) à partir de E (la clé d'encryptage). A quoi ça peut bien servir ? Imaginons qu'Alice veuille envoyer un message à Bob. Elle ne dispose d'aucun moyen de communication sûr avec Bob (cela veut dire que n'importe qui peut écouter leurs messages). Le mieux que puisse faire Alice, c'est encrypter le message de telle sorte que seul Bob puisse le décrypter. Elle peut utiliser un algorithme symétrique (comme celui qui utilise C ci dessus). Dans ce cas, elle encrypte le message avec la clé C et l'envoie à Bob. Mais Bob doit aussi connaître la clé C si il veut décrypter le message. Alice doit donc aussi transmettre C à Bob. Mais comment faire puisque tout le monde peut épier leurs communications et donc connaître aussi C ? La solution serait d'utiliser un algorithme assymétrique: Bob créé ses deux clés E et D. Il envoie sa clé E à Alice et garde sa clé D bien à l'abris. Pour envoyer un message à Bob, Alice utilise la clé E que lui a donné Bob pour encrypter les messages. De son côté, Bob utilise sa clé D pour décrypter les messages. Bob est le seul à pouvoir décrypter les messages : il a gardé sa clé D secrète et personne n'est capable de calculer D à partir de E. Si un espion regarde les communications, il ne verra passer que la clé E et les messages encryptés. E ne lui sera d'aucune utilité pour décrypter les messages. La clé E de Bob est appelée clé publique, car elle est donnée à tout le monde. Tout le monde peut ainsi encrypter des messages à destination de Bob que Bob seul pourra décrypter. La clé D de Bob est appelée clé privée : elle est conservée bien à l'abris par Bob qui s'en sert pour décrypter les messages qu'il reçoit. Authentification Les algorithmes d'encryptage assymétriques ont d'autres utilisations: on peut par exemple authentifier l'émetteur d'un message. Par exemple, si Bob reçoit un message, comment peut-il être sûr qu'il provient bien d'Alice ? Quelqu'un pourrait très bien encrypter un message et l'envoyer à Bob en se faisant passer pour Alice. Avec les algorithmes assymétriques, on peut signer un message. Soit: A:E Clé publique d'Alice (utilisée pour encrypter) donnée à tout le monde. A:D Clé privée d'Alice (utilisée pour décrypter) B:E Clé publique de Bob (utilisée pour encrypter) donnée à tout le monde. B:D Clé privée de Bob (utilisée pour décrypter) Alice possède sa clé privée (A:D) et la clé publique de Bob (B:E). Bob possède sa clé privée (B:D) et la clé publique d'Alice (A:E). Quand Alice veut envoyer un message à Bob, Alice décrypte avec sa clé privée (A:D) pour signer le message puis l'encrypte avec la clé publique de Bob (B:E). Quand Bob reçoit le message, il le décrypte avec sa clé privée (B:D), puis l'encrypte avec la clé publique d'Alice (A:E). Si il parvient à obtenir le message en clair en encryptant avec la clé publique d'Alice (A:E), alors il est sûr que ce message vient bien d'Alice puisque Alice est la seule à posséder la clé privée correspondante (A:D) qui permet de décrypter le message. Cela permet de signer les message. Si un espion envoie un message à Bob en essayant de se faire passer pour Alice, il ne pourra pas signer le message puisqu'il ne possède pas la clé privée d'Alice (A:D). Quand Bob encryptera avec A:E, il n'obtientdra pas le message en clair et verra qu'il y a un problème et que ce message ne provient pas d'Alice. Ce système d'authentification n'est pas parfait mais il est très sûr. C'est ce système qui est utilisé entre autres pour les transactions entre banques. (Pour être tout à fait précis, et pour permettre l'automatisation par l'ordinateur de cette vérification, on se contente généralement de signer uniquement un digest (un hash cryptographique) du message (SHA1 ou MD5).) Il existe encore des tas d'applications possibles à la cryptographie. Si lire l'anglais ne vous fait pas peur, je vous recommande l'excellent ouvrage de Bruce Schneier : "Applied Cryptography" (éditions John Wiley & Sons, Inc. ; ISBN 0-471-12845-7). Ce livre fait près de 750 pages. Vous y trouverez différents algorithmes (symétriques et asymétriques) expliqués, des tonnes d'exemples surprenants d'applications de la cryptographie et les avantages et inconvénients des différents algorithmes. Exemple d'algorithme asymétrique : le RSA Il existe différents algorithmes asymétriques. L'un des plus connus est le RSA (de ses concepteurs Rivest, Shamir et Adleman). Cet algorithme est très largement utilisé, par exemple dans les navigateurs pour les sites sécurisés et pour chiffrer les emails. Il est dans le domaine public. L'algorithme est remarquable par sa simplicité. Il est basé sur les nombres premiers. Pour encrypter un message, on fait: c = m^e mod n Pour décrypter: m = c^d mod n m = message en clair c = message encrypté (e,n) constitue la clé publique (d,n) constitue la clé privée n est le produit de 2 nombres premiers ^ est l'opération de mise à la puissance (a^b : a puissance b) mod est l'opération de modulo (reste de la division entière) Créer une paire de clés C'est très simple, mais il ne faut pas choisir n'importe comment e,d et n. Et le calcul de ces trois nombres est tout de même délicat. Voici comment procéder: 1. Prendre deux nombres premiers p et q (de taille à peu près égale). Calculer n = pq. 2. Prendre un nombre e qui n'a aucun facteur en commun avec (p-1)(q-1). 3. Calculer d tel que ed mod (p-1)(q-1) = 1 Le couple (e,n) constitue la clé publique. (d,n) est la clé privée. Un exemple Allons-y ! Commençons par créer notre paire de clés: Prenons 2 nombres premiers au hasard: p = 29, q = 37 On calcul n = pq = 29 * 37 = 1073 On doit choisir e au hasard tel que e n'ai aucun facteur en commun avec (p-1)(q-1): (p-1)(q-1) = (29-1)(37-1) = 1008 On prend e = 71 On choisit d tel que 71*d mod 1008 = 1 On trouve d = 1079 On a maintenant nos clés : La clé publique est (e,n) = (71,1073) (=clé d'encryptage) La clé privée est (d,n) = (1079,1073) (=clé de décryptage) On va encrypter le message 'HELLO'. On va prendre le code ASCII de chaque caractère et on les met bout à bout: m = 7269767679 Ensuite, il faut découper le message en blocs qui comportent moins de chiffres que n. n comporte 4 chiffres, on va donc découper notre message en blocs de 3 chiffres: 726 976 767 900 (on complète avec des zéros) Ensuite on encrypte chacun de ces blocs: 726^71 976^71 767^71 900^71 mod mod mod mod 1073 1073 1073 1073 = = = = 436 822 825 552 Le message encrypté est 436 822 825 552. On peut le décrypter avec d: 436^1079 822^1079 825^1079 552^1079 mod mod mod mod 1073 1073 1073 1073 = = = = 726 976 767 900 C'est à dire la suite de chiffre 726976767900. On retrouve notre message en clair 72 69 76 76 79 : 'HELLO'. Dans la pratique Dans la pratique, ce n'est pas si simple à programmer: Il faut trouver de grands nombres premiers (ça peut être très long à calculer) Il faut obtenir des nombres premiers p et q réellement aléatoires (ce qui est loin d'être évident). On n'utilise pas de blocs aussi petits que dans l'exemple ci-dessus: il faut être capable de calculer des puissances et des modulos sur de très grand nombres. En fait, on utilise jamais les algorithmes asymétriques pour chiffrer toutes les données, car ils sont trop longs à calculer : on chiffre les données avec un simple algorithme symétrique dont la clé est tirée au hasard, et c'est cette clé qu'on chiffre avec un algorithme asymétrique comme le RSA. P.G.P. Si vous voulez encrypter vos fichiers, je vous recommande l'excellent logiciel PGP (Pretty Good Privacy). D'autres algorithmes, d'autres programmes... Il existe d'autres algorithmes asymétriques, dont l'ECC (Elliptic Curve Cryptosystems, Encryptage par Courbe Elliptique). Ce système est basé sur une courbe paramétrique qui passe par un certain nombre de points de coordonnées entières. Ce n'est pas encore très développé, mais il est prometteur. Il existe également Diffie-Hellman, de plus en plus préféré à RSA. (Diffie-Hellman avait rapidement été adopté par la communauté opensource quand RSA n'était pas encore dans le domaine public). L'OTP : le seul algorithme impossible à casser Là vous devez vous dire que je me moque de vous. Je vous ai dit qu'il n'existait aucun algorithme ou programme impossible à cracker. J'aurais dû préciser "algorithme ou programme à clé". En effet, il suffit d'essayer toutes les clés différentes possible jusqu'à trouver la bonne. Mais il existe une méthode qui n'utilise aucune clé. L'OTP : One-Time Pad Aussi appelé masque jetable, c'est une technique simplissime. Imaginons que nous ayons un message de n octets. Pour l'encrypter: 1. créer une suite S (même taille que n) d'octets aléatoires (S est appelé pad ou masque). 2. appliquer ce masque octet par octet au message (généralement avec une opération logique XOR) Ainsi, si vous ne connaissez pas le masque S, le message EDRJVQUIKEGDNCTUIO peut très bien se décrypter en: Ma réponse est oui Ma réponse est non Le lavabo est bleu Tout dépend de S ! Si vous n'avez pas S, vous pouvez toujours essayer de décrypter le message : il peut vouloir dire n'importe quoi ! Quelle que soit votre puissance de calcul, vous ne pourrez jamais décrypter le message. Le piège Vous allez me dire : facile ! Et bien non... c'est une technique très difficile à maîtriser. Pourquoi ? Les octets du masque doivent être réellement aléatoires. Si vous les crééez à partir d'un programme, ils ne sont pas aléatoires ! Il devient possible de deviner la suite d'octets du masque. Le masque ne doit jamais servir plus d'une seule fois, sinon il devient possible de décrypter les messages suivants. Il faut sans cesse créer un nouveau masque pour encrypter de nouvelles données. Le masque doit être de la taille des données à encrypter. Pour 600 Megaoctets de données à encrypter, il faut un masque de 600 Mega-octets. Pas toujours pratique à manipuler. Enfin, pour que votre correspondant puisse décrypter, vous devez aussi lui envoyer le masque ! Et vous devez le faire par un moyen parfaitement sûr. Vous voyez, c'est une technique imparable, mais très délicate à utiliser. Les nombres aléatoires Il est impossible de créer des nombres aléatoires avec un programme, quel qu'il soit. Point à la ligne. On peut au mieux créer des nombres pseudo-aléatoires. La plupart des générateurs de nombres aléatoires sont assez mauvais : on retrouve rapidement les mêmes suites de valeurs au bout d'un certain temps. certaines valeurs sortent plus que d'autres. avec certains générateurs, on peut trouver toute la suite de nombres simplement en connaissant deux valeurs successives ! L'OTP a donc besoin de nombres réellement aléatoires, tels que ceux créés avec des phénomènes physiques impossibles à prévoir : écoulement de fluides (lava-lamps, particules dans un liquide en circulation, vent et tourbillons) bruit blanc généré par un pont de diodes émission de particules issues de la décomposition de matière radioactive etc. Bref, ce n'est pas à la portée de tout le monde. Il faut un bon dispositif physique, et non pas seulement logiciel. Certains ont inventé des systèmes ingénieux avec une webcam qui filme des lava-lamps (ces lampes en forme de fusée avec des boules de parafine fondue qui montent et descendent à l'intérieur). Comme ces écoulements de fluide et la convection les rendent impossible à prévoir à long terme, ils font un bon générateur de nombres aléatoires. Il suffit de filmer l'image et d'utiliser la valeur des pixels pour générer des nombres aléatoires. Silicon Graphics (le fabricant d'ordinateurs) possède un site Web dédié à cela. Vous pourrez y voir comment ils ont conçu leur générateur de nombres aléatoires : http://www.lavarnd.org. Si la génération de nombres aléatoires vous intéresse, vous pouvez lire la RFC 1750.