Chiffre de Rabin

Prérequis: Arithmétique modulo m,
algorithme d'Euclide étendu,
théorème des restes chinois

Le chiffre de Rabin offre une sécurité calculatoire équivalente au problème de la factorisation de n=pq. C'est un cryptosystème à clefs publiques.

Soit n le produit de deux nombres premiers distincts p et q tels que p et q soient congrus à 3 modulo 4 (nous verrons plus loin le pourquoi de cette condition). Soit le nombre B compris entre 0 et n-1. Le nombre chiffré y (compris entre 0 et n-1) s'obtient à partir du nombre clair x (compris entre 0 et n-1) par la formule:

Inversement, le nombre clair x s'obtient à partir du nombre chiffré y par la formule:

On notera que les opérations arithmétiques sont effectuées dans Zn, et que la division par 2 ou 4 est en fait la multiplication par 2-1 et 4-1 modulo n, respectivement.

Cette fonction de chiffrement n'est pas injective. Il existe en effet quatre nombres clairs qui peuvent se chiffrer en le même nombre chiffré. Le destinataire du message n'a aucun moyen pour distinguer le bon nombre parmi les quatre qu'il trouvera. On verra dans un exemple complet comment remédier à ce problème.

Exemple

Supposons que p = 7, q = 11 (clefs privées), n = pq = 77 et B = 9 (clefs publiques).
La formule de chiffrement est:
et la formule de déchiffrement est:

