Cryptosystème RSA (Rivest-Shamir-Adleman)
C'est un cryptosystème à clé publique (il a donc une clé privée et une clé publique), il a été construit en 1977 par Rivest, Shamir et Adleman. Chaque cryptosystème à clé publique s'appuie fortement sur une fonction de trappe et RSA est sécurisé en raison du problème de factorisation des nombres entiers. Qui consiste à valider le résultat en multipliant deux nombres et c'est facile, mais trouver les facteurs est difficile.
Soit p un nombre premier alors pour tout entier a (a n'est pas divisible par p) le nombre ap-1-1 est un multiple entier de p.
ap-1 ≡ 1 (mod p) qui est le petit théorème de Fermat. On peut généraliser ce théorème avec la fonction Φ(n) d'Euler : cette fonction totient compte les entiers positifs jusqu'à un entier donné n qui sont premiers relatifs à n et la formule est : aΦ(n) ≡ 1 (mod p). Notamment par premier relatif, nous entendons que deux entiers a et b sont dits premiers ou premiers entre eux si le seul entier positif (facteur) qui les divise tous les deux est 1 avec cette formule : pgcd(a, b) = 1
-
Nous générons 2 grands nombres premiers p et q, pour cela nous pouvons utiliser Rabin-Miller un algorithme très optimisé pour le faire.
-
On calcule n = p * q donc multiplions les nombres premiers : Φ(n) = (p - 1) * (q - 1)
-
Calculons le paramètre de clé publique e, nous pouvons calculer e tel que gcd(e, Φ(n)) = 1. Donc, fondamentalement, e et Φ(n) sont des nombres premiers relatifs.
-
Calculons le paramètre d de la clé privée : calculons l'inverse modulaire de e (c'est pour cela qu'il est crucial que e et Φ (n) soient premiers) : d * e mod Φ(n) = 1, après avoir résolu cette équation, nous obtenons le paramètre d.
Ensuite, nous avons : CLÉ PUBLIQUE : (e, n) et CLÉ PRIVÉE : (d, n)
Après ces étapes, pour chiffrer le message, nous devons d'abord transformer le texte brut en blocs (nous pouvons utiliser La Table ASCII pour convertir du texte en nombres) où chaque bloc est plus petit que n et comme d'habitude nous utilisons la clé publique pour le chiffrement et la clé privée pour le déchiffrement. De cette façon ciphertext_block = plaintext_blocke mod n et plaintext_block = ciphertext_blockd mod n
-
Nous avons beaucoup parlé de la théorie, maintenant essayons ceci dans un exemple réel, générons de grands nombres premiers : p = 17 et q = 23.
-
Calculons n = p * q = 17 * 23 = 391 donc Φ(17 - 1) * (23-1) = 352.
-
Nous devons maintenant trouver un nombre e où gcd(e, Φ(n)) = 1 avec L'Algorithme d'Euclide et nous obtenons e = 21.
-
Nous devons enfin trouver l'inverse modulaire de e en utilisant L'Algorithme d'Euclide Étendu et nous obtenons d = 285.
Maintenant que nous avons la clé publique : (21, 391) et la clé privée: (285, 391) nous pouvons chiffrer un message.
Disons que nous avons le caractère a à chiffrer. La représentation ASCII de a est 97.
Cryptage → ciphertext_block = plaintext_blocke mod n = 9721 mod 391 = 37
Décryptage → plaintext_block = ciphertext_blockd mod n = 37285 mod 391 = 97