ECOLE CENTRALE DE NANTES PROJET DE VEILLE TECHNOLOGIQUE Panorama des algorithmes de cryptage d’information Henri DER SARKISSIAN, Pierre BELLOUARD Sommaire Introduction _______________________________________________________________ 3 Cadre de l’étude ________________________________________________________________ 3 Cryptographie symétrique ____________________________________________________ 4 L’AES _________________________________________________________________________ 5 Algorithme de hachage SHA-1 _____________________________________________________ 8 IDEA (International Data Encryption Algorithm) ______________________________________ 10 L’algorithme Blowfish ___________________________________________________________ 12 L’algorithme Serpent ___________________________________________________________ 14 L’algorithme RC6 _______________________________________________________________ 16 Comparaison de différents algorithmes ____________________________________________ 18 Cryptographie asymétrique __________________________________________________ 19 RSA _________________________________________________________________________ 20 Algorithme d’ElGamal___________________________________________________________ 21 La signature DSA _______________________________________________________________ 22 ECIES ________________________________________________________________________ 24 La cryptographie hybride ____________________________________________________ 25 Conclusion ________________________________________________________________ 26 Bibliographie ______________________________________________________________ 27 Introduction La cryptologie est une discipline mathématique qui comprend deux champs d’étude: - la cryptographie : Conception de mécanismes cryptologiques destiné à garantir la sécurité à des fins de confidentialité, d’authenticité et d’intégrité de l’information - la cryptanalyse : Le déchiffrement de messages cryptés La cryptographie est utilisée depuis l’antiquité, mais depuis l’apparition des ordinateurs, cette discipline a pris une ampleur sans précédente. Ses domaines d’utilisation sont très vastes et vont du domaine militaire au domaine commercial, en passant par l’utilisation privée. Cadre de l’étude Les technologies cryptographiques étant en constante évolution, nous ne nous intéresserons qu’aux algorithmes les plus récents dans ce projet de veille technologique, c’est-à-dire qui datent de 20 ans environ, ou du moins qui sont largement utilisés encore récemment. De plus, nous nous intéresserons aux algorithmes de cryptage d’information au sens large, c’est-àdire de utilisés pour la confidentialité ou pour l’authentification d’information (signatures numériques). On distingue ainsi deux grandes classes d’algorithmes : la cryptographie symétrique ou à clé secrète et la cryptographie asymétrique aussi appelée à clé publique. Cryptographie symétrique La cryptographie symétrique est la plus ancienne forme de cryptographie. Elle est basée sur l’utilisation d’une clé unique qui sert à chiffrer et à déchiffrer le message. L’émetteur et le destinataire ont alors le même niveau d’information. L’AES L’AES (Advanced Encryption Standard), est un algorithme de chiffrement symétrique établi par deux chercheurs belges entre 1998 et 2000 sous le nom de code Rijndael. Cet algorithme a été choisi suite à un concours international organisé par la NIST (National Institute of Standards and Technology), une agence américaine, afin de désigner le successeur de l’algorithme DES qui commençait à montrer ses limites. Principe de l’algorithme On prend en entrée le fichier à chiffrer et une clé générée aléatoirement avec une taille de 128,192 ou 256 bits. Le fichier d’entrée est segmenté en paquets de 16 octets qui remplissent chacun une matrice 4x4 qu’on appelle Store. L’étape suivante consiste à créer des sous-clés de la clé principale afin de faire des opérations sur chacune d’entre elles et sur la matrice Store. Dans des méthodes de chiffrement simples, ces sous-clés peuvent être des parties contigües de la clé principale, mais pour l’AES, la détermination de ces sous-clés est beaucoup plus complexe. Une fois les sous-clés calculées, il reste 10 étapes à effectuer (pour une clé de 128 bits) : Etape 1 : On effectue un ou-exclusif entre la matrice Store et la première sous-clé rangée elle aussi dans une matrice. Etapes 2 à 8 : On effectue : - Une transformation SubBytes (décrite ci-dessous) appliquée cette fois aux éléments de la matrice Store - Une transformation ShiftRows qui consiste à permuter circulairement les lignes de Store un certain nombre de fois en fonction du numéro de la ligne. - Une transformation MixColumns où chaque colonne de Store est multipliée par la matrice : La multiplication est définie de la manière suivante : par 1 l’octet reste inchangé, par 2 on décale l’octet vers la gauche, et par 3 on décale l’octet vers la gauche et on effectue un ou-exclusif avec l’octet qui a été multiplié par 1 - Puis on refait l’étape 1. Etape 10 : On effectue : - La transformation SubBytes - La transformation ShiftRows - L’étape 1 On obtient à la fin une matrice Store chiffrée. Il ne reste qu’à réitérer les opérations sur tous les octets restant du fichier d’entrée. Exemple de détermination des sous-clés Voici l’exemple d’une implémentation en C de la détermination des sous-clés (pour une clé principale de 128 bits) : KeyExpansion(byte Key[4*Nk] word W[Nb*(Nr+1)]) { for(i = 0; i < Nk; i++) W[i] = (Key[4*i],Key[4*i+1],Key[4*i+2],Key[4*i+3]); for(i = Nk; i < Nb * (Nr + 1); i++) { temp = W[i - 1]; if (i % Nk == 0) temp = SubByte(RotByte(temp)) ^ Rcon[i / Nk]; W[i] = W[i - Nk] ^ temp; } } ݈݈ܿ ݈ܽ ݁݀ ݎݑ݁ݑ݃݊é =4 32 ݈݀ ݐ݁ݑݍܽ ݑ݀ ݎݑ݁ݑ݃݊′݁݊ݎݐé݁ ܰ = =4 32 ܰ = 10 ܰ = La fonction KeyExpansion prend en paramètre la clé principale Key qui est rangée par octet (soit 16 cases pour une clé de 128 bits), et le tableau W. W représente des parties contigües des sous-clés: Les 4 premiers octets de la clé sont rangés tel quel dans W. Pour les suivants, on utilise les fonctions RotByte, SubByte et Rcon. RotByte effectue une permutation circulaire sur chaque octet qui compose W. Par exemple, si W est composé de 4 octets a,b,c,d rangés dans cet ordre, on obtiendra en sortie (b,c,d,a). SubByte est une transformation affine définie de la manière suivante : Pour chaque octet, on prend son inverse dans le corps fini GF(28) qu’on met dans un vecteur de 8 bits [x0, …, x7]. Puis on applique la transformation suivante : Rcon est un tableau de 255 cases définie par : ݊ܿݎሺ݅ሻ = ݔሺଶହସାሻ ݉ ଼ ݔ ݀+ ݔସ + ݔଷ + ݔ+ 1 en héxadécimal Soit ݊ܿݎሺ255ሻ = {8d, 01, 02, 04, 08, … . . , 3a, 74, e8, cb} Algorithme de hachage SHA-1 Le chiffrement par hachage sert à former des condensats de fichier afin entre autre d’identifier l’auteur du fichier. Pour chaque fichier en entrée, il existe un condensat unique en sortie sauf bien évidemment dans le cas où on arrive à trouver une collision. Ce condensat a une taille unique. Dans le cas de SHA-1 (Secure Hash Algorithm), cette taille est de 160 bits. Mais celle-ci peut aller jusqu’à 512 bits, ce qui offre un nombre déjà très important de condensats. Principe de calcul des condensats Initialisation Le fichier d’entrée est d’abord adapté de manière à ce que sa taille soit un multiple de 512 bits. Pour cela, on rajoute un bit 1 à la fin du fichier puis un certain nombre de bits 0 tel qu’on puisse insérer le nombre 1 en binaire dans les 64 derniers bits. Typiquement, on cherche la solution à l’équation : ܮ+ 1 + ݇ = 448 ݉ ݈ݑ݀512, k étant le nombre de zéro à rajouter et L la taille initiale du fichier. , Ensuite, on effectue la division par blocs de 512 bits qu’on stocke sur : M(1) M(2), …, M(N). On va diviser ensuite chacun de ces « mots » en 16 sous-mots de 32 bits qu’on va stocker dans : M0(i),M1(i) ,M2(i), M3(i) , M4(i) pour le ième mot. On initialise ensuite les 5 variables suivantes en hexadécimal: ܪ ሺሻ ← 67452301 ܪଵ ሺሻ ← EDCDAB89 ܪଶ ሺሻ ← 98BADCFE ܪଷ ሺሻ ← 10325476 ܪସ ሺሻ ← 3D2E1F0 On va utiliser aussi les variables locales suivantes : - un tableau de 80 mots, qu’on note W0, W1, …, W79 - 5 variables a,b,c,d,e - 5 variables contenant les valeurs de hachage, notées H0(i), H1(i), H2(i) ,H3(i),H4(i) - une variable T de 32 bits. Algorithme Pour i=1 à N { On remplit le tableau Wt tel que Pour t entre 0 et 15 : Wt ←Mt(i) Pour t entre 16 et 79 : Wt ←ROT L1 (Wt-3 xor Wt-8 xor Wt-14 xor Wt-16 ) 1 //avec ROT L la rotation d’un bit vers la gauche, et xor : ou exclusif On fait ensuite: a ←H0(i-1) b ←H1(i-1) c ←H2(i-1) d ←H3(i-1) e ←H4(i-1) Pour t=0 à 79 { T ←ROTL5(a) + ft(b,c,d) + e + Kt + Wt 5 // avec ROTL la rotation de 5 bits vers la gauche // f définit de la manière suivante // pour t entre 0 et 19 : ft (x,y,z) = (x & y) xor ( -x & z) // pour t entre 20 et 39 : ft (x,y,z) = x xor y xor z // pour t entre 40 et 59 : ft (x,y,z) = (x & y) xor ( x & z) xor ( y & z) // pour t entre 60 et 79 : ft (x,y,z) = xor y xor z e ←d d ←c c ←ROTL30(b) b ←a a ←T } H0(i) ←a + H0i-1) H1(i) ←b + H1i-1) H2(i) ←c + H2i-1) H3(i) ←d + H3i-1) H4(i) ←e + H4i-1) } On concatène ensuite les valeurs: H0(N), H1(N), H2(N), H3(N), H4(N) pour obtenir le condensat final. IDEA (International Data Encryption Algorithm) C’est aussi un algorithme de chiffrement symétrique par bloc tout comme l’AES. Il a été développé en 1991 par Xuejia Lai et James Massey. Il se base sur des blocs de 64 bits en entrée avec une clé de 128 bits. Notations On se place dans des groupes algébriques de 216 éléments. On a les opérateurs suivants : - xor : il s’agit du où exclusif - + : il s’agit de l’addition modulo 216 - & : il s’agit de l’opérateur AND suivi de 0xFFFF en hexadécimal - *: il s’agit de la multiplication modulo 216 +1 Algorithme Tout d’abord, on calcule les sous-clés de 16 bits de la clé principale (128 bits) qui vont servir à l’implémentation. Il y aura 9 étapes dans le chiffrement. Pour chacune des 8 premières, on aura besoin de 6 sous-clés. Pour la dernière, seules 4 sous-clés sont nécessaires. Les sous-clés sont calculées de la manière suivante : 1. Les 8 premières sont extraites directement de la clé principale. On segmente tout simplement en 8 cette dernière, chacun des morceaux étant une des 8 sous-clés. 2. Les 8 sous-clés suivantes sont obtenues en faisant une rotation de 25 bits de la clé principale vers la gauche puis en segmentant la clé résultante en 8 comme en 1. . 3. On répète l’opération 2. jusqu’à ce qu’on ait pu définir entièrement les 52 sous-clés. Ces sous clés sont rangés en une suite : K1(r), K2(r), K3(r), K4(r), K5(r), K6(r) avec r variant de 1 à 8 symbolisant les 6 sous-clés nécessaires pour chacune des 8 premières étapes. Puis K1(9), K2(9), K3(9), K4(9) pour les sous-clés de la dernière étape. Ensuite, on prend en entrée un fichier qu’on divise en blocs de 64 bits qu’on range dans 4 variables de 16 bits chacune : X1, X2, X3, X4 . On effectue ensuite les opérations suivantes : Début Pour r=1 à 8 { X1 ← X1* K1(r) X2 ← X2 & K2(r) X3 ← X3 & K3(r) X4 ←X4* K4(r) t0 ←K5(r) * (X1 xor X3) t1 ←K6(r) * (t0 & (X2 xor X4)) t2 ←t0 & t1 X1 ←X1 xor t1 X4 ←X4 xor t2 a ←X2 xor t2 X2 ← X3 xor t1 X3 ← a } Y1 ← X1*K1(9) Y2 ← X3 & K2(9) Y3 ← X2 & K3(9) Y4 ← X4 * K4(9) Fin On obtient en sortie les 4 mots de 16 bits : Y1, Y2, Y3, Y4 chiffrés. L’algorithme Blowfish C’est un algorithme de chiffrement par bloc qui prend en entrée des blocs de 64 bits et une clé dont la taille peut varier de 32 à 448 bits. Génération des sous-clés de la clé principale Ces sous-clés vont ensuite servir pour le chiffrement. On définit donc un tableau P de 18 cases et 4 tableaux appelé S-box qui disposent de 256 cases chacun. 1. On initialise le tableau P et les 4 tableaux S avec les valeurs décimales de Pi en hexadécimal. Par exemple : P1 ← 0x243f6a88 P2 ← 0x85a308d3 P3 ← 0x13198a2e P4 ← 0x03707344 ….. 2. On effectue ensuite un xor entre P1 et les 32 premiers bits de la clé principale, un xor entre P2 et les 32 bits suivants, et ainsi de suite pour tous les bits de la clé. 3. On utilise ensuite l’algorithme principale de Blowfish avec une suite de zéros comme entrée de fichier et chacune des sous-clés P1, …, P14. 4. On affecte à P1 les 32 premiers bits du résultat du chiffrement, et à P2 les 32 suivants. 5. On chiffre de nouveau avec en entrée le résultat de 3. et les sous-clés modifiées P1, …, P14. 6. On affecte à P3 les 32 premiers bits du résultat et à P4 les 32 suivants. 7. On continue ainsi jusqu’à remplacer toutes les sous-clés P et toutes les entrées de S Chiffrement principal Soit x une fraction du fichier d’entré, de taille 64 bits. Début de l’algorithme On sépare x en deux parties égales de 32 bits : xL et xR Pour i←1 à 16 { xL ← xL xor Pi xR ← F(xL) xor xR on échange xL et xR // la fonction F divise xL en 4 blocs de 8 bits : a,b,c,d et fait : 32 32 // F(xL) = ((S1,a + S2,b mod 2 ) xor S3,c) + S4,d mod 2 } on échange de nouveau xL et xR xR ← xR xor P17 xL ← xL xor P18 on rassemble xL et xR } Fin de l’algorithme Pour le déchiffrement, on agit comme pour le chiffrement sauf que P1,…, P18 sont utilisés dans l’ordre inverse. L’algorithme Serpent C’est un algorithme qui a aussi été présenté lors du concours de l’AES en 1998 mais qui malheureusement a fini deuxième de la compétition derrière Rijndael. Calcul des sous-clés de la clé principale La première étape consiste à calculer les sous-clés de la clé principale. Celle-ci peut être de 128, 192 ou 256 bits. Si la clé est inférieure à 256 bits (128 bits par exemple), on étend celle-ci en rajoutant un bit 1 à la fin et autant de bits 0 qu’il faut. On va ensuite en tirer 33 clés de 128 bits de la manière suivante. On répartit la clé de 256 bits dans 8 sous-clés de 32 bits : w-s, …, w-1 puis on effectue la récurrence suivante afin d’obtenir 132 sous-clés : wi ← (wi-8 xor wi-5 xor wi-3 xor wi-1 xor ϕ xor i ) <<< 11 <<< signifie rotation à gauche ϕ est la partie décimale du nombre d’or (5^(1/2) + 1)/2 Ensuite on utilise les tables de substitution (S-box) sur les wi : {k0,k1, k2, k3} ← S3(w0,w1,w2,w3) {k4,k5, k6, k7} ← S2(w4,w5,w6,w7) {k8,k9, k10, k11} ← S1(w8,w9,w10,w11) {k12,k13, k14, k15} ← S0(w12,w13,w14,w15) {k16,k17, k18, k19} ← S7(w16,w17,w18,w19) … {k124,k125, k126, k127} ← S4(w124,w125,w26,w127) {k128,k129, k130, k131} ← S3(w128,w129,w130,w131) Puis on stocke ces sous-clés de 32 bits dans 33 sous-clés Ki de 128 bits : Ki ← { k4i, k4i+1, k4i+2, k4i+3} On effectue ensuite une « permutation » sur les Ki grâce à la transformation suivante : 0 32 64 96 1 33 65 97 2 34 66 98 3 35 67 99 4 36 68 100 5 37 69 101 6 38 70 102 7 39 71 103 8 40 72 104 9 41 73 105 10 42 74 106 11 43 75 107 12 44 76 108 13 45 77 109 14 46 78 110 15 47 79 111 16 48 80 112 17 49 81 113 18 50 82 114 19 51 83 115 20 52 84 116 21 53 85 117 22 54 86 118 23 55 87 119 24 56 88 120 25 57 89 121 26 58 90 122 27 59 91 123 28 60 92 124 29 61 93 125 30 62 94 126 31 63 95 127 Ici, par exemple, la valeur 32 en position 1 signifie qu’on affecte à position 1 le bit situé en position 32. On obtient donc les sous-clés Kpi Chiffrement Pour commencer le chiffrement, on applique la permutation précédente au bloc de 128 bits qui constitue l’entrée. On obtient donc un bloc B0. Puis on effectue les opérations suivantes : Pour i de 0 à 30 :Bi+1 ← L(Si(Bi xor Kpi)) où L est une transformation linéaire qu’on peut représenter de la manière suivante : {X0;X1;X2;X3} = Si(Bi xor Kpi) X0 ←X0 <<< 13 X2 ←X2 <<< 3 X1 ←X1 xor X0 xor X2 X3 ←X3 xor X2 xor (X0 << 3) X1 ←X1 <<< 1 X3 ←X3 <<< 7 X0 ←X0 xor X1 xor X3 X2 ←X2 xor X3 xor (X1 << 7) X0 ←X0 <<< 5 X2 ←X2 <<< 22 Bi+1 ←{X0;X1;X2;X3 } // avec << un décalage de n bits vers la gauche // et <<< une rotation de n bits vers la gauche Pour i = 31 : Bi+1 ← Si (Bi xor Kpi ) xor Kp32 On applique au final une permutation à B32 pour obtenir le résultat final. La permutation est la suivante : 0 4 8 12 16 20 24 28 32 36 40 44 48 52 56 60 64 68 72 76 80 84 88 92 96 100 104 108 112 116 120 124 1 5 9 13 17 21 25 29 33 37 41 45 49 53 57 61 65 69 73 77 81 85 89 93 97 101 105 109 113 117 121 125 2 6 10 14 18 22 26 30 34 38 42 46 50 54 58 62 66 70 74 78 82 86 90 94 98 102 106 110 114 118 122 126 3 7 11 15 19 23 27 31 35 39 43 47 51 55 59 63 67 71 75 79 83 87 91 95 99 103 107 111 115 119 123 127 Les tables de substitution utilisées sont les suivantes : S0: 3 8 15 1 10 6 5 11 14 13 4 2 7 0 9 12 S1: 15 12 2 7 9 0 5 10 1 11 14 8 6 13 3 4 S2: 8 6 7 9 3 12 10 15 13 1 14 4 0 11 5 2 S3: 0 15 11 8 12 9 6 3 13 1 2 4 10 7 5 14 S4: 1 15 8 3 12 0 11 6 2 5 4 10 9 14 7 13 S5: 15 5 2 11 4 10 9 12 0 3 14 8 13 6 7 1 S6: 7 2 12 5 8 4 6 11 14 9 1 15 13 3 10 0 S7: 1 13 15 0 14 8 2 11 7 4 12 10 9 3 5 6 L’algorithme RC6 C’est un autre candidat à l’AES en 1998, qui est arrivé en seconde position après l’algorithme Rijndael. C’est un algorithme dérivé de RC5 (crée en 1995), simple et performant à la fois. Calcul des sous-clés L’expansion de la clé principale (algorithme issu de RC5 ) du RC6 étant quasiment similaire. On définit d’abord deux constants binaires Pw et Qw qui représentent les parties décimales de deux nombres : e (2.7182….) et le nombre d’or (1.61803….) sur w bits (w=16, 32 ou 64 bits) . Par exemple P16= 1011011111100001 = B7E1 Q16=1001111000110111 = 9E37 P32= B7E15163 Q32=9E3779B9 Ensuite, on divise la clé principale K en plusieurs sous-clés Li de même longueur. On définit ensuite des tableaux S qu’on remplit de la façon suivante : S[0]=Pw Pour i de 1 à t-1 //t=2*(r+1) où r est le nombre de tours choisi pour chiffre les données // Plus r est grand, plus solide sera le chiffrement S[i] ←S[i-1] + Qw Fin Pour Puis on effectue l’algorithme suivant à partir de deux mots A et B de w bits chacun : i←0 j←0 A←0 B←0 Faire 3*max(t,c) fois /*où c = 8*b/w avec b le nombre de bits de la clé principale) */ S[i] ← S[i] + A + B <<< 3 // <<< étant une rotation vers la gauche A ← S[i] L[j] ← (L[j]+A+B) <<< (A+B) i ← i+1 mod(t) j ← j+1 mod(e) Fin faire Chiffrement On a comme paramètres d’entrée : b le nombre de bits de la clé principale w le nombre de bits des sous-clés (16, 32 ou 64 bits) r le nombre de tours choisis pour le chiffrement A, B, C, D les données d’entrées sur w bits chacune En sortie, on aura A, B, C et D. Début B←B+S[0] D←D+S[1] Pour i de 1 à r faire t ← (B*(2B+1)) <<< lg w u ← (D * (2D +1)) <<< lg w A ← ((A xor t) <<< u) + S[2i] C ← ((C xor u) <<< t ) + S[2i+1] (A,B,C,D) ← (B,C,D,A) Fin Pour A ← A+S[2r+2] C ← C+S[2r+3] Fin L’opérateur * désigne la multiplication modulo 2w L’opérateur + désigne l’addition modulo 2w <<< n : la rotation à gauche de n bits Déchiffrement En entrée : - A, B, C, D chiffrés - le nombre r de tours utilisé pour le chiffrement - w En sortie : - A, B, C, D déchiffré Début C ← C – S[2r+3] A ←A - S[2r+2 Pour u de r à 1 faire (A,B,C,D) ← (D,A,B,C) u ← (D * (2D+1)) << lg w t ← ((B * (2B+1)) << lg w C ← ((C – S[2i+1]) >> t ) xor u A ← (( A – S[2i]) >> u ) xor t Fin pour D ←D-S[1] B ←B – S[0] Fin L’opérateur – désigne la soustraction modulo 2w. >>> n : la rotation à droite de n bits Comparaison de différents algorithmes Ci-dessous se trouve la comparaison des 15 algorithmes candidats à l’AES entre 1998 et 2000. Les performances des 15 algorithmes ont été comparées en temps sur un Pentium Pro 200Mhz. A chaque algorithme, on a mesuré en nombre de cycle processeur le temps de chiffrement, de déchiffrement et de calcul des sous-clés, pour plusieurs taille de clé principales (128, 192, et 256 bits). Pour les algorithmes Rijndael, CRYPTON et CRYPTON v1, les deux valeurs dans le calcul des clés représentent le chiffrement et le déchiffrement. Les trois dernières lignes représentent les différentes vitesses de l’algorithme calculées en Mbits/s. Sur le tableau, on voit que les algorithmes Rijndael, MARS et Twofish se suivent et ont à peu près les même performances. D’une manière générale, l’algorithme le plus performant est RC6, suivi par Rijndael. Or c’est ce dernier qui a gagné le concours et est devenu l’AES. Une des raisons de l’échec de RC6 sont ses faibles performances sur les processeurs 8-bits et 64 bits comparés aux autres finalistes du concours. Cryptographie asymétrique Un des problèmes majeurs qui résident en la cryptographie symétrique est l’échange de clés. En effet il est nécessaire de donner la clé au destinataire afin qu’il puisse décrypter le message. Cet échange de clé se fait à priori en clair si on n’utilise que des systèmes symétriques. La cryptographie asymétrique ou à clé publique répond à ce problème. Elle repose sur l’utilisation de deux clés : - Une clé publique qui est diffusée - Une clé privée gardée secrète Ainsi, l’expéditeur peut utiliser la clé publique du destinataire pour crypter le message alors que seul le destinataire peut le déchiffrer à l’aide de sa clé secrète. Ce mécanisme garantit la confidentialité de l’information. A l’inverse, l’expéditeur peut utiliser sa propre clé privée pour crypter l’information souhaitée alors que le destinataire peut la décrypter à l’aide de la clé publique de l’expéditeur. Ce mécanisme permet d’authentifier l’auteur du message, c’est la signature numérique. La cryptographie asymétrique a été inventée par Diffie et Hellman. RSA RSA est un algorithme de cryptage asymétrique. Il a été inventé par Rivest, Shamir et Adleman en 1978. C’est l’exemple le plus courant en cryptographie asymétrique. Même s’il a été inventé il y a plus de 30 ans, il reste toujours considéré comme sûr pour des clés suffisamment grosses et est largement utilisé aujourd’hui dans le cadre de transactions sécurisées sur internet, paiement par carte bleue, etc. Description de l’algorithme RSA utilise l'arithmétique de ℤ où n est le produit de deux nombres premiers distincts p et q. Alice est la destinataire et Bob l’émetteur. 1. 2. 3. 4. 5. Alice génère grands nombres premiers (une centaine de chiffre en pratique) et ݍ, ainsi qu’un grand nombre d premier avec le produit = ݓሺ − 1ሻ ∗ ሺ ݍ− 1ሻ. Alice calcule ݊ = ݍet e tel que ݀ ∗ ݁ = 1 ݉ݓ ݀. Alice diffuse ݊ et ݁, garde ݀ et détruit ݓ. ሺ݊, ݁ሻ est donc la clé publique et ሺ, ݍ, ݀ሻ la clé privée. Pour crypter un message, Bob utilise ݁ et ݊ : ainsi le message ܯest crypté par ܯ ݉ ݀n et l’envoie à Alice Alice décode le message crypté parl’opération ܯௗ ݉݊ ݀. Quelques précisions L’algorithme repose, entre autres, sur les deux résultats arithmétiques suivants : ∀ , ݏݎ݁݅݉݁ݎ ݍ, ߶ሺݍሻ = ሺ − 1ሻ ∗ ሺ ݍ− 1ሻ ሺ1ሻ Et ܵ݅ ݔݑ݁ ݁ݎݐ݊݁ ݏݎ݁݅݉݁ݎ ݐ݊ݏ ݊ ݐ݁ ݔ, ݈ܽ ݔ ݏݎథሺሻ ≡ 1 ݉݊ ݀ ሺ2ሻ Ces résultats ne seront par démontrés. Premièrement, vérifions que les opérations sont réciproques : Comme ݀ ∗ ݁ = 1 ݉߶ ݀ሺ݊ሻ, ݀ ∗ ݁ = ߶ ∗ ݐሺ݊ሻ + 1. Soit ∈ ܯℤ , ݊ ܿ݁ݒܽ ݎ݁݅݉݁ݎ ܯ, ܽ ݊ሺܯ ሻௗ = ݔ௧∗థሺሻାଵ = ݊ ݀݉ ܯd’après le résultat (2). On peut montrer que ce résultat reste vrai même dans le cas où ܯn’est pas premier avec ݊. L’opération d’encryptage et décryptage sont donc réciproques. Exemple pratique Prenons = 101, = ݍ113, ݊ = = ݍ11413 ݁߶ ݐሺ݊ሻ = 11200. 11200 = 2 5ଶ 7. ݁ peut être utilisé pour le chiffrement si et seulement si il n’est pas divisible par 2, 5 ou 7. On prend ܾ = 3533, ݀ି ܾ ܿ݊ଵ = 6597. Donc l’exposant secret ݀ est 6597. On publie ݊ = 11413 ݁ = ܾ ݐ3533. On garde ݁ et , ݍsecrets. Sécurité : Attaquer RSA, c’est factoriser ݊. Pour que le système soit sûr il est donc nécessaire que ݊ = ݍsoit suffisamment grand pour que sa factorisation soit calculatoirement impossible. On considère que des clés de 768 bits sont sûrs pour un usage privé et 2048 bits voire 4096 pour un usage sensible. Si on admet que la puissance des ordinateurs double tous les 18 mois (loi de Moore), une clé de 2048 bits devrait tenir jusque l’an 2079. Cependant, il a été récemment infirmé que « casser » RSA est aussi difficile que factoriser ݊. On peut alors imaginer d’autres moyens plus rapides pour casser la sécurité RSA. Algorithme d’ElGamal Le logarithme discret ? Soit ሺܩ,∙ሻ un groupe multiplicatif, ߙ ∈ ܩd’ordre ݊. Le problème du logarithme discret est de trouver pour ߚ ∈< ߙ > l’unique exposant ܽ, 0 ≤ ܽ < ݊ tel que ߙ = ߚ. L’utilité du logarithme discret vient du fait qu’il est difficile de le déterminer alors que l’opération inverse d’exponentiation peut être effectuée facilement. L’algorithme d’ElGamal Cet algorithme repose sur l’utilisation du logarithme discret. Il a été publié par Tahar ElGamal en 1984. Cet algorithme est utilisé par le logiciel libre GNU Privacy Guard, PGP, et d’autres systèmes de chiffrement. Aucun brevet n’a été déposé, contrairement à RSA. Il peut être utilisé aussi bien pour le chiffrement que pour la signature électronique. Soit Alice l’émetteur d’un message et Bob le destinataire. Bob possède deux clés : Une clé privée : un entier ݏ Une clé publique : un grand nombre premier tel que trouver le logarithme discret dans le groupe cyclique ൫ℤ ,∙൯ est difficile, un nombre ߙ premier avec et ܲ = ߙ ௦ ݉ ݀ Chiffrement 1. Alice tire aléatoirement un nombre ݇. 2. Elle calcule ܥଵ = ܽ ݉ ݀et ܥଶ = ܲܯ ݉ ݀ Le message chiffré est alors le couple ሺܥଵ , ܥଶ ሻ. Déchiffrement 1. A la réception du couple ሺܥଵ , ܥଶ ሻ, Bob doit calculer ܴଵ = ܥଵ௦ ݉ ݀ ܴଵ = ܥଵ௦ ݉ = ݀ሺߙ ሻ௦ ݉ܲ = ݀ ݉ ݀ 2. Il lui reste à calculer la quantité ோమ = భ ெೖ ೖ =ܯ Sécurité Un attaquant éventuel doit pouvoir calculer ܲ pour en déduire ܯen connaissant ܲ, ܽ et ܽ . Il doit donc découvrir ݇, et est confronté au problème du logarithme discret. Cet algorithme fonctionne également sur d’autres groupes cycliques où le problème du logarithme discret est difficile. L’introduction d’aléa (paramètre ݇) apporte une sécurité supplémentaire : deux messages identiques ne seront pas codés de la même façon. En revanche, cet algorithme a le défaut de générer un message crypté La signature DSA Le Digital Signature Algorithm est un algorithme de signature numérique standardisé par le NIST aux Etats-Unis. Il fait partie de la spécification Digital Signature Standard (DSS) adoptée en 1993 mais ce n’est plus le message lui-même qui est signé par une fonction de hachage mais l’empreinte du message. Le DSA est similaire à un autre type de signature développée par Claus Schnorr en 1989. Il a aussi des points communs avec la signature ElGamal. Le processus se fait en trois étapes : - génération des clés - signature du document - vérification du document signé Génération des clés La clé publique est composée de 4 nombres (p,q,g,y) et la clé publique d’un seul nombre x. Le choix de ces nombres se fait de la manière suivante : - p est un nombre premier de L-bit avec 512 ≤ ≤ ܮ1024 et L divisible par 64 - q est un nombre premier de 160 bits tel que − 1 = ݖݍ - ݃ = ℎ² ݉ ݀avec 1 < ℎ < − 1 et ݃ > 1 - ݃ = ݕ௫ ݉ ݀ - x est choisit aléatoirement entre 0 et q (non compris) Signature La signature est un doublet (s1,s2) généré de la manière suivante : - on choisit s aléatoirement entre 1 et q (non compris) - ݏ1 = ሺ݃ହ ݉ ݀ሻ ݉ݍ ݀ - ݏ2 = ሺܪሺ݉ሻ + ݏ1 × ݔሻି ݏଵ ݉ ݍ ݀avec m le message et H une fonction de hachage cryptographique connu de tous les utilisateurs comme SHA-1 par exemple Il faut aussi noter que ݏ2 ≠ 0 ݉ ݍ ݀car ݏ2ିଵ ݉ ݍ ݀est nécessaire à la validation de la signature. Si l’émetteur obtient ݏ2 = 0 ݉ݍ ݀, il doit rejeter la signature et en créer une nouvelle avec une nouvelle valeur de k. Vérification Le destinataire doit ensuite vérifier la validité de la signature de la manière suivante : - On commence par vérifier que 0 < ݏ1 < ݍet 0 < ݏ2 < ݍsinon la signature est directement rejetée - On calcule = ݓሺݏ2ሻିଵ ݉ݍ ݀ ݑ1 = ܪሺ݉ሻ × ݍ ݀݉ ݓ ݑ2 = ݏ1 × ݍ ݀݉ ݓ = ݒሺ݃௨ଵ × ݕ௨ଶ ݉ ݀ሻ݉ ݀ - La signature est valide si ݏ = ݒ1 L’intérêt de ce principe est que ce n’est plus le message entier qui est signé mais son empreinte par la fonction de hachage H. La taille de la signature ne dépend donc plus de la taille du message. L’objet que l’on signe est de taille fixe (environ 160 bits) ce qui permet de réduire la taille du message signé transmis. ECIES L’Elliptic Curve Integrated Encryption Scheme est système de chiffrement variante de El Gamal. Ce schéma est basé sur le problème de Diffie-Hellman. Le problème de Diffie-Hellman Alice et Bob veulent faire un échange de clé. Ils choisissent ensemble une courbe elliptique, une génératrice g de cette courbe et un nombre premier p. Alice choisit au hasard un nombre a et envoie à Bob ݃ ݉ ݀. Bob fait de même avec sa clé privé b, nombre choisi au hasard. Alice élève le message reçu de Bob à la puissance a, elle obtient ݃ ݉ ݀. Bob fait le calcul analogue et obtient donc la même chose. Les deux personnes obtiennent ainsi la même clé secrète sans qu’une personne extérieure (de par la difficulté de calculer le logarithme discret) ne puisse calculer a et b. Les clés privés sont donc a et b ; la clé public est composé de p et g. Principe de l’algorithme ECIES Les paramètres sont E une courbe elliptique et ܧ ∈ d’ordre l avec l premier (c’est-à-dire que p est premier avec l). On a aussi : - SYM un algorithme de chiffrement symétrique - MAC un code authentificateur de message - KDF une fonction génératrice de clé Alice envoie un message m à Bob. La clé publique est ݇ , la clé privée est ܭ = ಳ ݉ ݈ ݀. Chiffrement On choisit ݇ ∈ ሾ1; ݈ሿ au hasard. On calcule : ܴ = ݉ ݈ ݀et ܼ = ܭ ݈݉ ݀. ݇ଵ ||݇ଶ = ܨܦܭሺܼ, ܴሻ ܯܻܵ = ܥሺ݇ଵ , ݉ሻ ܥܣܯ = ݐሺ݇ଶ , ܥሻ Alice envoie R, C et t à Bob. Déchiffrement On commence par vérifier que ܴ ∈ ܧ. On calcule ܴಳ ݉ = ݈ ݀ಳ ݉ܭ = ݈ ݀ ݈݉ ݀݉ ܼ = ݈ ݀ On calcule ݇ଵ ||݇ଶ = ܨܦܭሺܼ, ܴሻ et ݐᇱ = ܥܣܯሺ݇ଶ , ܥሻ. Si ݐ ≠ ݐᇱ , on rejette le message sinon on retrouve ݉ = ܻܵିܯଵ ሺ݇ଵ , ܥሻ. La cryptographie hybride La cryptographie asymétrique est intrinsèquement lente de par les calculs complexes qui y sont associés alors que la cryptographie symétrique brille par sa rapidité mais est beaucoup moins sure du fait de l’obligation de la transmission des clés. La cryptographie hybride consiste donc à l’association de ces deux techniques afin d’améliorer la rapidité tout en ayant une certaine sécurité. Les logiciels PGP et GnuPG reposent sur ce système. La plupart des systèmes hybrides procèdent de la manière suivante. On code tout d’abord le message grâce à un algorithme de chiffrement symétrique utilisant une clé publique dite de session générée aléatoirement et de taille comprise entre 128 et 512 bits. La clé de session est ensuite chiffrée avec la clé publique du destinataire selon un algorithme cryptage asymétrique. Comme la clé est courte, ce chiffrage prend peu de temps, ce qui n’aurait pas été le cas si on avait chiffré l’ensemble du message à partir d’un algorithme de cryptographie asymétrique. Il suffit alors d’envoyer l’ensemble composé du message chiffré ainsi que de la clé privée elle-même cryptée avec une clé publique. L’utilisateur dit donc utiliser sa clé privée pour déchiffrer la clé de session et ensuite il peut accéder au message grâce à cette dernière. Conclusion La cryptographie moderne a fait de nombreux progrès pour répondre aux besoins de confidentialité et d’authentification croissants : commerce électronique, votes électroniques, défense… Les algorithmes présentés dans ce document ne sont pas inviolables. Il existe des méthodes de chiffrement réputées invulnérables (Chiffre de Vernom et cryptographie quantique) mais leur mise en œuvre est excessivement difficile à mettre en place. On préfère donc des algorithmes plus simples à mettre en œuvre, avec une taille de clés raisonnable, qui garantissent une sécurité limitée dans le temps. Enfin, l’avenir réside certainement en la cryptographie quantique. Cette dernière désigne un ensemble de protocoles permettant de distribuer une clé de cryptage secrète entre deux interlocuteurs distants grâce aux lois de la physique quantique et de la théorie de l’information. Ce type de cryptographie ne peut néanmoins pas être utilisé pour crypter le message lui-même pour deux raisons. Premièrement, les bits d’informations communiqués ne peuvent être obtenus que aléatoirement ce qui ne convient pas pour un message. Enfin, même si le mécanisme de la cryptographie quantique garantit que l’espion sera toujours détecté, rien n’assure que les informations ne soient pas déjà détenues par ce dernier. Ceci n’est pas acceptable pour un message mais sans importance pour une clé aléatoire qui doit alors simplement être jetée en cas d’interception. Bibliographie Articles scientifiques G.N KRISHNAMURTY, V. RAMASWANY, G.H LEELA, M.E ASHALATHA, « Blow-CAST-Fish : A New 64-bit Block Cipher » dans IJCSNS International Journal of Computer Science and Network 282 Security, Avril 2008, VOL.8 N.4 « Secure Hash Standard » dans Federal Information Processing Standards Publication, 01 Août 2001, 180-2 B. GLADMAN, « Implementation Experience with AES Candidate Algorithms » dans Second AES Conference R.L RIVEST, M.J.B ROBSHAW, R. SYDNEY, Y.L YIN, « The RC6 TM Block Cipher », 20 Août 1998 M.J.B ROBSHAW, « RC6 and the AES », 9 Janvier 2001 R. ANDERSON, E. BIHAM, L. KNUDSEN, « A Proposal for the Advanced Encryption Standard » J. DAEMEN, V. RIJMEN, « AES Proposal: Rijndael », 1998 Sites Internet http://en.referencio.com/Algorithms_-_Ciphers http://en.wikipedia.org/wiki/List_of_hash_functions http://www.world-class-programme.com/IDEA.asp http://www.schneier.com/paper-blowfish-fse.html http://en.wikipedia.org/wiki/Rijndael_S-box http://en.wikipedia.org/wiki/Finite_field_arithmetic http://en.wikipedia.org/wiki/Key_schedule http://en.wikipedia.org/wiki/RSA http://fr.wikipedia.org/wiki/Courbe_elliptique http://fr.wikipedia.org/wiki/Cryptographie_asymetrique http://fr.wikipedia.org/wiki/Echange_de_clés_Diffie-Hellman http://en.wikipedia.org/wiki/Integrated_Encryption_Scheme http://etudes.univ-rennes1.fr/digitalAssets/27/27372_cours7_protocoles.pdf http://calamar.univ-ag.fr/uag/ufrsen/coursenligne/vpage/new_site/cours/UEOI222/cours_crypto.pdf http://www.supinfo-projects.com/fr/2006/la_cryptographie/2/ http://www.math.ens.fr/culturemath/maths/pdf/nombres/RSA.pdf http://www.bibmath.net/crypto/complements/elgamal.php3 Autres Cours de l’électif cryptographie enseigné en deuxième année à l’Ecole.