La cryptographie - Le cryptage RSA
---------------------------------- by S/ash (sl4sh@ifrance.com)

RSA est un systme de cryptage relativement sr par son systme de clef
asymtrique : il faut une clef pour crypter et une autre pour dcrypter.
Bon ben, tout d'abord, on va faire un peu de math...
On commence par prendre 2 nombres premiers p et q (si possible trs grands).
On note n=p*q. Et on prend e de tel sorte qu'il soit premier avec (p-1)*(q-1).
e admet ainsi un inverse dans l'anneau Z/(p-1)(q-1)Z ; c'est--dire qu'il 
existe d tel que e*d mod (p-1)(q-1) = 1. On a ainsi nos 2 clefs : (e,n) et 
(d,n). On a alors X^(ed) mod n = X. On dtruit maintenant p et q pour que e 
ou d ne puisse tre retrouv.
Si on note M le message  crypter alors le message crypter sera : 
C = X^e mod n et on retrouvera M par : M = C^d mod n.

Concrtement, ce cryptage est trs efficace d  la quasi-impossibilit de
retrouver d  partir de (e,n) si p et q sont choisis trs grand (env 512 
bits).

Let's go cracking...
Les scnarios d'attaques du RSA :
* Le brute force cracking : on essaie toutes les combinaisons possible pour
trouver p et q (on essai de factoriser le nombre n) : bon courage. Allez voir
sur le site de l'INRIA, ils font de la recherche sur la factorisation de grand
nombre.
* D'autres scnarios d'attaque du RSA sont connus mais font appelle  ce que
le destinataire du message dcrypte une version modifi de celui-ci. Il s'agit
ensuite de rcuprer le message dcrypt (un peu dur). Ces dcryptages font
appelle  des notions d'arithmtiques avance donc si quelqu'un est 
interress, qu'il m'e-mail.

Si vous trouvez une mthodes sr de dcrypter un message C crypt en RSA rien
que avec e et n si ceux-ci sont grands alors vous tes un homme dangereux et 
les services secret de la plupart des tats voudront vous avoir avec eux...

Tiens, un petit message  dcrypter ( l'aide d'un ordinateur cela ce fait en 
15 minutes par un langage interprt). e = 7, n = 937169. Les messages 
original est cod par l'ordre alphabtique (a=01, b=02... et espace=00) et le
message est regroup par groupe de 6 chiffre (c'est--dire 3 caractre par 
nombre). Le message crypt est : 917063 414124 019270 093776 210133 872294
137460 882399 263351 001661 117940. (me contacter pour la rponse).

A remarquer que ce procder de cryptage est utilis dans PGP.

