Algorithme rho de Pollard

Un article de Wikipédia, l'encyclopédie libre.
Aller à : navigation, rechercher

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) en 1975.

Il est utilisé en cryptologie.

Définition formelle[modifier | modifier le code]

Soit

f:S\to S

une fonction aléatoire, et S un ensemble fini de cardinal n, où n est l'entier à factoriser. Prenons la suite (x_n)_{n \in \mathbb{N}} définie par :

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 : Une représentation graphique plane de la suite cyclique ressemble à la lettre grecque ρ[1]. 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. Or on a:

x_a \equiv x_b \pmod{p} \Leftrightarrow pgcd(x_a - x_b, p) = p

Comme p est justement le nombre recherché, nous effectuons ces comparaisons et ces calculs modulo n. En effet si n n'est pas un nombre premier, alors il est de la forme  n=kp, k\in \mathbb{N^*}\backslash \{1\} et donc

pgcd(x_a - x_b, p) = p \Leftrightarrow pgcd(x_a - x_b, n) = p

Ainsi, à chaque étape, nous calculons le pgcd suivant:

y = pgcd(x_a - x_b, n) .

Si  1 < y < n , alors  y est un facteur non trival de  n .

Un algorithme de recherche de cycle, tel celui de Floyd, permet d'éviter de parcourir la suite indéfiniment de manière inutile puisqu'une fois qu'un tour de boucle est effectué, les mêmes valeurs sont ensuite testées. Cet algorithme défini une relation entre les indices a et b. Pour le cas de l'algorithme de Floyd, on a  2a = b.

Dans le cas où on ne trouve aucun facteur non-trivial avant de détecter le bouclage, il faut alors changer le choix de f.

Performances[modifier | modifier le code]

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 demi-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).

Choix de f[modifier | modifier le code]

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

f(x)=x^2+c, \quad c \notin \{0,-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.

Exemple[modifier | modifier le code]

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 Brent (en). 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.

Variante[modifier | modifier le code]

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).

Notes et références[modifier | modifier le code]

  1. Cf. la visualisation dans L'algorithme de Floyd

Voir aussi[modifier | modifier le code]