Cryptographie `a clef publique
Transcription
Cryptographie `a clef publique
Cryptographie à clef publique Cécile Schryve - Laurent Gajny 24 mai 2010 1 Table des matières 1 Clef secrète, clef publique 1.1 Cryptographie à clef secrète . . 1.1.1 Principe . . . . . . . . . 1.1.2 Quelques exemples . . . 1.2 Cryptographie à clef publique . 1.3 Clef publique contre Clef privée . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 3 3 5 6 7 2 Eléments d’Algèbre 9 2.1 Le petit théorème de Fermat . . . . . . . . . . . . . . . . . . . 9 2.2 Le groupe multiplicatif . . . . . . . . . . . . . . . . . . . . . . 10 2.3 La fonction ϕ d’Euler . . . . . . . . . . . . . . . . . . . . . . . 10 3 Diffie-Hellman et RSA 3.1 Echange de clef Diffie-Hellman . . . . . . . . . . . . . 3.1.1 Principe . . . . . . . . . . . . . . . . . . . . . 3.1.2 Outils mathématiques et algorithmes . . . . . 3.2 RSA . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.2.1 Avantages et inconvénients du cryptosystème 3.2.2 Le protocole RSA . . . . . . . . . . . . . . . . 3.2.3 Le théorème du RSA . . . . . . . . . . . . . . 3.2.4 La signature dans RSA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 11 11 12 16 16 16 17 18 4 Tests de primalité 18 4.1 Un premier test basé sur le petit théorème de Fermat . . . . . 19 4.2 Test de Solovay-Strassen . . . . . . . . . . . . . . . . . . . . . 21 4.3 Test de Miller-Rabin . . . . . . . . . . . . . . . . . . . . . . . 23 5 Programmation 26 5.1 Tests de primalité . . . . . . . . . . . . . . . . . . . . . . . . . 27 5.2 Le protocole RSA . . . . . . . . . . . . . . . . . . . . . . . . . 29 2 Depuis longtemps, les hommes ont eu le souci de pouvoir se communiquer des données de manière confidentielle, que ce soit pour s’échanger des messages personnels aussi bien que des messages militaires. Pour cela, les hommes ont inventé la cryptologie. Elle existe depuis l’Antiquité mais pendant longtemps, elle fut considérée comme de l’art et c’est à partir du XVIIIème siècle qu’elle devint réellement une science. Dans notre exposé, nous allons nous pencher plus particulièrement sur une partie de la cryptologie : la cryptographie. Elle fait donc partie, avec la cryptanalyse, de la cryptologie, qui est la science englobant le chiffrement et le déchiffrement de messages codés, messages codés que l’on appelle également cryptogrammes. Plus précisément, la cryptographie est la discipline de la cryptologie qui a pour objectif d’assurer la sécurité lors de la transmission de messages. Par sécurité, nous entendons la confidentialité mais également l’authenticité de l’expéditeur et du destinataire. Pour se faire, les cryptogrammes utilisent des clefs pour chiffrer les messages. La cryptographie traditionnelle est donc une science traitant de la transmission confidentielle de données et étudiant les différentes méthodes permettant la transmission de messages sous forme déguisée tel que seul le destinataire soit capable de les lire. Même si nous avons des applications concrètes de la cryptographie, il ne faut pas oublier qu’il y a un aspect mathématique qui se cache derrière tout ça. De plus, nous pouvons dire que l’évolution de la cryptographie est liée à l’évolution des mathématiques mais aussi de l’informatique car c’est grâce à l’informatique qu’elle connu un essor important. De nos jours, la cryptographie peut être utilisée dans les domaines militaire, commercial mais aussi pour la protection de la vie privée. 1 1.1 1.1.1 Clef secrète, clef publique Cryptographie à clef secrète Principe La cryptographie à clef secrète est utilisée depuis bien longtemps. Elle permet à deux personnes possédant un secret commun de communiquer confidentiellement. En effet, on a le problème suivant : Alice veut envoyer un message à Bob (par la suite, Alice et Bob pourront être représentés par A et B) mais ne veut pas que les autres soient au courant. Pour cela, elle va d’abord se mettre d’accord avec Bob sur un secret commun qui va leur permettre de chiffrer et de déchiffrer les messages. Maintenant, nous allons vous présenter la procédure : 3 Figure 1 – Modélisation d’une communication confidentielle entre A et B en présence de O. – Alice va donc écrire son message en clair puis le chiffrer grâce au secret commun. – Ensuite, Alice va envoyer son message à Bob et il pourra le déchiffrer facilement car il est le seul à connaı̂tre le secret, hormis Alice. Le secret commun d’Alice et Bob s’appelle la clef, que l’on note en général K, et on s’aperçoit que si une troisième personne Oscar (représenté par O dans la suite) ne possède pas K alors elle ne peut pas déchiffrer le message. Grâce au schéma ci-après, nous pouvons voir qu’Oscar ne peut pas déchiffrer le message s’il ne possède pas la clef mais il pourrait très bien essayer un certain nombre de possibilités et par chance, tomber rapidement sur la solution. Alice et Bob ne peuvent donc pas choisir n’importe comment leur clé. Cependant, s’ils font attention aux différents principes suivants : – La sécurité repose sur le secret de la clef et non sur le secret de l’algorithme. – Le déchiffrement sans la clef doit être impossible (en temps raisonnable). – Trouver la clef à partir du clair et du chiffré est impossible (en temps raisonnable). Alors théoriquement, Oscar ne pourra pas casser le système. Les principes énoncés font partis des principes de Kerckhoffs. 4 1.1.2 Quelques exemples Le chiffrement de Jules César Le chiffrement par décalage est aussi appelé chiffrement de Jules César car il a été considéré comme le créateur de cette méthode. En effet, même si on a retrouvé des traces de messages chiffrés grâce à une clef qui décale les lettres chez les Grecs, on sait que Jules César n’a eu aucun contact avec ces messages et on peut considérer qu’il a réinventé le fait de chiffrer les messages. Pour son époque, ce fut révolutionnaire car jamais personne n’y avait pensé, et surtout, si le message était intercepté, il était illisible pour les ennemis. D’ailleurs, on retrouve dans des écrits de personnes de l’époque que César écrivait des messages incompréhensibles en n’alternant pas nécessairement les voyelles et les consonnes comme ils le connaissaient pour faire des phrases. César a donc surpris, innové et mis au point une stratégie militaire que ses ennemis ne pouvaient pas contrer car ils ne connaissaient pas le moyen de déchiffrer et ils ne connaissaient donc pas la clef. Mais en quoi consiste ce chiffrement plus précisément ? Ce chiffrement consiste donc à décaler les lettres d’un certain nombre de rangs. Pour cela, il faut écrire l’alphabet et chaque lettre sera remplacé par la lettre que l’on obtient lorsque l’on se décale du nombre de lettres voulues vers la droite. Mais regardons le sur des exemples : – JULES CESAR deviendra OZQJX HJXFW si on décale de 5 rangs c’est-à-dire si on remplace A par F , E par J, . . . – ALEA JACTA EST sera remplacé par DOHD MDFWD HVW si on décale de 3 rangs, si on remplace A par D, B par E,. . . , Z par C. La clef secrète, que connaı̂t donc César et son interlocuteur, est donc F ou alors 5, qui correspond au nombre de lettres à passer avant d’arriver à celle souhaitée pour le premier cas et pour le deuxième, la clé sera D ou 3. Pour chiffrer son message, César va donc tout d’abord l’écrire en clair, c’est-à-dire en latin. Puis, pour le chiffrer, il va décaler les lettres en utilisant la clé secrète (qui lui indique donc le nombre de rang ou la lettre qui remplace A), César, lui, décale les lettres vers la droite mais lorsque le destinataire reçoit le message, pour le déchiffrer, il doit décaler les lettres, du même nombre de rang, mais vers la gauche. Ainsi, il va découvrir le message en clair émis par César. Cela peut se faire avec n’importe quelle lettre puisque lorsque l’on arrive à la lettre Z, on repart au début, c’est-à-dire à A. Selon l’histoire, Jules César utilisait principalement la clef de chiffrement 3, ou encore D. 5 On se rend compte qu’avec nos moyens actuels il serait très facile de le déchiffrer mais pour l’époque c’était incompréhensible. Cependant, cela n’a pas empêché ce système de se développer puisqu’il existe plusieurs variantes, avec des chiffres par exemple, ce système s’appelle aussi le chiffrement par substitution. Ce système nous montre cependant la limite d’un chiffrement à clef secrète. Le chiffrement par substitution On considérera ici l’exemple le plus basique qui soit. A B C 01 02 03 ... ... Z 26 Voici des citations de Jules César que nous allons coder avec cette clé de chiffrement : VENI VIDI VICI −→ 220514092209040922090309 TU QUOQUE MI FILI −→ 2021172115172105130906091209 ALEA JACTA EST −→ 011205011001032001051920 Pour déchiffrer les messages, il suffit de regrouper les chiffres 2 par 2 et d’utiliser la clef pour leur attribuer la lettre correspondante. Une fois finie, le texte clair apparaı̂t et le message est déchiffré. On peut se rendre que ces systèmes sont peu résistants. En effet, pour rendre la tâche du cryptanaliste difficile, il est important de concevoir des systèmes tels que le texte chiffré ait un aspect aléatoire sinon il serait trop simple à déchiffrer. Pour cette raison, ainsi que pour le problème de la confidentialité dans l’échange de données, une cryptographie à clé publique, ou cryptographie asymétrique a vu le jour. 1.2 Cryptographie à clef publique Etant donné que la cryptographie à clef secrète était peu résistante , la cryptographie moderne a évolué pour devenir ce qu’on appelle maintenant la cryptographie à clé publique ou asymétrique. Cependant, cette cryptographie est apparue très tardivement, en 1976 avec Diffie et Hellman, c’est donc une science très récente. La cryptographie à clef publique repose sur la notion de fonction à sens unique dont nous allons donner la définition. 6 Définition 1. Une fonction f : E → F est dite à sens unique si : – Il est possible de calculer simplement f (x) à partir de n’importe quel x – Pour la plupart des y ∈ f (E) , il n’est pas possible de trouver un x tel que f (x) = y, sauf en faisant un nombre prohibitif d’opérations ou en ayant une chance sur laquelle il est déraisonnable de compter. En réalité, on peut donc dire que les fonctions à sens unique sont des fonctions qu’il est difficile d’inverser, voire même impossible sauf si on connaı̂t la clef privée. Il faut cependant préciser qu’il faut prendre E suffisamment grand pour empêcher ou rendre dérisoire une recherche exhaustive parmi tous les antécédents possibles. 1.3 Clef publique contre Clef privée La clef secrète a longtemps été utilisée mais un dilemme s’est toujours posé : pour établir un canal sûr, on utilise la cryptographie mais la cryptographie à clef privée nécessite un canal sûr. La clef publique, elle, répond à ce dilemme. En effet, lorsque l’on utilise une clef asymétrique, nous n’avons plus besoin d’avoir un canal sûr pour s’échanger des données puisqu’il y en a certaines qui sont publiques. De plus, l’expéditeur et le destinataire n’ont pas besoin des mêmes clefs pour chiffrer et déchiffrer les messages et ne doivent donc pas s’échanger la clef. En contrepartie, tout le challenge consiste à s’assurer que la clef publique que l’on possède est bien celle de la personne à qui on veut envoyer un message ou de qui on veut recevoir un message, mais nous en reparlerons un peu plus tard. La cryptographie asymétrique répond donc à un besoin majeur de la cryptographie symétrique cependant c’est le mécanisme symétrique qui est le moins coûteux en temps de calcul. En effet, pour les codes symétriques, les clefs sont beaucoup plus petites et le chiffrement ainsi que le déchiffrement sont donc beaucoup plus rapides,ils travaillent de 100 à 1000 fois plus vite, ce qui n’est pas négligeable. Les systèmes actuels, utilisant la cryptographie, sont donc formés ainsi : ils utilisent la cryptographie asymétrique seulement au début, c’est-à-dire pour s’échanger les clefs, qui, elles, seront secrètes, puis ensuite, ces clefs secrètes prendront le relais. Parmi les systèmes actuels, il y a par exemple Internet ou encore les cartes bancaires. 7 Figure 2 – Attaque de l’homme du milieu lors d’une conversation entre Alice et Bob Le dernier inconvénient que l’on pourrait encore présenter pour le chiffrement à clef publique a déjà été effleuré au dessus, il s’agit du problème d’authentification. En effet, avec un chiffrement à clef publique, comment savoir si le message que l’on envoie arrive à la personne souhaitée et que le message que l’on reçoit provient de la bonne personne. Pour cela, des mécanismes d’authentification ont été créés. Comme exemple d’interception des messages lors d’un échange utilisant une clef publique, il y a l’attaque de l’homme du milieu. Supposons qu’Alice et Bob communiquent sur un canal non sur grâce à une clé publique, cette attaque consiste alors à placer un homme au ”milieu” du canal (Oscar), c’est-à-dire qu’il va pouvoir intercepter les données entre Alice et Bob. Le but n’est pas de déchiffrer ce qu’ils vont s’envoyer mais d’intercepter les informations qu’ils s’échangent par rapport à leur clef et de transmettre à l’un et à l’autre des données erronées. En réalité, lorsque Alice va envoyer des informations à Bob, l’homme du milieu va l’intercepter et renvoyer son information à lui et vice versa lorsque c’est Bob qui transmet des informations à Alice. De ce fait, lorsqu’Alice et Bob communiquent, ils croient se parler l’un à l’autre mais en réalité ils communiquent tous les deux avec la tierce personne que l’on nomme l’homme du milieu à juste titre. Contrairement au premier schéma, nous pouvons nous apercevoir que l’homme du milieu n’a pas besoin de la clef pour gêner la transmission entre Alice et Bob. Le but n’est donc pas de déchiffrer les messages mais de les intercepter pour les modifier. Pour éviter ce genre d’attaque, nous pouvons intégrer dans les messages codés un mécanisme d’authentification permettant de garantir la provenance du message chiffré. Pour être sûr de l’expéditeur, on parle de si8 gnature électronique et pour être sûr du destinataire, on parle de certificat électronique. Avant de voir plus en détails des exemples de cryptosystèmes à clef publique, il nous faut rappeler quelques résultats d’algèbre qui sont à la base de nos futurs exemples. 2 Eléments d’Algèbre Ce qui fait sans doute le charme des cryptosystèmes dont on parlera plus tard, est l’apparente simplicité des éléments mathématiques auxquels ils font appel. Nous travaillerons toujours dans un ensemble du type Z/nZ. On supposera acquis les deux théorèmes fondamentaux suivants. Théorème 1 (Théorème de Gauss). Soient (a, b, c) ∈ Z3 . a|bc ⇒ a|c a∧b=1 Théorème 2 (Théorème de Bezout). Soient (a, b) ∈ Z2 . a ∧ b = 1 ⇔ ∃(u, v) ∈ Z2 : au + bv = 1 2.1 Le petit théorème de Fermat Théorème 3 (Petit théorème de Fermat). Soit p un nombre premier et a un entier naturel premier avec p alors : ap−1 ≡ 1 (mod p) (1) Démonstration. Supposons dans un premier temps que p divise l’un des termes de la suite a, 2a, . . . , (p−1)a disons le terme ka. Comme a et p sont premiers entre eux, par le théorème de Gauss p divise k. Ceci est absurde puisque 1 < k < p. Donc p ne divise aucun nombre de la suite a, 2a, . . . , (p − 1)a. On montre maintenant que les restes des divisions de a, 2a, . . . , (p − 1)a par p sont tous différents. En effet, supposons qu’on ait un reste identique pour ka et k 0 a avec k > k 0 , ceci impliquerait que p divise (k − k 0 )a et c’est impossible par le point précédent. Donc à l’ordre des facteurs près, les restes des divisions de a, 2a, . . . , (p − 1)a par p est 1, 2, . . . , p − 1. ⇒ a × 2a × · · · × (p − 1)a ≡ 1 × 2 × · · · × (p − 1) ⇒ ap−1 ≡ 1 (mod p) 9 (mod p) On peut alors prouver un corollaire très utile. Corollaire 1. Soit p un nombre premier et a un entier quelconque alors ap ≡ a (mod p) Démonstration. – Si a ∧ p = 1, par le théorème 1, ap−1 ≡ 1 (mod p). – Sinon, comme p est premier, a ∧ p = p et alors a ≡ 0 (mod p) Dans les 2 cas, a(ap−1 − 1) ≡ 0 (mod p) d’où la conclusion. 2.2 Le groupe multiplicatif Définition 2. Soit n ∈ N. On appelle groupe multiplicatif et on note (Z/nZ)× l’ensemble des éléments inversibles de Z/nZ. On peut caractériser les éléments de ce groupe, la proposition suivante bien connue nous le permet. Proposition 1. (Z/nZ)× = {m ∈ Z/nZ : m ∧ n = 1} Démonstration. m ∈ (Z/nZ)× ⇔ ∃m0 ∈ Z/nZ : mm0 ≡ 1 (mod n) ⇔ ∃k ∈ Z : mm0 + kn = 1 ⇔ m ∧ n = 1 par le théorème de Bezout Ce résultat sera particulièrement utile dans le protocole RSA. 2.3 La fonction ϕ d’Euler Définition 3. On appelle fonction ϕ d’Euler ou indicatrice d’Euler la fonction qui à un entier n associe le nombre d’entiers a premiers à n vérifiant 1 ≤ a ≤ n. La fonction ϕ permet donc d’évaluer le cardinal du groupe multiplicatif (Z/nZ)× . Pour un nombre premier p, ϕ(p) = p − 1. On va énoncer un résultat primordial dans le protocole RSA. 10 Proposition 2. Soient p et q deux nombres premiers distincts alors : varphi(pq) = (p − 1)(q − 1) Démonstration. ϕ(pq) est par définition le nombre d’entiers a : 1 ≤ a ≤ pq premiers à pq. Ces entiers a sont les multiples de p et q. Or, il y a p multiples de q dans l’ensemble {1, . . . , pq} et également q multiples de p. Dans ce dénombrement, on a compté deux fois le terme pq. D’où finalement : ϕ(pq) = pq − (p + q − 1) = (p − 1)(q − 1) 3 3.1 3.1.1 Diffie-Hellman et RSA Echange de clef Diffie-Hellman Principe L’analogie avec le coffre fort Le principe est assez simple. Alice (A) et Bob (B) veulent se communiquer un message confidentiellement. Pour cela, Alice va choisir un coffre fort pour lequel elle possède la clef et l’envoie à Bob tout en le laissant ouvert. Bob va y mettre le message, le refermer et le renvoyer à Alice. Ainsi Alice recevra le coffre fort qu’elle pourra ouvrir puisqu’elle possède la clé mais toutes les personnes intermédiaires ayant transporté le coffre n’auront pas pu intercepter le message. Dans cet exemple, nous voyons bien pourquoi ces systèmes sont également appelés des systèmes asymétriques. En effet, on remarque que Alice et Bob n’ont pas besoin des mêmes informations tous les deux pour pouvoir s’échanger des messages codés. Leur but est donc de trouver S qui leur servira de clé pour un chiffrement traditionnel sans transmettre d’informations sur le canal qui pourraient permettre à des pirates de deviner S. Nous obtenons donc le protocole suivant : – Alice et Bob se mettent d’accord publiquement sur un très grand nombre premier p et sur une racine primitive modulo p que l’on nommera α. – Alice choisit un nombre a tel que a < p mais qu’elle garde secret et elle transmet à Bob αa (mod p). – Bob choisit un nombre b < p qu’il garde secret aussi et transmet à Alice αb (mod p). 11 – Leur secret commun sera donc αab (mod p). A va donc accéder à S en élevant alphab à la puissance a et B , en élevant αa à la puissance b. 3.1.2 Outils mathématiques et algorithmes Le protocole de Diffie-Hellman utilise comme fonction à sens unique l’exponentiation modulaire qui est impossible du point de vue computationnel à inverser pour des nombres très grands. Cependant, il repose aussi sur d’autres aspects mathématiques comme le choix du groupe. En effet, c’est le groupe F∗p qui est utilisé et il a pour propriété d’être commutatif, ce qui est important ici puisque cela nous permet de dire que αab = αba , ce qui fait que A et B obtienne la même clef secrète. Il faut donc que le groupe de départ soit bien choisi et que les nombres utilisés suffisamment grands pour éviter une attaque par recherche exhaustive. Aujourd’hui, si on a un nombre premier p de l’ordre de 300 chiffres et si a et b sont de l’ordre de 100 chiffres, alors il est quasiment impossible à casser. Exponentiation modulaire et logarithme discret Comme son nom l’indique, l’exponentiation modulaire permet de calculer un nombre élevé à une certaine puissance et réduit modulo un autre nombre. Il est inconcevable pour des grands nombres de calculer dans un premier temps ce nombre à la puissance voulue, puis le réduire modulo un autre grand nombre. Ceci serait très coûteux en temps de calcul et en espace mémoire. Il existe des algorithmes nous permettant d’éviter ces problèmes de coût, un algorithme sera décrit ultérieurement. L’inverse de l’exponentiation modulaire est appelée logarithme discret. Le problème du logarithme discret est le suivant : il est facile de calculer b assez rapidement mais si on nous donne bx = y, avec x inconnue, comment pouvons nous calculer x = logb y ? Résoudre le problème du logarithme discret s’avère très difficile dans un groupe fini. x Exemple : (avec de petits nombres) On pose G = (Z/19Z)∗ , b = 2, y = 7.On veut trouver x tel que 7 = 2x car cela correspond au logarithme discret de 7 en base 2 (si b, y ∈ G avec y une puissance de b, alors le logarithme discret de y en base b est x tel que bx = y). La réponse est x = 6 car : 26 = 64 = 19 × 3 + 7. Comme on travaille sur (Z/19Z)∗ , on regarde le reste de la division par 19 qui correspond, dans notre cas, à 7 qui est ce que l’on recherchait. 12 Nous pouvons donc trouver le logarithme discret lorsque nous travaillons sur (Z/qZ)∗ et que la condition suivante est respectée : tous les nombres premiers qui divisent q − 1 sont petits. Avec ces conditions, il y a un algorithme pour trouver le logarithme discret d’un élément y ∈ (Z/qZ)∗ avec la base b. Pour simplifier, nous supposerons que b est un générateur de (Z/qZ)∗ . Nous devons cet algorithme à Silver, Pohlig et Hellman. Première étape : Tout d’abord, il faut calculer les racines pièmes de l’unité pour chaque p premier divisant q − 1. Notons ces racines de la manière suivante : rp,j = bj(q−1)/p) pour j = 0, . . . , p − 1 Avec les rp,j , nous pouvons écrire une sorte de table qui va nous permettre de calculer le logarithme discret de n’importe quel y ∈ (Z/qZ)∗ . Il faut rappeler que l’objectif est le suivant : trouver x, 0 ≤ x ≤ q − 1 tel que bx = y. Q On sait que si q −1 = p pα est la factorisation en nombres premiers de q −1, alors il suffit de trouver x (mod pα ) pour chaque p divisant q − 1. Ensuite, on peut appliquer le théorème des restes chinois pour trouver x et conclure. Deuxième étape : Maintenant, on va fixer un nombre premier p divisant q − 1 et on va montrer comment déterminer x (mod pα ). On suppose que : x ≡ x0 + x1 p + x2 p2 + · · · + xα−1 pα−1 (mod pα ) avec 0 ≤ xi < p Pour trouver x0 , on calcule y (q−1)/p , on obtient ainsi une puissance pième de 1 car y q−1 = 1. En effet , comme b est un générateur de (Z/qZ)∗ : bq = b ⇒ bq−1 = 1 ⇒ b(q−1)x = 1 Comme bx = y , on obtient donc y q−1 = 1. Il s’en suit que y (q−1)/p = bx(q−1)/p = bx0 (q−1)/p . En effet, si on remplace x par la formule donnée au début, on obtient : 13 bx(q−1)/p = b(x0 +x1 p+···+xα−1 p α−1 )(q−1)/p = bx0 (q−1)/p bx1 (q−1) bx2 p(q−1) . . . bxα−1 p α−2 (q−1) = bx0 (q−1)/p = rp,x0 = (b(q−1)/p )x0 = y (q−1)/p Troisième étape : Finalement, on compare y (q−1)/p avec la table des {rp,j } pour j compris entre 0 et p (strictement plus petit que p), puis lorsque l’on a trouvé la valeur correspondant à y (q−1)/p dans la table, on prend x0 égal à la valeur de j pour laquelle y (q−1)/p = rp,j . On trouve cette valeur grâce à la table que nous avons pu construire au début en calculant les racines pièmes . Nous avons donc trouver la valeur de x0 , il nous reste à trouver les valeurs de tous les xi . Maintenant, il faut réitérer les étapes pour tous les xi . Pour trouver x1 , on va pratiquer de la même manière sauf que l’on remplace y par y1 avec : y1 = y/bx0 = bx /bx0 = bx−x0 . De ce fait, y1 a pour logarithme discret x − x0 , comme x0 est maintenant connu, on va calculer x1 avec la formule x − x0 ≡ x1 p + x2 p2 + · · · + xα−1 pα−1 2 (mod pα ). On a y (q−1)/p = 1 et on va calculer y (q−1)/p : 2 y (q−1)/p = b(x−x0 )(q−1)/p = b(x1 p+x2 p 2 2 +···+x α−1 p α−1 )(q−1)/p2 α−3 (q−1) = bx1 (q−1)/p bx2 (q−1) bx3 p(q−1) . . . bxα−1 p = bx1 (q−1)/p = rp,x1 (q−1)/p2 Par la suite, on va donc comparer y1 avec les valeurs de la table des (q−1)/p2 rp,j et x1 sera égal à la valeur de j pour laquelle y1 = rp,j . On procède de la même manière pour trouver x2 , x3 , . . . , xα−1 . Travaillons au rang i : y Pour tout i = 1, . . . , p − 1, on pose : yi = x0 +x1 p+···+x i−1 . D’où : i−1 p b yi = b x−x0 −x1 p−x2 p2 −···−xi−1 pi−1 14 Et y a pour logarithme discret : x − x0 − x1 p − x2 p2 − · · · − xi−1 pi−1 ≡ xi pi + · · · + xα−1 pα−1 (mod pα ) De ce fait, on calcule : (q−1)/pi+1 yi 2 −···−x = b(x−x0 −x1 p−x2 p i = b(xi p +···+xα−1) p i−1 p i−1 )(q−1)/pi+1) α−1 )(q−1)/pi+1 = bxi (q−1)p bxi+1 (q−1) bxi+2 p(q−1) . . . = bxi (q−1)p = rp,xi Comme auparavant, on regarde dans la table à quelle valeur correspond (q−1)/pi+1 et on pose xi égal à la valeur de j pour laquelle yi = rp,j . (q−1)/pi+1 yi Dernière étape : Lorsque l’on a effectué cela jusqu’au rang p − 1, on obtient donc x (mod pα ). Après avoir fait cela pour chaque p divisant q − 1, nous obtenons un système de la forme : x ≡ α1 x ≡ α2 .. . x ≡ αr (mod p1 ) (mod p2 ) avec ∀i 6= j, pi ∧ pj = 1 (mod pr ) Or le théorème des restes chinois nous dit que pour un tel système, il existe une solution répondant à toutes les congruences et elle est unique modulo P avec P = p1 p2 . . . pr . De ce fait, nous pouvons conclure et trouver ainsi x. Conclusion : Nous pouvons nous rendre compte que cet algorithme fonctionne bien quand tous les diviseurs premiers de q − 1 sont petits, mais il est clair (q−1)/pi+1 que le calcul de la table des rp,j et la comparaison des yi avec cette table est beaucoup plus longue si q − 1 est divisible par un nombre premier beaucoup plus grand, de l’ordre de 20 chiffres minimum. C’est pour cela que les chiffres utilisés lors d’échanges de messages utilisant une clef publique et en particulier les nombres premiers sont très grands et que cette technique a besoin de plus de temps qu’un système à clef privée. 15 3.2 RSA Le système de cryptage RSA a été inventé en 1977 par Ron Rivest, Adi Shamir et Len Adleman. C’est un essayant de démontrer que l’idée de système à clef publique introduit par Diffie et Hellman était une incohérence que les trois auteurs, devant leur échec, découvrirent ce système qui devint rapidement une référence. Encore aujourd’hui le cryptosytème RSA est partout, dans les cartes à puces de cartes bancaires, dans les messageries . . . 3.2.1 Avantages et inconvénients du cryptosystème L’inconvénient majeur de RSA est le temps de calcul plus long que chez les algorithmes à une seule clef. En effet, dans ce cryptosytème la clef de codage est différente de la clef de décodage, c’est un système ”asymétrique”. L’atout majeur de RSA est sa sécurité. Celle-ci repose sur la facilité, pour les deux personnes voulant échanger des messages, de créer un grand nombre à partir du produit de deux grands nombres premiers (par des algorithmes probabilistes) et sur l’immense difficulté pour un intercepteur malveillant de retrouver la factorisation en deux nombres premiers pour le grand nombre ainsi généré et donc casser le système. Le cryptosystème RSA est basé sur des résultats mathématiques très simples, connus depuis le XVIIIème siècle. Enfin, un atout propre aux cryptosystèmes à clef publique est de ne pas avoir besoin d’un canal sécurisé pour échanger une clef. 3.2.2 Le protocole RSA Nous appellerons dans cette partie Alice l’émetteur du message et Bob la destinataire. – Bob génère deux grands nombres premiers p et q par des algorithmes probabilistes. Il calcule n = pq. Il détermine un entier e tel que e ∧ ϕ(n) = 1 (on rappelle que ϕ(n) = ϕ(pq) = (p − 1)(q − 1)). Bob en profite pour déterminer d tel que : ed ≡ 1 (mod ϕ(n)) . – Bob envoie (n, e) à Alice, ce sera sa clef de codage (publique). (n, d) sera la clef de décodage de Bob (secrète). – Alice code son message chiffré M en calculant via l’exponentiation modulaire : M e (mod n) et elle envoie son résultat C à Bob. 16 – Bob décode le message en calculant C d (mod n) En effectuant ce dernier calcul, Bob retombera bien sur le message initial. Ceci est garanti par le résultat suivant communément appelé théorème du RSA. 3.2.3 Le théorème du RSA Théorème 4 (Le théorème du RSA). Soient p et q deux nombres premiers , on pose n = pq. Si le nombre e est un entier premier avec le nombre ϕ(n) = (p − 1)(q − 1) alors il existe un entier d positif tel que ed ≡ 1 (mod ϕ(n)) et pour cet entier d et un entier A quelconque on a : Aed ≡ A (mod n) Démonstration. On sait que e ∧ (p − 1)(q − 1) = 1. Ceci implique que e est inversible dans Z/(p−1)(q−1)Z. D’où l’existence et même l’unicité d’un tel d. Posons B ≡ Ae (mod n). On a alors B d ≡ Aed (mod n). ed ≡ 1 (mod (p − 1)(q − 1)) ⇒ ∃k : ed = k(p − 1)(q − 1) + 1 D’où : Aed = Ak(p−1)(q−1)+1 = (Ap )(q−1)k A1−(q−1)k Or, on sait par le corollaire 1 page 10 que Ap ≡ A (mod p). Aed ≡ A(q−1)k+1−(q−1)k ≡ A (mod p) (mod p) De même, Aed ≡ A (mod q) 0 0 On en déduit alors qu’il existe l et l tel que Aed = lp + A = l q + A et 0 00 donc lp = l q. Cette dernière quantité s’écrit également l pq pour un certain 00 l car p et q sont des nombres premiers. Ainsi Aed ≡ A (mod pq) On a donc pour le moment décrit et justifié la méthode RSA, Alice et Bob peuvent donc s’échanger des messages de manière sure grâce à ce protocole, mais un problème se pose imaginons que Oscar intercepte la clef publique que Bob envoie à Alice, il peut alors très bien crypter un message en se faisant passer pour Alice. Il est donc indispensable d’avoir une façon de savoir si la personne qui nous envoie un message est bel et bien celle dont on attend le message. 17 3.2.4 La signature dans RSA Il parait raisonnable de penser qu’Alice et Bob auront plusieurs messages à s’échanger. Désormais, on considérera donc qu’Alice et Bob possèdent chacun une clef privée et une clef publique. Autrement dit avec les notations précédentes, la clef privée de Bob est (n, d), la clef publique associée destinée à Alice est (n, e). De son côté, Alice a procédé de la même manière que Bob pour créer le triplet (n0 , e0 , d0 ) où n0 = p0 × q 0 est le produit de deux nombres premiers, e0 ∧ ϕ(n0 ) = 1 et e0 d0 ≡ 1 (mod ϕ(n0 )). Sa clef privée est (n0 , d0 ) et la clef publique destinée à Bob est (n0 , e0 ). Pour résumer : Clef publique Clef privée Alice (n, e) (n0 , d0 ) Bob (n0 , e0 ) (n, d) Pour signer son message, Alice crypte sa signature M grâce à sa clef privée (n0 , d0 ), elle obtient M 0 , puis elle crypte M 0 grâce à la clef publique (n, e), elle obtient M 00 et elle l’envoie avec son message à Bob. Bob décrypte M 00 grâce à sa clef privée (n, d), par le théorème du RSA, il tombe sur M 0 , puis il utilise sa clef publique (n0 , e0 ) pour retomber sur M toujours en vertu du même théorème. Ainsi par un procédé très simple et qui n’utilise rien de plus que le protocole en lui même, Alice est certaine que le message qu’elle reçoit vient de Bob. 4 Tests de primalité Pour faire fonctionner un algorithme de cryptage/décryptage type RSA, on a besoin de grands nombres premiers. Des nombres premiers trop petits représenteraient un danger pour la sécurité du système. Théorème 5 (Théorème des nombres premiers). Le nombre de nombres premiers inférieurs ou égaux à x noté π(x) vérifie π(x) ∼ x ln x Ce théorème nous donne le nombre moyen de tirages qu’il faut effectuer pour avoir un nombre premier. Si p est choisi au hasard, la probabilité qu’il soit premier est ln1p . 18 Il faut donc utiliser des algorithmes ”probabilistes” pour un tester si le nombre tiré est non premier ou probablement premier. Ces algorithmes ne nous procurerons pas la certitude intégrale que p est premier. Si p passe le test on dira qu’il est premier avec forte probabilité. On pourra se proposer de tester des nombres impairs à la structure bien particulière comme par exemple les nombres de Mersenne. Définition 4. Un nombre de Mersenne est un nombre du type 2n − 1 où n∈N Pour tester la primalité, on a besoin d’un critère de primalité. Si le nombre à tester n0 passe ce critère avec succès dans un cas particulier, il est peut-être premier. Si n0 passe avec succès le critère dans tous les cas, il est premier avec forte probabilité. Sinon il est composé. En général, trouver une factorisation pour montrer qu’un nombre est composé est très gourmand en temps de calcul. Le premier test auquel on pourrait penser serait à partir de n0 à tester, de prendre m 6= 1 au hasard et tester si m divise n0 . Si ce n’est pas le cas, on choisit un autre m et ainsi de suite. Evidemment, ceci est laborieux pour de grands nombres ! 4.1 Un premier test basé sur le petit théorème de Fermat Définition 5. Soit n est un entier impair composé et b un entier tel que b soit premier avec n. Si bn−1 ≡ 1 (mod n) alors n est appelé pseudo-premier Par exemple, 91 est un pseudo-premier dans la base 3. Proposition 3. Soit n un entier impair composé. 1. Les propositions suivantes sont équivalentes : – n est pseudo-premier dans la base b où b ∧ n = 1 – Ord(b) dans (Z/nZ)∗ divise n − 1 2. Si n est premier dans les bases b1 et b2 alors il l’est dans les bases b1 b2 et b1 b−1 2 3. Si n échoue à ce test pour b ∈ (Z/nZ)∗ alors n échoue aussi pour au moins la moitié des bases b ∈ (Z/nZ)∗ possibles. Démonstration. 1. La première proposition est une évidence. 19 2. On a : ⇒ bn−1 bn−1 ≡1 1 2 b1n−1 ≡ 1 (mod n) b2n−1 ≡ 1 (mod n) (mod n) ⇒ (b1 b2 )n−1 ≡ 1 (mod n) Donc n est pseudo-premier dans la base b1 b2 De plus : bn−1 ≡1 2 (mod n) ⇒ (bn−1 )−1 2 dans (Z/nZ)∗ Ainsi : bn−1 ×1 ≡ 1 1 (mod 1) ⇒ b1n−1 ×(b2n−1 )−1 ≡ 1 n−1 (mod n) ⇒ (b1 b−1 ≡1 2 ) Donc n est pseudo-premier dans la base b1 b−1 2 3. Soient b1 , . . . , bs toutes les bases pour lesquelles n est pseudo-premier. Soit b une base pour laquelle b n’est pas pseudo-premier. Si n est pseudo-premier pour chaque bbi alors par la proposition précédente (bbi )b−1 = b est une base pour laquelle n est pseudo premier. Contrai diction. Ainsi, pour bb1 , . . . , bbs , n échoue au test. Donc pour b choisi au hasard, il y a au moins 50% de chance d’échec. Description du test : (donnée n) – Choix aléatoire de b : 0 < b < n. – Calcul de d = b ∧ n par l’algorithme d’Euclide. – On distingue 2 cas : – Si d > 1, n n’est pas premier. – Si d = 1, calcul de bn−1 (mod n) par l’algorithme d’exponentiation modulaire. Si on a 1 alors n passe le test et on passe à un autre b. Sinon n est composé. Si on applique ce test k fois et que n passe le test avec succès dans tous les cas, alors n est probablement premier. Par la proposition 3, la probabilité que n soit composé malgré tout est d’au plus 21k . Définition 6. Un nombre de Carmichaël est un entier composé n tel que ∀b ∈ (Z/nZ)∗ : bn−1 ≡ 1 (mod n) Ces nombres particuliers révèlent une faille dans notre méthode. 20 (mod n) 4.2 Test de Solovay-Strassen Afin de comprendre ce test, nous devons définir certaines notions telles que résidu quadratique, symbole de Legendre et de Jacobi. Définition 7. – Soit p ∈ N un nombre premier, n 6= 2 et x ∈ N tel que 1 ≤ x ≤ p − 1. On dit que x est un résidu quadratique modulo p si la congruence y 2 ≡ x (mod p) a une solution y ∈ Z/pZ. – Soit a un entier et p > 2 un nombre premier. On définit le symbole de Legendre comme suit : b 0 si p divise a 1 si a est un résidu quadratique modulo p = n −1 sinon – Soit a un entier, et soit n un entier positif impair. Soit n = pα1 1 , . . . , pαr r la décomposition en facteurs premiers de n. On définit le symbole de Jacobi ( na ) comme le produit des symboles de Legendre pour les facteurs premiers de n : a a α1 a αr = ... n p1 pr Le test est inspiré de la proposition suivante. Proposition 4. Si n est premier alors pour tout entier b ; b n−1 2 ≡ b n (mod n) (2) Ici bien sur, les symboles de Jacobi et de Legendre coincident. Démonstration. – Si n divise b, d’une part ( nb ) = 0, d’autre part n divise n−1 n−1 b 2 et donc b 2 ≡ 0 (mod n). La congruence est donc vrai dans ce cas. – Si n ne divise pas b, on applique le petit théorème de Fermat : bn−1 ≡ 1 ⇒b n−1 2 ≡ ±1 (mod n) (mod n) Soit g un générateur de (Z/nZ)∗ , pour un certain j on a b = g j . Si j est pair, il existe i tel que j = 2i, et alors b = g 2i = (g i )2 , donc b est résidu quadratique modulo n, il s’en suit ( nb ) = 1. 21 Réciproquement, si b est un résidu quadratique modulo n, il existe a tel que a2 = b, ainsi si b = g j et a = g i , on a j = 2i, d’où j est pair. D’autre part, b n−1 2 j = (g 2 )p−1 ≡ 1 (mod n) si et seulement si j/2 ∈ N par Fermat ≡ 1 (mod n) si et seulement si j est pair Ceci conclut la preuve. Grâce à cette proposition, on peut définir une notion de pseudo-premier propre à ce test. Définition 8. Soit n est un entier composé impair, soit b tel que b ∧ n = 1 tel que (2) soit vérifiée alors on dit que n est un pseudo-premier d’Euler dans la base b. Description du test : (donnée n) – Choisir b tel que 0 < b < n n−1 – Calculer b 2 (mod n) et ( nb ) (mod n) – Si il n’y a pas égalité, n est composé, et on s’arrête. – Si il y a égalité, n passe le test, et on choisit un autre b. Si au bout de k itérations, l’égalité est vérifiée à chaque fois, alors n est probablement premier. Si on teste tous les b possibles, et que l’égalité reste vraie, alors n est premier avec forte probabilité. On peut s’intéresser maintenant à la fiabilité du test. Proposition 5. Si n est un entier composé impair alors n est un pseudopremier d’Euler pour au plus 50% des bases b possibles. Démonstration. On construit dans un premier temps une base b telle que (2) ne soit pas satisfaite. Supposons qu’il existe p premier tel que p2 divise n, on choisit b = 1 + n/p alors ( nb ) = 1 mais la partie gauche de (2) n’est pas congrue à 1 (mod n) comme p ne divise pas (n−1)/2. Supposons maintenant que n est le produit de nombres premiers distincts avec p l’un d’entre eux. On choisit s un non-résidu quadratique modulo p et soit b : 1 ≤ b < n satisfaisant aux congruences : b ≡ s (mod p) b ≡ 1 (mod n/p) 22 Un tel b est trouvé par le théorème des restes chinois. Alors ( nb ) = −1 mais, b(n−1)/2 ≡ 1 (mod n/p) et b(n−1)/2 6= −1 (mod n) On a alors construit une base b telle que (2) n’est pas satisfaite. Soient bi : 1 ≤ i ≤ t tous les entiers vérifiant (2), avec toujours la condition ∀i, bi ∧n = 1. Posons ui = bbi (mod n). Ils sont tous distincts et vérifient ui ∧ n = 1. Si l’un des ui satisfaisait (2), on aurait : b b i (n−1)/2 b(n−1)/2 bi ≡ (mod n) n n Comme les bi vérifient (2), on en déduit : b (n−1)/2 (mod n) b ≡ n Ceci est faux par construction de b. Ainsi aucun des ui ne vérifie (2) et alors il y a au moins autant de bases qui ne vérifient pas la relation qu’il y en a pour lesquelles la relation est satisfaite. Grâce à cette proposition, on prouve que pour k itérations, la probabilité que n passe le test tout en étant composé est d’au plus 21k . Ce test est donc aussi fiable que le précédent, nous allons maintenant voir un dernier test plus raffiné. 4.3 Test de Miller-Rabin L’idée du critère découle de la conclusion du petit théorème de Fermat. Si on extrait successivement les racines carrées de chaque côté, si n est premier alors la première classe autre que 1 qu’on peut avoir est -1 car ±1 sont les seules racines carrées de 1 modulo un nombre premier. En pratique, on extrait pas des racines carrées mais on fait l’inverse, après avoir compilé bt (mod n) où t impair est tel que n − 1 = 2s t, on élèvera successivement au carré. Comme dans les tests précédents, on définit une notion de pseudo-premier. Définition 9. Soit n un entier positif, composé et impair. On pose n−1 = 2s t avec t impair. Soit b ∈ (Z/nZ)∗ . Si n et b vérifient : t b ≡ 1 (mod n) ou (3) 2r t ∃r : 0 ≤ r < s tel que b ≡ −1 (mod n) alors s est appelé pseudo-premier fort. 23 Description du test : (donnée n) – Mettre n − 1 sous la forme 2s t où t est impair. – Choisir au hasard b tel que 0 < b < n. – Calculer bt (mod n) – Si on obtient 1 ou −1, n passe le test avec succès et on passe à un autre choix de b. – Sinon, élever au carré successivement jusqu’à obtenir −1 (s itérations au maximum) – Si ceci se produit, n passe le test avec succès et on passe à un autre b. – Sinon, n est composé. Il est légitime de se demander si ce test est meilleur que les tests précédents. Nous avons un tel résultat, mais avant cela nous devons énoncer 3 lemmes 1 . Lemme 1. Si n est pseudo-premier fort dans la base b alors n est un pseudopremier d’Euler et par suite n est pseudo-premier Lemme 2. Soit d = k ∧ m, alors il existe exactement d éléments dans le groupe {g, g 2 , . . . , g m = 1} qui vérifient xk = 1. 0 Lemme 3. Soit p un nombre premier ≥ 3, on pose p − 1 = 2s t0 où t0 impair. r Le nombre de x ∈ (Z/pZ)∗ qui vérifient x2 t ≡ −1 (mod p) (où t est impair) est égal à 0 si r ≥ s0 et égal à 2r (t ∧ t0 ) si r < s0 . Proposition 6. Si n est un entier composé impair alors il est pseudo-premier fort dans la base b pour au plus 25% des b tels que 0 < b < n. Démonstration. On distinguera 3 cas. 1. Supposons qu’il existe p premier tel que p2 divise n. On pose n−1 = 2s t avec t impair. Supposons que n soit pseudo-premier dans la base b, alors bn−1 ≡ 1 (mod n). Dans ce cas, bn−1 ≡ 1 (mod p2 ). Notons que (Z/p2 Z)∗ est un groupe cyclique. Autrement dit, ∃g tel que (Z/p2 Z)∗ = {g, g 2 , . . . , g p(p−1) = 1} D’après le lemme 2, bn−1 ≡ 1 (mod p2 ) arrive exactement d fois où d = n − 1 ∧ p(p − 1). On sait que p divise n donc p ne divise pas n − 1 et alors p ne divise pas d. Donc le d maximal envisageable est p − 1. 1. Les démonstrations sont données dans A course in number theory and cryptography de Niel Koblitz 24 Donc la probabilité que bn−1 ≡ 1 (mod p2 ) se produise sera inférieure 1 1 1 à pp−1 2 −1 = p+1 et p+1 ≤ 4 . En particulier par le lemme 1, le résultat est vrai pour les pseudopremiers forts. 2. Supposons que n = pq où p et q sont des nombres des premiers. 0 00 Posons p − 1 = 2s t0 et q − 1 = 2s t00 , et s0 ≤ s00 . Sous ces conditions, n est pseudo-premier fort dans la base b si l’une des deux propriétés suivantes est vérifiée : – bt ≡ 1 (mod p) et bt ≡ 1 (mod q) r r – ∃r : 0 ≤ r < s tel que : b2 t ≡ −1 (mod p) et b2 t ≡ −1 (mod q) Par le lemme 2, le nombre de possibilités pour la première proposition est (t ∧ t0 )(t ∧ t00 ) < t0 t00 . Par le lemme 3, le nombre de possibilités pour la seconde proposition est 2r (t ∧ t0 ) × 2r (t ∧ t00 ) < 4r t0 t00 . 0 00 Comme n − 1 > φ(n) = (p − 1)(q − 1) = 2s +s t0 t00 , voici un majorant de la proportion des b pour lesquelles n est un pseudo-premier fort : 0 0 M= 4s − 1 t0 t00 + t0 t00 + 4t0 t00 + · · · + 4s −1 t0 t00 −s0 −s00 ) = 2 × (1 + 2s0 +s00 t0 t00 4−1 0 4s − 1 −s0 −s00 ) =2 × (1 + 3 Si s00 > s0 , 0 2 4s 2 1 0 M ≤2 ×( + ) = 2−2s −1 × + 3 3 3 6 2 1 1 −3 ≤2 ×( + )= 3 6 4 −2s0 −1 Si s” = s0 , on prouve que l’une des 2 inégalités t ∧ t0 ≤ t0 et t ∧ t00 ≤ t00 doit être stricte. En effet, supposons t0 divise t et t00 divise t, on a n − 1 = 2s t ≡ 0 (mod t0 ) mais : n − 1 = pq − 1 = (p − 1)(q − 1) + (q − 1) ≡ q − 1 (mod t0 ) 0 On en déduit alors que t0 divise q − 1 = 2s t00 et alors t0 divise t00 . De même t00 divise t0 . Ceci implique t0 = t00 et alors p = q, contradiction. 25 Supposons par exemple que t ∧ t0 < t0 , comme on travaille sur des nombres impairs, on réécrit cette condition ainsi : t ∧ t0 ≤ 31 t0 et dans ce cas : 0 1 t0 t00 + t0 t00 + 4t0 t00 + · · · + 4s −1 t0 t00 M= 3 2s0 +s00 t0 t00 0 4s 1 1 1 1 1 0 2 )≤ + = < = 2−2s ( + 3 3 3 18 9 6 4 Ceci conclut la preuve pour le cas 2. 3. On suppose enfin que n se décompose en un nombre quelconque de nombres premiers : n = p1 p2 . . . pk pour k ≥ 3. On décompose les facteurs premiers comme précédemment pj − 1 = 2sj tj où tj est impair. On va appliquer la même méthode que dans le cas 2. Quitte à réordonner les termes on peut supposer ∀j ≤ k : s1 ≤ sj . On peut, en utilisant ce qui a été fait auparavant déterminer un majorant de la proportion des bases b possibles pour lesquelles n est un pseudopremier fort : 2−s1 −s2 −···−sk (1 + k k 2ks1 1 2ks1 − 1 −ks1 2 − 2 −ks1 2 − 2 ) ≤ 2 + ) = 2 + k ( k k k k 2 −1 2 −1 2 −1 2 −1 2 −1 1−k k 1 2−2 2 −2 + k = k = 21−k ≤ 2−k k 2 −1 2 −1 2 −1 1 ≤ 4 Cette proposition assure que si on teste avec succès k fois un nombre grâce à ce test, la probabilité qu’il soit pseudo-premier fort est d’au plus 1/4k . Ceci en fait un test plus fiable que les 2 tests précédents. 5 Programmation Il est évident que l’intérêt de la cryptographie n’est pas théorique, on se propose donc de mettre en application certains protocoles énoncé sous scilab. 26 5.1 Tests de primalité On va tester dans cette partie des nombres de Mersenne qu’on génère aisément ainsi : function[M]=mersenne(n) format(25) ; M = 2n − 1 ; endfunction ; Test basé sur le petit théorème de Fermat L’algorithme pour le premier test que nous avons étudié et pour une itération est le suivant : function[P1]=test1(n,b) temp=0 ; P1=0 ; d=euclide(b,n) ; if d > 1 then ; P1=0 ; end ; if d==1 then ; temp=expmod(b,n-1,n) ; end ; if temp==1 then ; P1=1 ; end ; endfunction ; Et pour k itérations : function[P]=testprim(n,k) P=0 Vect=int((n-1)*rand(1,k)+ones(1,k)) ; VectP=zeros(1,k) ; for i=1 :k ; VectP(i)=test1(n,Vect(i)) ; end ; if norm(VectP,1)==k then ; P=1 ; end ; endfunction ; 27 Ce programme nous permet de vérifier la primalité de nombres tels que mersenne(7) = 127 et mersenne(19) = 524287 qu’on utilisera par la suite, mais les nombres de Carmichaël mettent en échec ce test, on va donc coder un test plus sur. Test de Miller-Rabin function[Res]=millerrabin(n,p) s = 1; P = zeros(p, 1) ; Res = 0; while int((n − 1)/2s ) == (n − 1)/2s s = s + 1 ; end s=s−1 t = (n − 1)/2s for i = 1 : p b = int(((n − 2) ∗ rand(1) + 1)) ; a = expmod(b, t, n) if a == 1 then ; P (i) = 1 ; end ; if a == n − 1 then ; P (i) = 1 ; end ; if a < n − 1 and a > 1 then ; iter = 0 while expmod(a, 2, n) < n − 1 and iter < s − 1 ; a = expmod(a, 2, n) iter = iter + 1 end ; if iter < s − 1 then ; P (i) = 1 end ; end ; end ; if norm(P, 1) == length(P ) then ; Res = 1 end ; endfunction 28 5.2 Le protocole RSA Nous avons tout d’abord besoin de l’algorithme d’Euclide. function[pgcd]=euclide(a,b) r=modulo(a,b) while r>0 a=b ; b=r ; r=modulo(a,b) ; end pgcd=b endfunction Le protocole repose sur l’algorithme d’exponentiation modulaire, dont on donne une version par la méthode binaire. Un premier programme nous permet de déterminer la puissance de 2 maximale dans un nombre. function[p]=binaire1(n) temp = n i=0 while 2i ≥ temp i=i+1 end p=i−1 endfunction Voici maintenant un programme qui convertit un nombre en version binaire. function[p]=binaire(n) j=1 temp=n while temp > 0 ; [P (j)] = binaire1(temp) ; temp = temp − 2P (j) ; j = j + 1 ; end ; p = zeros(1, P (1) + 1); f ori = 1 : length(P ); p(P (i) + 1) = 1 ; end ; endfunction function[C]=expmod(M,e,N) 29 C=M E = binaire(e) k = length(E) for i = k − 1 : −1 : 1 C=modulo(C*C,N) if E(i)==1 then ; C=modulo(C*M,N) end ; end ; endfunction ; Il nous faut également un algorithme permettant de calculer l’inverse modulaire d’un nombre. C’est une variante de l’algorithme d’Euclide étendu 2 . function[c]=inversemod(n,b) c=0 b0 = b n0 = n t0 = 0 t=1 q = int(n0/b0) r = n0 − q ∗ b0 while r > 0 temp = t0 − q ∗ t if temp ≥ 0 then temp=modulo(temp,n) ; end if temp < 0 then temp=n-modulo(-temp,n) ; end t0 = t t = temp n0 = b0 b0 = r q = int(n0/b0) r = n0 − q ∗ b0 end ; c=modulo(t,n) endfunction Désormais, nous somme en mesure de démarrer la procédure. Admettons que Bob ait déterminé p et q. Il détermine l’exposant e premier avec 2. L’algorithme non modifié provient de Cryptography : Theory and practice de Douglas R. Stinson 30 (p − 1)(q − 1) grâce à l’algorithme suivant : function[e]=detexpo(p,q) e=int(((p-1)*(q-1)-3)*rand(1)+2) ; while euclide(e, (p − 1) ∗ (q − 1)) > 1 ; e=e+1 ; end ; endfunction Alice, lorsqu’elle a reçu la clef publique peut coder son message grâce à l’exponentiation modulaire. Elle utilisera le code ASCII pour transcrire les lettres en chiffres. On récupéra un vecteur de taille le nombre de caractère du message. On ”accolera” alors les termes de ce vecteur 2 par 2 afin de créer un nouveau vecteur dont les composantes sont d’au plus 6 décimales, et c’est à ces composantes qu’on appliquera l’exponentiation modulaire. function[M2]=cryptRSA(M1,e,n) format(25) temp=ascii(M1) if length(temp)/2 > int(length(temp)/2) then ; temp=[temp,0] end ; temp2=matrix(temp,2,length(temp)/2)’ temp3 = temp2(:, 2) + temp2(:, 1) ∗ 103 for i=1 :length(temp3) M2(i)=expmod(temp3(i),e,n) end ; endfunction Bob calcule l’inverse de d via l’inversion modulaire et décrypte avec l’exponentiation modulaire. function[M]=decryptRSA(p,q,e,M2) d=inversemod((p-1)*(q-1),e) ; for i=1 :length(M2) M3(i)=expmod(M2(i),d,p*q) ; end ; M 4 = int(M 3/103 ) M 5 = M 3 − M 4 ∗ 103 M6=[M4,M5] M=[] 31 for i=1 :size(M6,1) M=[M,M6(i, :)] end ; M=ascii(M) endfunction ; Exemple Supposons que Alice veuille faire découvrir à Bob Demain dès l’aube... de Victor Hugo. Voici les deux premiers vers : Demain, dès l’aube, à l’heure où blanchit la campagne, Je partirai. Vois-tu,je sais que tu m’attends Bob de son côté a choisi p = 27 − 1 = 127 et q = 219 − 1 = 524287 ainsi n = pq = 66584449 et le e déterminé aléatoirement est cette fois 13960129. Alice donne ce test au programme de cryptage sous la forme : ”demaindeslaubealheureoublanchitlacampagnejepartiraivoistujesaisquetumattends” Voici un extrait de ce que reçoit Bob :(il reçoit en fait un vecteur à 38 composantes.) 16308603 55846476 10957829 16308603 62983730 Grâce au programme de décryptage, Bob retombe bien sur le message d’Alice. La fonction tic() ;. . . ; toc() nous permet d’évaluer le temps de calcul. Le cryptage prend aux alentours de 2 secondes, et le décryptage est lui dans ce cas très rapide soit environ 0,2 seconde. Ceci peut paraı̂tre assez rapide, mais il faut se rendre compte qu’on a pris un n très petit par rapport aux n généralement choisis. 32 Conclusion La cryptographie à clef publique et particulièrement RSA ont encore de beaux jours devant eux. Malgré les attaques de plus en plus subtiles et les records de factorisation de plus en plus impressionnants, la sécurité de RSA n’est toujours pas remise en question et il est raisonnable de penser que si une attaque mettait à défaut le cryptosystème, elle resterait secrète encore de longues années ! Cependant, il ne faut pas croire que RSA est considéré comme le cryptosystème ultime, on a cru un temps que les cryptosystèmes basés sur le bien connu problème du sac à dos remplaceraient très vite RSA. Aujourd’hui, ils ont tous (à l’exception d’OTU 3 ) été cassés. Pourquoi donc cela n’arriverait-il jamais pour RSA ? L’utilisation des courbes elliptiques semble être l’avenir proche de la cryptographie à clef publique. Pour casser un tel système, il faudrait résoudre le problème du logarithme discret sur une courbe elliptique ! Dans un avenir plus lointain, beaucoup s’accorde à dire que la cryptographie mathématique sera mise en échec par des ordinateurs quantiques qui sont encore aujourd’hui pure science-fiction. Alors la cryptographie devra évoluer et reposera sur des principes de physique fondamentale. Bibliographie – Neal Koblitz. A course in number theory and cryptography – Gilles Zemor. Cours de Cryptographie – Douglas R. Stinson. Cryptography : Theory and Practice – Arto Salomaa. Public-Key Cryptography – Jean-Guillaume Dumas, Jean-Louis Roch, Eric Tannier, Sébastien Varette. Théorie des codes : Compression, cryptage, correction 3. Okamoto, Tanaka, Uchiyama 33