Et la pratique dans tous a ?
Il faut d'abord dterminer les clefs RSA (comme avec PGP).
 * On gnre 2 nombres premiers p et q le plus alatoirement possibles.
 * Maintenant, on a n=pq et ont veut prendre e un inversible de Z/(p-1)(q-1)Z.
   Donc on cherche un nombre e premier avec (p-1)(q-1). Bon, ben on va mettre
   en application l'arithmtique classique. On sait qu'un nombre e est premier
   avec un nombre m=(p-1)(q-1) si et seulement si aucun des termes de la
   dcomposition en nombre premier de e ne divise m. Concretement, pour 
   gnrer e, on prend une srie de nombre premier (tir tout droit des 
   sources de PGP), et on les tirent au hasard, pour chaque nombre tir on 
   vrifie qu'il ne divise pas m. On prend finalement, le produit de ces 
   nombres de faon  ce que e ne soit ni trop grand ni trop petit (dans les
   environ de racine n)
 * Bon ben maintenant, il nous faut gnrer d (l'inverse de e). On a 
   (ed mod m) = 1. Donc il existe k appartenant  Z tel que ed + km = 1.
   On dfinit 3 suites de nombres d(i), k(i) et g(i). On veut que, pour tout i
   appartenant  N, d(i)*e + k(i)*m = g(i). On sait que si on prend g(0) = m,
   d(0) = 0, k(0) = 1 et g(1) = e, d(1) = 1, k(1) = 0, alors la condition est
   vrifi pour i=0 et i=1. On prend, pour tout i!=0, 
   g(i+1) = g(i-1) mod g(i). Par l'algorithme D'Euclide, il existe i tel que 
   g(i)=0. De plus, si on prend i0 le plus petit possible tel que g(i0)=0,
   alors g(i0-1) = pgcd(g(0), g(1)). Or pgcd(g(0), g(1)) = pgcd(e,m) = 1 car 
   e et m sont premiers entre eux. Donc, en prenant g(i) de cet faon, on va
   arriver  un instant o d(i0-1)*e + k(i0-1)*m = g(i0-1) = pgcd(e,m) = 1. 
   Donc (d(i0-1)*e) mod m = 1, on a ainsi un inverse de e (d(i0-1)).
   Bon, ben maintenant, il faut dterminer d(i) et k(i). On pose, pour tout
   i appartenant  N\{0}, y(i) = g(i-1)/g(i) (division entire ici).
   On a ainsi, pour tout i!=0, g(i+1) + y(i)*g(i) = g(i-1). On traduit cette
   galit avec celle voulue et on obtient : e * ( d(i+1) + y(i) * d(i) ) +
   m * ( k(i+1) + y(i) * k(i) ) = e*d(i-1) + m*k(i-1). Ainsi, il nous suffit
   de prendre  d(i) tel que : d(i+1) + y(i) * d(i) = d(i-1) et de mme pour
   k(i). On peut maintenant calculer d(i0-1).
Ainsi, on a trouv e, d et n, on peut dtruire p, q et m.
puis on travaille en base n : ils nous faut donc crer nos propres fonctions
de multiplications et d'additions.
A remarquer que l'exponentiel (C^e) risque d'tre trs lent si on prend l'algo
naif (de l'ordre d'un brute force cracking de la clef). Heureusement que 
l'algo d'exponentiation rapide nous permet de le diminuer, on passe ainsi
d'un algo d'ordre e  un algo d'ordre log2(e) (soit d'ordre du nombre de bit
de e). Cet algo est bas sur le fait que x^2m = (x^2)^m.

La gnration de nombres premiers
---------------------------------
Je n'en ai pas parl plus tt car c'est un problme plus compliqu.
Tout d'abord quand on a trouv un nombre, il faut vrifier qu'il est premier.
Pour cela, on ne vas pas s'amuser  tester chaque diviseur possibles (merci
le boulot quand le nombre fait 512 bits) mais on va utilis le test
probabiliste de Miller-Rabin. Le petit thorme de Fermat nous donne que si p
est premier alors, pour tout a appartenant  Z, a^(p-1) mod p = 1 (kewl !!!).

Bon ce test dcompose p-1 = m*(2^b) o b est le plus grand possible.
On prend a en random.
On calcul z = (a^m) mod p. Si z = 1 ou z = p-1 (-1) alors p a pass le test.
On calcul z = z^2 mod p,  b-1 fois. A chaque fois si z=1 alors p n'est pas
premier. Si z = (p-1) alors p a passer le test.
Sinon Il n'a pas passer le test.

Concrtement, ce test n'est pas sr  100% : on est pas sr  100% que p soit 
premier  la sortie du test. Cepandant, si on le rpte environ 5-6 fois, la
proba que p ne soit pas premier est trs faible.

La gnrations de nombre premier, se fait pratiquement  tous les coups en
testant les nombres trouvs avec cet algorithme. Pour ma part, j'ai choisi 
un algorithme lent de gnration de nombre premier mais qui a l'avantage 
d'tre facile et efficace : On gnre un nombre alatoire assez haut, puis 
on test, de 2 en 2, si le nombre est premier.
Il existe videmment d'autre gnrateur mais ils ont le problme que crer
des nombres factorisables plus facilement avec une mthode spcifique (faut
pas rver quand mme le record  ce niveau est pour les nombres autour de 155
chiffres en utilisant plusieurs supercalculateurs en parallle (actuellement
les clef sont choisie autour de 1024 bits ce qui est 2 fois plus de chiffre
soit 10^155 fois plus de temps).
Je suis bien sur preneur de tous gnrateurs de nombre premiers rapides et
efficaces.

Bon voil c'est fini.
Puis, si vous voulez le code d'un crypteur RSA : y'a les sources de PGP et 
j'ai mis les sources d'un crypteur RSA dans la RtC TecH.
<--                          File by S/ash                                 -->
[EOF]