Comment "casser" un générateur à congruence linéaire
Le but est de retrouver les paramètres qui ont abouti à une séquence pseudo-aléatoire donnée.
Cas 1: m est connu
Soit la suite obtenue par la formule xn=a·xn-1+b mod m. On a besoin des trois premiers nombres de la suite: x0, x1 et x2. Posons y1=x1-x0 et y2=x2-x1. On a la relation: y2 = a·y1 mod m, d'où l'on tire immédiatement:
a = y2y1-1 mod m, où y1-1 mod m est obtenu avec l'algorithme d'Euclide étendu. On obtient b facilement: b = (x1 - a·x0) mod m.
Exemple 1
On connaît le début de la séquence 97, 188, 235, 293, 604, 596, 412. On sait que le modulo est 1023.
- On calcule y1 = 188-97 = 91 et y2 = 235-188 = 47.
- L'algorithme d'Euclide étendu nous dit que l'inverse modulo 1023 de 91 = 697 = y1-1.
- On obtient donc a = 47·697 mod 1023 = 23 et b = (188 - 23·97) mod 1023 = 3.
Exemple 2
On connaît le début de la séquence 99, 234, 270, 75, 705, 873, 645. On sait que le modulo est 1023.
- On calcule y1 = 234-99 = 135 et y2 = 270-234 = 36.
- L'algorithme d'Euclide étendu nous dit que 99 n'a pas d'inverse modulo 1023!
On a affaire à un mauvais générateur: tous les nombres de la suite sont des multiples de 3.
Cas 2: m n'est pas connu (méthode de Plumstead-Boyar)
Prenons directement un exemple pour expliquer la méthode (on se référera aux références pour une théorie plus approfondie).
Soit le début de la séquence 234, 1227, 12158, 2475, 26787, 30101, 12498, 18328, 76, 11400.
Étape 1: calcul des différences
| On calcule d'abord yi = xi-xi-1, pour i=1, ..., n.
Le nombre (n) de termes à choisir se détermine ainsi: il faut le plus petit n tel que le pgcd des n premiers termes soit 1 (mais prendre plus de termes n'est pas gênant).
|
Étape 2:
| Il faut trouver la solution de l'équation diophantienne c1y1 + c2y2 + ... + cnyn = 1. La fonction Mathematica ExtendedGCD s'en charge (l'algorithme est une variante du théorème d'Euclide étendu)! On calcule ensuite la valeur a' = c1y2 + c2y3 + ... + cnyn+1.
|
Étape 3:
Poser a1 = a', et m1 = . Ensuite, pour j > 1, faire:
- y'j = aj-1yj-1 mod mj-1
- mj = pgcd(mj-1, y'j-yj)
- aj = aj-1 mod mj
On s'arrête quand mj-1=mj
|
Étape 4:
| a = afin, m = mfin, b = x1 - a·x0 mod m.
|
Fichier Mathematica
Le fichier téléchargeable ci-dessous permet de casser un générateur à congruence linéaire (m connu ou pas).
Références
- Kryptologie IV.2 Kryptoanalyse von Zufallsgeneratoren :
- Lineare Kongruenzgeneratoren mit bekanntem Modul [PDF]
- Lineare Kongruenzgeneratoren mit unbekanntem Modul [PDF]
 |
Didier
Müller, 21.9.03 |