Algorithme rho de Pollard
En arithmĂ©tique modulaire, lâalgorithme rho de Pollard est un algorithme de dĂ©composition en produit de facteurs premiers spĂ©cifique qui est seulement effectif pour factoriser les entiers naturels avec de petits facteurs. Il fut conçu par John M. Pollard en 1975[1].
Il est utilisé en cryptologie. Le succÚs le plus remarquable de l'algorithme rho a été la factorisation du huitiÚme nombre de Fermat par Pollard et Brent, ce dernier ayant proposé une version améliorée de l'algorithme[2]. Une version modifiée de l'algorithme a été utilisée et a trouvé un facteur premier inconnu précédemment. La factorisation complÚte de F8 a pris, au total, 2 heures sur un Univac 1100/42[3].
Algorithme
Principe mathématique
Soit un nombre entier composĂ©, oĂč est un facteur non-trivial inconnu, que l'algorithme essaye de dĂ©terminer. On se place dans ; autrement dit, on est dans et les calculs s'effectuent modulo .
Fixons une fonction , par exemple . La fonction devant ĂȘtre rapide Ă calculer et pseudo-alĂ©atoire. On dĂ©finit alors la suite par , oĂč est choisi de maniĂšre alĂ©atoire. Comme la suite prend un nombre fini de valeurs, elle finit par se rĂ©pĂ©ter. C'est la raison du nom de l'algorithme : une reprĂ©sentation graphique de la suite cyclique ressemble Ă la lettre grecque Ï, voir figure ci-contre.
ConsidĂ©rons maintenant la suite des valeurs . Comme est inconnu, cette suite ne peut pas ĂȘtre calculĂ©e explicitement. Nous savons qu'elle se rĂ©pĂšte Ă©galement. A cause du paradoxe des anniversaires, sa pĂ©riode de rĂ©pĂ©tition est souvent strictement plus petite que celui de la suite . Si tel est le cas, il existe deux indices tels que mais .
Alors divise mais . Autrement dit, est un facteur non trivial de .
Pour déterminer les indices et , on utilise l'algorithme de Floyd pour rechercher un cycle. Il suffit alors de calculer (pour ) jusqu'à obtenir un facteur non trivial de ou bien obtenir le facteur . En effet, celui-ci indique qu'on a , donc qu'on a terminé de parcourir le cycle des . On peut alors recommencer en changeant la valeur de ou la fonction .
Algorithme
On donne ici le pseudo-code, comme dans [4].
entrée : un entier n composé, qui n'est pas une puissance d'un nombre premier
sortie : un facteur non trivial de n, ou alors une erreur
Pollard-Rho(n)
(a, b) := (2, 2) # dans [4], ils prennent x0 = 2
répéter
(a, b) = (f(a), f(f(b)))
d := pgcd(a-b, n)
si 1 < d < n
retourner d
si d = n
erreur
En Python aprÚs avoir défini une fonction pgcd:
def rho_pollard(n):
def f(x):
return x*x+1
x, y, d = 2, 2, 1
while d==1:
x = f(x) % n
y = f(f(y)) % n
print (x,y)
d = pgcd(x-y, n)
return d
Exemple
Soit n = 8 051 et f(x) = x2 + 1 mod 8 051. On prend x0 = 2.
i | xi | x2i | pgcd(xi â x2i, 8051) |
1 | 5 | 26 | 1 |
2 | 26 | 7474 | 1 |
3 | 677 | 871 | 97 |
97 est un facteur non trivial de 8 051. Les autres valeurs de c peuvent donner le facteur 83 Ă la place de 97.
Discussions
Performances
ConsidĂ©rons un nombre entier rĂ©el Ă factoriser Ă l'aide de l'algorithme. Soit un facteur premier de , il est probable d'obtenir ce facteur aprĂšs itĂ©rations de la boucle et nous pouvons donc estimer de maniĂšre heuristique Ă l'aide du paradoxe des anniversaires la complexitĂ© de algorithme Ă [5] mais une preuve plus rigoureuse reste Ă apporter[6]. L'algorithme est ainsi trĂšs rapide pour les nombres avec des petits facteurs. Par exemple, sur une station de travail Ă 733 MHz, une implĂ©mentation de l'algorithme rho, sans aucune optimisation, trouve le facteur 274 177 du sixiĂšme nombre de Fermat en une demi-seconde. Le sixiĂšme nombre de Fermat est 18 446 744 073 709 551 617 (20 chiffres dĂ©cimaux). NĂ©anmoins, pour un nombre semi-premier de mĂȘme taille, la mĂȘme station de travail prend environ 9 secondes pour trouver un facteur de 10 023 859 281 455 311 421 (le produit de 2 nombres premiers Ă 10 chiffres).
Choix de f
Pour f, nous choisissons un polynĂŽme avec coefficients entiers. Les plus communs sont de la forme :
Pour certains f, l'algorithme ne trouvera pas de facteur. Si pgcd(|xa â xb|, n) = n, l'algorithme Ă©chouera, parce que xa = xb, ce qui veut dire que la suite Ă©tait bouclĂ©e et cela continuera tant que le travail prĂ©cĂ©dent se rĂ©pĂštera. En changeant c ou f, on peut augmenter la chance de succĂšs. Cette situation d'Ă©chec peut survenir pour tous les nombres premiers, elle peut survenir pour certains nombres composĂ©s aussi.
Variante
L'algorithme peut ĂȘtre utilisĂ© pour des recherches de collisions, en particulier dans les fonctions de hachage. Soit l'empreinte du message On cherche un deuxiĂšme message diffĂ©rent de tel que GrĂące au paradoxe des anniversaires et avec l'aide de l'algorithme de Pollard, on peut faire cela sans consommer Ă©normĂ©ment de mĂ©moire. Une implĂ©mentation naĂŻve du paradoxe des anniversaires nĂ©cessiterait de stocker toutes les empreintes gĂ©nĂ©rĂ©es et de les comparer. L'algorithme Rho permet de s'affranchir de cette contrainte.
Pour y parvenir, on crée un message aléatoire dont la taille est égale à l'empreinte. On itÚre le hachage en calculant d'abord et ainsi de suite. Le nombre d'états étant fini, cette itération va forcément entrer dans un cycle que l'on peut détecter avec les algorithmes vus ci-dessus. Une fois le cycle détecté, il faut trouver les deux messages distincts qui entrent en collision. Lorsque le cycle est détecté, on est en présence de l'empreinte On reprend le message initial et l'on effectue alors des itérations en parallÚle sur les deux empreintes :
- etc.
- etc.
On itÚre jusqu'à obtenir deux sorties identiques, signe d'une collision entre deux messages distincts. En pratique, on ne considÚre qu'une partie de la sortie de la fonction de hachage pour éviter des temps de calcul trop longs. Une variante pour le calcul distribué a été employée dans le cadre du projet MD5CRK (en) qui visait à trouver une collision complÚte (128 bits, complexité de 264 opérations) sur la fonction de hachage cryptographique MD5. Avec une bonne implémentation exécutée sur un seul PC, il est possible de trouver des collisions sur 69 bits consécutifs de SHA-1 en quelques jours (SHA-1 a une empreinte de 160 bits).
Notes et références
- (en) J. M. Pollard, « A monte carlo method for factorization », BIT Numerical Mathematics, vol. 15, no 3,â , p. 331â334 (ISSN 1572-9125, DOI 10.1007/BF01933667, lire en ligne, consultĂ© le )
- Richard P. Brent, « An improved Monte Carlo factorization algorithm », BIT, vol. 20, no 2,â , p. 176â184 (ISSN 0006-3835 et 1572-9125, DOI 10.1007/bf01933190, lire en ligne, consultĂ© le )
- (en) Richard P. Brent et John M. Pollard, « Factorization of the eighth Fermat number », Mathematics of Computation, vol. 36, no 154,â , p. 627â630 (ISSN 0025-5718 et 1088-6842, DOI 10.1090/S0025-5718-1981-0606520-5, lire en ligne, consultĂ© le )
- Handbook of Applied Cryptography, by Alfred J. Menezes, Paul C. van Oorschot, Scott A. Vanstone, p. 125, describes this algorithm and others
- Thomas Cormen, Charles Leiserson, Ronald Rivest et Clifford Stein, Introduction à l'algorithmique (seconde édition), Dunod, (ISBN 2 10 003922 9), chap. 31.9 (« Factorisation des entiers »), p. 865-870
- Steven D. Galbraith, Mathematics of public key cryptography, (ISBN 978-1-139-22114-6, 1-139-22114-0 et 1-107-01392-5, OCLC 793510851, lire en ligne)