La fonction de codage f est la suivante :
à un entier a inférieur à n = pq
f fait correspondre
au mod n.
La fonction de décodage g est la suivante :
à un entier b, g on fait correspondre
bm mod n.
Pour montrer que g(f (a)) = a, on utilise le petit théorème de Fermat
amélioré:
si p et q sont premiers, si n = pq si a est inférieur à n = pq
alors :
ak(p-1)(q-1)+1 = a mod n
On peut appliquer ce théorème ici car :
- si a est premier avec n, p et q sont premiers, n = pq et donc
a est premier avec p et est premier avec q donc :
av(p-1)(q-1) = 1v = 1 mod n (d'après le petit théorème de Fermat)
ap-1 = 1 mod p et
aq-1 = 1 mod q donc
av(p-1)(q-1) = 1v = 1 mod p et
av(p-1)(q-1) = 1v = 1 mod q
donc
av(p-1)(q-1) = 1v = 1 mod n.
- si a n'est pas premier avec n, c'est que a est soit un multiple de
p soit un multiple de q (puisque a < n = pq). Supposons que a soit un
multiple de p, a est donc premier avec q puisque a < p*q et on a :
a = 0 mod p donc
ak(p-1)(q-1)+1 = a = 0 mod p
aq-1 = 1 mod q car q est premier et a est premier avec q (th de
Fermat), donc
ak(p-1)(q-1)+1 = a mod q
Donc
ak(p-1)(q-1)+1 - a est un multiple de p et de q donc est un
multiple de n = pq (car p et q sont premiers).
on a donc bien :
g(f (a)) = g(au) mod n = aum mod n = av(p-1)(q-1)+1 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
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.
Remarque
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 qui seront transformés par
f en 156330358492191937, 126697584810299952, 50295601528998788 car
powmod(4345678,u,n)=15633035849219193 etc...
Pour décoder on applique à ces nombres la fonction g on a :
powmod(15633035849219193,m,n)=4345678 etc...