Craccare un generatore congruenziale lineare

29

Di recente stavo ascoltando il podcast sulla sicurezza, e hanno menzionato di passaggio che il generatore a congruenza lineare (LCG) è banale da decifrare. Uso il LCG in una classe di calcolo delle statistiche per il primo anno e ho pensato che farla crollare sarebbe stato un bel problema "extra".

Ci sono dei buoni modi per rompere il LCG che non coinvolge la forza bruta?

Non sono sicuro che questa domanda sia OT, ma non ero sicuro su quale altro posto pubblicare la domanda. Inoltre, i miei tag non sono molto utili poiché non ho abbastanza rep per creare nuovi tag.

    
posta csgillespie 02.06.2011 - 15:42
fonte

3 risposte

29

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?

    
risposta data 03.06.2011 - 02:59
fonte
16

Un generatore congruenziale lineare è lineare , che dovrebbe dire tutto.

Vale a dire, hai uno s , che viene aggiornato con: s ← come + b mod w , per due costanti a e b e un modulo w (in genere 2 32 : s , a e b sono parole a 32 bit); l'output consiste nei valori successivi di s . Se hai tre output successivi ( s 0 , s 1 e s 2 ), quindi ottieni due equazioni lineari in due incognite ( a e b ), che sono facilmente risolte con l'aritmetica elementare.

Questo può essere esteso alle varianti in cui si ottengono solo parti dei valori s , possibilmente non consecutivi. Se a e b sono due costanti a 32 bit, sono necessari solo circa 96 bit di output per ricalcolare le costanti.

    
risposta data 03.06.2011 - 01:00
fonte
3

Un altro metodo per risolvere m deriva da questo articolo .

Essenzialmente, questo metodo sfrutta il fatto che il generatore lineare congruativo fallisce drammaticamente nel test degli aerei. Il determinante di una matrice 3x3 usando 4 uscite è un multiplo di m .

Il gcd di due multipli ( n_1 e n_2 di m è m se x_1 = n_1 / m e x_2 = n_2 / m sono co -prime.

La probabilità che k interi siano co-prime è data da 1 / ζ (k) quindi la probabilità che x_1 e x_2 siano co-prime è 1 / ζ (2) o 6 / π ^ 2, circa il 61%.

Come ha detto @Thomas, una volta trovato m il resto del problema è facile.

    
risposta data 14.08.2015 - 13:34
fonte

Leggi altre domande sui tag