Algorithme rho de Pollard

Un article de Wikipédia, l'encyclopédie libre.

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 avec de petits facteurs. Il fut conçu par John M. Pollard en 1975.

Il est utilisé en cryptologie.

Sommaire

[modifier] Définition formelle

Soit

f:S\to S

une fonction aléatoire, et S un ensemble fini de cardinalité n, où n est l'entier à factoriser. Prenons la suite :

x_0,x_1,\ldots

définie comme :

x_{i+1}=f(x_i)\hbox{ mod }n,\,x_0=2.

Ici, (mod) désigne la congruence sur les entiers. Comme S est un ensemble fini, la suite doit tôt ou tard se répéter. Ceci est la raison du nom de l'algorithme : la suite cyclique ressemble à la lettre grecque ρ. Maintenant, le but est de trouver xa et xb tel que

x_a \equiv x_b \pmod{p}

p est un facteur non-trivial de n. Ceci voudrait dire que le pgcd(xaxb, p) = p. Comme nous ne connaissons pas p, nous effectuons ces comparaisons et ces calculs modulo n.

La recherche de xa et xb est une modification de l'algorithme de recherche de cycle de Floyd. Nous exécutons deux suites définies par notre fonction aléatoire f, mais nous exécutons une deux fois plus vite que l'autre. À chaque étape, nous calculons pgcd(|xa-xb|, n) pour vérifier si nous avons un facteur. Si le pgcd est plus grand que 1 et plus petit que n, alors nous en avons un.

[modifier] Performances

L'algorithme est 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 274177 du sixième nombre de Fermat en une demie seconde. Le sixième nombre de Fermat est 18446744073709551617 (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 10023859281455311421 (le produit de 2 nombres premiers à 10 chiffres).

[modifier] Choix de f

Pour f, nous choisissons un polynôme avec coefficients entiers. Les plus communs sont de la forme :

f(x)=x^2+c\hbox{ mod }n,\,c\neq0,-2.

Pour certains f, l'algorithme ne trouvera pas de facteur. Si pgcd(|xaxb|, 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.

[modifier] Exemple

Voici un exemple. Soit n = 8 051 et f(x) = x2 + 1 mod 8 051.

i xi x2i pgcd(|xix2i|, 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.

Le succès le plus remarquable de l'algorithme rho a été la factorisation du huitième nombre de Fermat par Pollard et Richard Brent. Ils ont utilisé une version modifiée de l'algorithme, qui a trouvé un facteur premier inconnu précédemment. La factorisation complète de F8 prend, au total, 2 heures sur un Univac 1100/42.

[modifier] Variante

L'algorithme peut être utilisé pour des recherches de collisions, en particulier dans les fonctions de hachage. Soit H(M_1)~ l'empreinte du message M_1~. On cherche un deuxième message M_2~, différent de M_1~, tel que H(M_1)=H(M_2)~. 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 x~ dont la taille est égale à l'empreinte. On itère le hachage en calculant d'abord H(x)~, H(H(x))~ 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 y~. On reprend le message initial x~ et on effectue alors des itérations en parallèle sur les deux empreintes :

  • H(x)~, H(H(x))~, H(H(H(x)))~, etc.
  • H(y)~, H(H(y))~, H(H(H(y)))~, 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 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).

[modifier] Voir aussi

Méthode des Kangourous de Pollard

[modifier] Liens externes