1 Le cryptage avec la méthode RSA Il faut d’abord une correspondance entre lettres d’un message à coder et nombres. Pour passer d’un message à une suite de nombres, on groupe plusieurs caractères (car sinon on pourrait décrypter le message en utilisant des statistiques de fréquence des caractères en fonction de la langue), le groupement est l’écriture d’un nombre en une base donnée (256 ici correspondant au codage ASCII d’un caractère), par exemple, puisque asc("BONJOUR")=[66,79,78,74,79,85,82], si on groupe par 3, BONJOUR devient les nombres (66*256+79)*256+78=4345678, (74*256+79)*256+85=4869973, (82*256+0)*256+0 =5373952. 0 1 ! 11 + 21 5 31 ? 41 I 51 S 61 ] 71 g 81 q 91 { 2 " 12 , 22 6 32 @ 42 J 52 T 62 ˆ 72 h 82 r 92 | 3# 13 23 7 33 A 43 K 53 U 63 _ 73 i 83 s 93 } 4$ 14 . 24 8 34 B 44 L 54 V 64 ‘ 74 j 84 t 94 ˜ 5% 15 / 25 9 35 C 45 M 55 W 65 a 75 k 85 u 95 ê 6& 16 0 26 : 36 D 46 N 56 X 66 b 76 l 86 v 96 ù 7 ’ 17 1 27 ; 37 E 47 O 57 Y 67 c 77 m 87 w 97 ç 8( 18 2 28 < 38 F 48 P 58 Z 68 d 78 n 88 x 98 à 9) 19 3 29 = 39 G 49 Q 59 [ 69 e 79 o 89 y 99 è 10 * 20 4 30 > 40 H 50 R 60 n 70 f 80 p 90 z 100 é = Tartampion choisit deux grand nombres premiers p et q et pose n pq, puis il choisit m un nombre premier avec p q (par exemple il prend pour m un nombre premier plus grand que p = et que q = ). Il calcule l’entier u pour que um p q (d’après l’identité de Bézout il existe des entiers u et v tel que um vp q ). Puis il met dans l’annuaire les nombres u et n (quand n est grand p et q sont difficiles à obtenir à partir de n), le couple u; n est la clé publique alors que m; n est la clé secréte qui va servir à décoder le message : bien sûr p et q restent secrets car sinon n’importe qui peut calculer m en fonction de u avec l’identité de Bézout. La fonction de codage f est la suivante : à un entier a (de préférence premier avec pq , c’est le cas si a < p et a < q ), f fait correspondre au n. Par exemple, BONJOUR codé par les nombres 4345678, 4869973, 5373952. qui seront transformés par f en 156330358492191937, 126697584810299952, 50295601528998788 car powmod(4345678,u,n)=15633035849219193 etc... ( ) ( 1)( 1) ( 1) 2 ( 1) 2 = 1 mod ( 1)( 1) = 1 + ( 1)( 1) ( ) mod La fonction de décodage g est la suivante : à un entier b, g on fait correspondre bm n. Pour décoder l’exemple, on a : powmod(15633035849219193,m,n)=4345678 etc... Pour montrer que g f a a, on utilise le petit théorème de Fermat : si p et q sont premiers, si n pq et si a est premier avec n alors : mod a(p q 1)( 1) ( ( )) = = = 1 mod n On peut appliquer ce théorème ici car : p et q sont premiers, n = pq et a est premier 1 avec n puisque a < p et a < q donc av(p 1)(q 1) = 1v = 1 mod n on a donc bien : u um v (p 1)(q 1) g(f (a)) = g(a ) mod n = a mod n = a a mod n = a Un exemple : p = 123456791 et q = 1234567891 : n = p q = 152415790094497781 ' = (p 1)(q 1) = 152415788736473100 m = 12345701 (m est un nombre premier et m ne divise pas ') On cherche u en tapant inv(m%') on trouve : (-36645934363466299) % 152415788736473100 et on a : u= 36645934363466299 + ' = 115769854373006801 Pour coder, on utilise la clé publique u et n et pour décoder, on utilise la clé secréte m et n. Exemple avec xcas examples/arit/rsa.cxx ->chaine2n("BON")=4345678 etc. u:=115769854373006801; n:=152415790094497781; l:=codrsa("BONJOUR",u,n); m:=12345701; n:=152415790094497781; decodrsa(l,m,n); 2