I Objectifs Présenter un système de cryptage récent. En faire une implémentation sous le tableur Excel. II Propriété fondamentale n = pq est le produit de deux entiers premiers p et et q distincts. On pose m = (p 1)(q 1) et on note c un nombre premier avec m. On note x un entier naturel. a) Démontrer qu'il existe des entiers d et k tels que : cd = mk + 1 (c'est-à-dire cd 1 [m]) b) Cas où x est non divisible par p. Démontrer que x p-1 1 [p]. En déduire que x km 1 [p], puis que x cd x [p] Cas où x est divisible par p. Démontrer que x cd x [p]. c) Démontrer de façon analogue que pour tout entier naturel x, x cd x [q]. d) En déduire que pour tout entier naturel x, x cd x [n]. III Principe du cryptage Pour chiffrer un message (cartes bancaires, internet, ), on choisit deux nombres premiers p et q très grand et on calcule n = pq. On pose m = (p 1)(q 1). On cherche deux entiers naturels c et d tels que cd 1 [m]. Les messages x seront des entiers naturels appartenant à [0;1;.;n 1]. Le codage de ce message consiste à calculer C(x) x c [n]. Le décodage consiste à calculer D(y) y d [n]. On a bien D(C(x)) x cd x [n]. Pour chiffrer un message on a besoin de connaître c et n. 1
Le couple (n;c) est appelé la clé publique car elle est connue de tous et repertoriée dans un annuaire. Pour déchiffrer, il faut connaître d et n. d est appelé la clé privée car elle n'est connue que de la personne qui reçoit le message codé. IV Notes Les trois lettres RSA sont les initiales de Rivest, Shamir, Adleman qui ont mis au point cet algorithme en 1978. Les nombres premiers p et q doivent demeurés cachés car leur connaissance entraîne celle de m = (p 1)(q 1), puis celle de d en résolvant l'équation de Bézout : cd km = 1 (ce qui est possible car c est dans l'annuaire). Le sytème RSA 1 024 bits correspond à un nombre n = pq de l'ordre de 2 1024 10 308 s'écrivant avec 309 chiffres décimaux. V Application 1 Alexandre veut choisir une clé publique (n;c) et sa clé privée d. Il prend p = 5, q = 11 et donc n = 55 (p et q sont choisis petits, contrairement à la réalité, pour la simplicité des calculs). a) Démontrer qu'il peut choisir c = 3 et d = 27. b) Les lettres de l'alphabet sont chiffrés par : A B C D. Y Z 01 02 03 04. 25 26 Paul qui connait la clé publique d'alexandre, crypte le message : "VIVE LA CRYPTOGRAPHIE" et lui envoie. Quel message crypté Alexandre reçoit-il? Comment le décode-t-il? c) A l'aide du tableur Excel, implémenter les fonctionnalités suivantes : Vérifier que les couples (c;n) et (d;n) donnés sont corrects. A l'aide de formules Excel implémenter le codage et le décodage d'un message. 2
On pourra utiliser les fonctions Excel suivantes : CODE() : codage ASCII d'un caractère CAR() : fournit le caractère alphabétique correspondant à un code ASCII MOD() : donne le reste de la division euclidienne d'un nombre par un autre. d) A quel problème est-on confronté lors de l'implémentation du décodage? Proposer alors deux algorithmes à implémenter avec deux procédures écrites en Visual-Basic qui contournent le problème : une de codage et une de décodage. V Application 2 Lise a pour clé publique (n;c) avec n = pq, p = 3, q = 13. a) Démontrer qu'elle peut choisir c = 29 et d = 5. b) Elle reçoit le message crypté suivant de Julie : 28 01 12 21 11 12 03 28 05. Décrypter ce message. 3
II Propriété fondamentale a) c et m étant premiers entre eux, d'après le théorème de Bézout il existe des entiers d et l tels que cd + lm = 1 Soit cd = km + 1 en prenant k = -l. b) Si x est non divisible par p, alors le petit théorème de Fermat assure que : x p-1 1 [p]. Or x m = x (p-1)(q-1) = (x (p-1) ) (q 1) 1 q-1 1 [p] Donc x km 1 k 1 [p]. Et x cd = x km x x [p] Si x est divisible par p, alors x 0 [p] et donc x cd x [p]. Conclusion, pour tout x, x cd x [p]. c) p et q ayant un rôle symétrique, le résultat est immédiat. d) x cd x est divisible par p et par q. Or comme p et q sont premiers entre eux (puisque ce sont deux nombres premiers) alors x cd x est divisible par leur produit pq. Soit : x cd x [n]. V Application 1 a) m = (p 1)(q 1) = 4 10 = 40 Si c = 3 et d = 27. 3 et 40 sont premiers entre eux. cd = 3 27 = 81 1 [40] Donc le choix de c et d est valable. b) La lettre "V" est codée par 33 car 22 3 33 [55]. La lettre "I" est codée par 14 car 9 3 14 [55]. Etc. Le message codé est alors : 331433152301270205262520 13020126171415 4
c) La vérification des couples (c;n) et (d;n) est faite dans la cellule I4 par la formule :=SI(MOD(E4*E5;(B4-1)*(B5-1))=1;"OK";"KO") La lettre en cellule B10 (V dans l'exemple) est chiffrée en B11 par la formule : =SI(B10="";"";CODE(B10)-64) et ce nombre est cryptée avec la clé publique RSA en cellule B12 par la formule : =SI(B11="";"";MOD(B11^$E$4;$B$4*$B$5)) Le nombre à déchiffrer en cellule B14 (28 dans l'exemple) est décryptée avec la clé secrète RSA en cellule B15 par la formule : =SI(B14="";"";MOD(B14^$E$5;$B$4*$B$5)) et ce nombre décrypté est traduit par la lettre correspondante en cellule B16 par la formule : =SI(B15="";"";CAR(B15+64)) d) Excel ne parvient à décrypter les nombres différents de 1 avec d = 27. En effet, y 27 est un nombre "trop grand" pour le tableur. Le même problème peut se produire pour le cryptage si on prend pour c une valeur assez grande. 5
Grace à deux procédures Visual-Basic, on peut contourner ce problème : A l'aide d'une boucle, on peut évaluer par étape x c [n] sans calculer x c explicitement. Algorithme de cryptage RSA : Données : Traitement n,c : entiers (constituant la clé RSA de codage) i,j : entier de boucle r : entier lettre_codee : lettre de l'alphabet msg : message à crypter msg_crypte : message crypé Pour i = 1 à longueur(msg) Faire i Suivant r 1 Pour j = 1 à c Faire j Suivant lettre_codee code_ascii(msg(j)) - 64 r Mod(r*lettre_codee,n) msg_crypte(i) r Procédure Visual Basic correspondante Public Sub code_rsa() n = Cells(4, 2) * Cells(5, 2) For i = 2 To 2000 If Cells(10, i) = "" Then Exit For End If r = 1 For j = 1 To Cells(4, 5) r = (r * (Asc(Cells(10, i)) - 64)) Mod n Next j Cells(11, i) = r Next i End Sub 6
Algorithme de décryptage RSA : Données : Traitement n,d : entiers (constituant la clé RSA de décodage) i,j : entier de boucle r : entier msg : message à décrypter msg_decrypte : message crypé Pour i = 1 à longueur(msg) Faire i Suivant r 1 Pour j = 1 à d Faire j Suivant r Mod(r*msg(i),n) msg_decrypte(i) lettre_ascii(r + 64) Procédure Visual Basic correspondante Public Sub decode_rsa() n = Cells(4, 2) * Cells(5, 2) For i = 2 To 2000 If Cells(13, i) = "" Then Exit For End If r = 1 For j = 1 To Cells(5, 5) r = (r * Cells(13, i)) Mod n Next j Cells(14, i) = Chr(r + 64) Next i End Sub V Application 2 a) On vérifie que cd = 29 5 = 145 1 [24] b) 28 01 12 21 11 12 03 28 05 se décode en SALUTLISE 7