(en effet, d'après l'algorithme d'Euclide étendu, 4-1 mod 77 = 58 et 92·58 mod 77 = 1. De même, 2-1 mod 77 = 39 et 9·39 mod 77 = 43).

Calcul des quatre racines

Supposons que Bob (le destinataire) souhaite déchiffrer le message y = 22. Il faut donc trouver la racine carrée de 23 modulo 77, ce qui revient, comme le dit le théorème des restes chinois, au même que trouver la racine carrée de 23 modulo 7 et la racine carrée de 23 modulo 11. C'est ici qu'intervient le fait que p et q doivent être congrus à 3 modulo 4. En effet, dans ce cas, il existe une formule simple:

Si p mod 4 = 3, alors la solution de

C(1/2) mod p
est
±C(p+1)/4 mod p

On va donc calculer:

23(1/2) mod 7 = 23(7+1)/4 mod 7 = 232 mod 7 = (23 mod 7)2 mod 7 =22 mod 7 = 4
23(1/2) mod 11 = 23(11+1)/4 mod 11 = 233 mod 11 = (23 mod 11)3 mod 11 =13 mod 11 = 1

Il ne reste qu'à résoudre le système d'équations ci-dessous avec le théorème des restes chinois:

x mod 7 = 4
x mod 11 = 1
(*)
On calcule successivement:

M = 77, M1 = 11, M2 = 7,
y1 = 11-1 mod 7 = 2  et  y2 = 7-1 mod 11 = 8 (valeurs trouvées avec l'algorithme d'Euclide étendu)

donc x = 4·11·2 + 1·7·8 = 144 mod 77 = 67

67 est donc la première des 4 racines carrées de 23 modulo 77. Les trois autres racines carrées se trouvent en résolvant le système (*) avec respectivement a1 = -4 et a2 = 1, a1 = 4 et a2 = -1, et enfin a1 = -4 et a2 = -1. Vous pourrez vérifier en exercice qu'elles valent respectivement 45, 32 et 10.

Calcul des quatre nombres clairs

Finalement, les quatre nombres clairs possibles sont :

67 - 43 mod 77 = 24
45 - 43 mod 77 = 2
32 - 43 mod 77 = 66
10 - 43 mod 77 = 44

Vérifiez en exercice que ces quatre nombres se chiffrent en 22.


Un exemple complet

Pour voir comment le chiffre de Rabin fonctionne, nous allons utiliser l'alphabet ordinaire + le symbole "*" que nous chiffrerons ainsi:

Alphabet A B C D E F G H I J K L M N O P Q R S T U V W X Y Z *
Codes 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26

Rappelons que 4 textes clairs correspondront au texte chiffré que recevra le destinataire. Afin qu'il puisse facilement retrouver le bon, le symbole * débutera chaque bloc de texte.

Nous utiliserons des blocs de quatre caractères et pour simplifier, nous avons choisi B = 0. Avec ces choix, le plus grand nombre possible est *ZZZ=26252525. Nous devons choisir n plus grand que cela, et, de plus, n doit être le produit de deux nombres premiers congrus à 3 modulo 4.  Soient p = 6911 et q = 6947 (on peut vérifier que p et q sont deux nombres premiers de la forme 4 k + 3).  Ces deux valeurs sont la clef privée et ne doivent pas être rendues publiques. On calcule ensuite que n = 6911·6947=48010717.

Les valeurs n = 48010717 et B = 0 constitue la clef publique que l'envoyeur utilisera pour chiffrer son message.

Chiffrement
La fonction de chiffrement est:

Alice désire envoyer un message secret à Bob. Ce dernier lui a fait connaître ses clefs publiques et elle va les utiliser pour chiffrer le texte suivant:

JE T'AIME

Elle le décompose d'abord en blocs de trois caractères chacun,

JET     AIM     EKK

puis elle marque chacun des blocs en ajoutant le symbole * au début de chaque bloc:

*JET     *AIM     *EKK

puis les caractères sont convertis en leurs équivalents numériques (les zéros sont importants):

26090419     26000812     26041010

Elle chiffre d'abord le premier bloc: C1 = 260904192 mod 48010717 = 46850914

Le deuxième bloc est chiffré comme suit: C2 = 260008122 mod 48010717 = 5842871

Et le troisième ainsi:  C3 = 260410102 mod 48010717 = 12031786

Le message chiffré transmis par Alice est la suite de nombres:

46850914     5842871     12031786

Déchiffrement
La formule de déchiffrement est:

Bob, qui n'a communiqué à personne sa clef privée, à savoir les deux nombres p = 6911 et q = 6947, sera le seul à pouvoir déchiffrer le message (bien sûr, dans notre exemple, n = 48010717 est facilement factorisable en n=6911·6947; en réalité, nous utiliserions des tailles de blocs beaucoup plus grandes et des nombres premiers beaucoup plus grands).

Pour déchiffrer le premier bloc, Bob doit résoudre la congruence

P1 = 46850914(1/2) (mod 48010717)

D'après le théorème des restes chinois, résoudre l'équation ci-dessus revient à résoudre le système d'équations:

x = 46850914(1/2) (mod 6911)
x = 46850914(1/2) (mod 6947)
(*)

Il va donc calculer tout d'abord les racines carrées (par exemple avec la fonction Mathematica PowerMod):

46850914(1/2) mod 6911 = 46850914((6911+1)/4) mod 6911 = 1394
46850914(1/2) mod 6947 = 46850914((6947+1)/4) mod 6947 = 2513

Il ne lui reste plus qu'à résoudre, avec le théorème des restes chinois:

x mod 6911 = 1394
x mod 6947 = 2513
(*)

Pour cela, il calcule successivement:

M = 48010717, M1 = 6947, M2 = 6911,
y1 = 6947-1 mod 6911 = 192  et
y2 = 6911-1 mod 6947 = 6754 (valeurs trouvées avec l'algorithme d'Euclide étendu).

Il obtient donc les quatre nombres clairs:

x1 = 1394·6947·192 + 2513·6911·6754 mod 48010717 = 119158385278 mod 48010717 = 43796401
x2 = -1394·6947·192 + 2513·6911·6754 mod 48010717 = 115439683966 mod 48010717 = 21920298
x3 = 1394·6947·192 - 2513·6911·6754 mod 48010717 = -115439683966 mod 48010717 = 26090419
x4 = -1394·6947·192 - 2513·6911·6754 mod 48010717 = -119158385278 mod 48010717 = 4214316

La bonne valeur est celle qui commence par 26, donc 26090419. Une fois décodé, ce nombre donne les lettres *JET.

En procédant de la même façon avec les deux derniers blocs, il retrouvera le message complet. Essayez!


Référence


  Didier Müller, 27.1.21