Sì. Esistono modi estremamente efficienti per rompere un generatore congruenziale lineare.
Un generatore congruenziale lineare è definito da s n + 1 = come n + b mod m , dove m è il modulo. Nella sua forma più semplice, il generatore emette solo s n come n th numero pseudocasuale. Se m è noto all'attaccante e a , b non sono noti, Thomas ha descritto come suddividerlo.
Se nessuno di a , b , m è noto, si può ancora rompere un generatore congruenziale lineare, recuperando prima m . È un esercizio interessante dedurre come farlo in modo efficiente; si può fare. Mostrerò come sotto; non continuare a leggere se preferisci provare a capirlo da solo.
To recover m, define tn = sn+1 - sn and un = |tn+2 tn - t2n+1|; then with high probability you will have m = gcd(u1, u2, ..., u10). 10 here is arbitrary; if you make it k, then the probability that this fails is exponentially small in k. I can share a pointer to why this works, if anyone is interested.
L'importante lezione è che il generatore di congruenza lineare è irrecentemente insicuro e completamente inadatto per l'uso crittografico .
Aggiunto: @AviD mi odierà ancora di più :), ma ecco la matematica del perché questo funziona, per chi lo ha richiesto.
The key idea: tn+1 = sn+1 - sn = (a sn - b) - (a sn-1 - b) = a sn - a sn-1 = a tn mod m, and tn+2 = a2 tn mod m, and tn+3 = a3 tn mod m. Therefore tn+2 tn - tn+12 = 0 mod m, i.e., |tn+2 tn - tn+12| is a random multiple of m. Nifty number theory fact: the gcd of two random multiples of m will be m with probability 6/π2 = 0.61; and if you take the gcd of k of them, this probability gets very close to 1 (exponentially fast in k). Is that cool, or what?