Metody probabilistyczne Generatory liczb pseudolosowych Jędrzej Potoniec
Agenda 1 Wprowadzenie 2 Linear Congruential Generator Odzyskiwanie parametrów 3 Multiply-with-carry 4 Xorshift 5 KISS: Keep it simple, stupid! 6 Mersenne twister Odtwarzanie stanu 7 Fortuna 8 Testowanie generatorów 9 Podsumowanie
9 http://dilbert.com/strip/2001-10-25
Ciąg liczb losowych (X 1, X 2,...)
Ciąg liczb losowych (X 1, X 2,...) 1 X i mają identyczne rozkłady 2 X i są niezależne
Generowanie liczb o zadanym rozkładzie wejście X U(0, 1) wyjście Y z zadanego rozkładu
Generowanie liczb o zadanym rozkładzie wejście X U(0, 1) wyjście Y z zadanego rozkładu Y = F 1 (X )
Generowanie liczb o zadanym rozkładzie wejście X U(0, 1) wyjście Y z zadanego rozkładu Y = F 1 (X ) Y Exp(0,5) x = 0,1563
A jeżeli odwrotność F nie jest znana? 1 repeat 2 y a+b 2 3 if F (y) X then a y 4 else b y 5 until b a δ 6 return y
A jeżeli odwrotność F nie jest znana? Y N (0, 1) x = 0,1563 1 repeat 2 y a+b 2 3 if F (y) X then a y 4 else b y 5 until b a δ 6 return y
A jeżeli odwrotność F nie jest znana? Y N (0, 1) x = 0,1563 a b y F (y) 10,000 10,000 0,000 0,500 1 repeat 2 y a+b 2 3 if F (y) X then a y 4 else b y 5 until b a δ 6 return y
A jeżeli odwrotność F nie jest znana? 1 repeat 2 y a+b 2 3 if F (y) X then a y 4 else b y 5 until b a δ 6 return y Y N (0, 1) x = 0,1563 a b y F (y) 10,000 10,000 0,000 0,500 10,000 0,000 5,000 0,000 5,000 0,000 2,500 0,006 2,500 0,000 1,250 0,106 1,250 0,000 0,625 0,266 1,250 0,625 0,938 0,174 1,250 0,938 1,094 0,137 1,094 0,938 1,016 0,155 1,016 0,938 0,977 0,164 1,016 0,977 0,996 0,160 1,016 0,996 1,006 0,157 1,016 1,006 1,011 0,156 1,011 1,006 1,008 0,157
A dla rozkładów dyskretnych? 1 i 1 2 s p 1 3 while s < X do 4 i i + 1 5 s s + p i 6 end 7 return y i
A dla rozkładów dyskretnych? 1 i 1 2 s p 1 3 while s < X do 4 i i + 1 5 s s + p i 6 end 7 return y i Y B(30, 0,3) x = 0,1563
A dla rozkładów dyskretnych? 1 i 1 2 s p 1 3 while s < X do 4 i i + 1 5 s s + p i 6 end 7 return y i Y B(30, 0,3) x = 0,1563 i = y p i s 1 0,000 0,000
A dla rozkładów dyskretnych? 1 i 1 2 s p 1 3 while s < X do 4 i i + 1 5 s s + p i 6 end 7 return y i Y B(30, 0,3) x = 0,1563 i = y p i s 1 0,000 0,000 2 0,002 0,002 3 0,007 0,009 4 0,021 0,030 5 0,046 0,077 6 0,083 0,160
Przypadek szczególny: skrócony rozkład równomierny wejście X U(0, n) wyjście Y U(0, m)
Przypadek szczególny: skrócony rozkład równomierny wejście X U(0, n) wyjście Y U(0, m) r = new Random ( 1 ) ; f o r ( i n t i =0; i <200000 11; i ++) tab [ i ] = r. n e x t I n t ( ) % 1 1 ;
0 0 2 4 6 8 10 X i Przypadek szczególny: skrócony rozkład równomierny wejście X U(0, n) wyjście Y U(0, m) r = new Random ( 1 ) ; f o r ( i n t i =0; i <200000 11; i ++) tab [ i ] = r. n e x t I n t ( ) % 1 1 ; 200000 mod 11, 200000 11 =2200000 warto ci, min=199251, max=201042 150000 Liczba wyst pie 100000 50000
Przypadek szczególny: skrócony rozkład równomierny r = new Random ( 1 ) ; f o r ( i n t i =0; i <200000 11;) { tab [ i ] = r. n e x t I n t ( ) & 0 b1111 ; i f ( tab [ i ] <11) i ++; }
Przypadek szczególny: skrócony rozkład równomierny r = new Random ( 1 ) ; f o r ( i n t i =0; i <200000 11;) { tab [ i ] = r. n e x t I n t ( ) & 0 b1111 ; i f ( tab [ i ] <11) i ++; } mod 16 uci te, 200000 11 =2200000 warto ci, min=199896, max=200131 200000 150000 Liczba wyst pie 100000 50000 0 0 2 4 6 8 10 X i
To samo z bliska Porównanie 201500 201000 Liczba wyst pie 200500 200000 199500 199000 198500 0 2 4 6 8 10
Analiza algorytmu wejście X i U(0, 2 n 1) X i niezależne wyjście (Y 1, Y 2,..., Y l ) Y j U(0, k 1) 2 n 1 < k 2 n 1
Analiza algorytmu wejście X i U(0, 2 n 1) X i niezależne wyjście (Y 1, Y 2,..., Y l ) Y j U(0, k 1) 2 n 1 < k 2 n 1 Ile potrzebujemy liczb na wejściu, żeby wygenerować l liczb na wyjściu?
Ciąg liczb losowych (X 1, X 2,...) 1 X i U(0, n) lub X i U(0, 1) 2 X i są niezależne
Linear Congruential Generator (LCG) X 0 =seed X n+1 =(ax n + c) mod m
Równomierność a =1229 c =1 m =2048 X 0 =1 n =10240 5 4 Liczba wyst pie 3 2 1 0 0 500 1000 1500 2000 2500 X i
Równomierność a =65538 c =2 m =5040 X 0 =1 n =25200 2000 Liczba wyst pie 1500 1000 500 0 0 1000 2000 3000 4000 5000 6000 X i
Równomierność 1 247, 460, 93, 1658, 1971, 1624, 1145, 230, 47, 420, 85, 18, 1643, 1968, 2033, 2046, 1639, 1148, 1869 2 362, 1478, 1406, 110, 1982, 398, 2126, 2990, 3422, 1118, 5006, 4430, 4142, 3998, 1406, 110, 1982, 398, 2126
Zasady doboru współczynników Twierdzenie LCG ma okres m wtedy i tylko wtedy gdy jednocześnie: m i c są względnie pierwsze, a 1 jest podzielne przez wszystkie czynniki pierwsze m, a 1 jest podzielne przez 4 jeżeli m jest podzielne przez 4.
Zasady doboru współczynników Twierdzenie LCG ma okres m wtedy i tylko wtedy gdy jednocześnie: m i c są względnie pierwsze, a 1 jest podzielne przez wszystkie czynniki pierwsze m, a 1 jest podzielne przez 4 jeżeli m jest podzielne przez 4. a =1229 c =1 m =2048 X 0 =1 n =10240 a =65538 c =2 m =5040 X 0 =1 n =25200 5 2000 Liczba wyst pie 4 3 2 Liczba wyst pie 1500 1000 1 500 0 0 500 1000 1500 2000 2500 X i 0 0 1000 2000 3000 4000 5000 6000 X i
Zajrzyjmy do kodu grepcode.com/file/repository.grepcode.com/java/root/jdk/ openjdk/8u40-b25/java/util/random.java#random.next%28int%29... p r i v a t e s t a t i c f i n a l long m u l t i p l i e r = 0x5DEECE66DL ; p r i v a t e s t a t i c f i n a l long addend = 0xBL ; p r i v a t e s t a t i c f i n a l long mask = (1 L << 48) 1 ; protected i n t next ( i n t b i t s ) { long o l d s e e d, n e x t s e e d ; AtomicLong seed = t h i s. seed ; do { o l d s e e d = seed. get ( ) ; n e x t s e e d = ( o l d s e e d m u l t i p l i e r + addend ) & mask ; } while (! seed. compareandset ( o l d s e e d, n e x t s e e d ) ) ; return ( i n t ) ( n e x t s e e d >>> (48 b i t s ) ) ; }
Niezależność w LCG Ciąg liczb losowych (X 1, X 2,...) 1 X i U(0, n) lub X i U(0, 1) 2 X i są niezależne P(X n+1 = 7 X n = 7) =...
Niezależność w LCG Ciąg liczb losowych (X 1, X 2,...) 1 X i U(0, n) lub X i U(0, 1) 2 X i są niezależne P(X n+1 = 7 X n = 7) =... P(X n+1 = 7 X n+2 = 7... X n+m 1 = 7 X n = 7) =...
Niezależność w LCG Ciąg liczb losowych (X 1, X 2,...) 1 X i U(0, n) lub X i U(0, 1) 2 X i są niezależne P(X n+1 = 7 X n = 7) =... P(X n+1 = 7 X n+2 = 7... X n+m 1 = 7 X n = 7) =... P(X n+m = 7 X n = 7) =...
Problem ataku na generator liczb losowych Mając dane: typ generatora (np. LCG) n kolejnych liczb z wyjścia: (x 1, x 2,..., x n ) przewidzieć kolejną wartość x n+1.
Odwrotność modulo odwrotność x x 1 = 1 x 1 R
Odwrotność modulo odwrotność x x 1 = 1 x 1 R odwrotność modulo x x 1 mod m = 1 x 1 {0, 1,..., m 1}
Odwrotność modulo odwrotność x x 1 = 1 x 1 R odwrotność modulo x x 1 mod m = 1 x 1 {0, 1,..., m 1} Twierdzenie x 1 istnieje wtw nwd(x, m) = 1
Rozszerzony algorytm Euklidesa 1 r 0 m r 1 x 2 s 0 0 s 1 1 3 i 1 4 while r i 0 do 3 1 mod 17 =? 5 q r i 1 r i 6 r i+1 r i 1 qr i 7 s i+1 s i 1 qs i 8 i i + 1 9 end 10 if s i 1 < 0 then return s i 1 + m 11 else return s i 1
Rozszerzony algorytm Euklidesa 1 r 0 m r 1 x 2 s 0 0 s 1 1 3 i 1 4 while r i 0 do 5 q r i 1 r i 6 r i+1 r i 1 qr i 3 1 i mod 17 =? q r i s i 0 17 0 1 3 1 7 s i+1 s i 1 qs i 8 i i + 1 9 end 10 if s i 1 < 0 then return s i 1 + m 11 else return s i 1
Rozszerzony algorytm Euklidesa 1 r 0 m r 1 x 2 s 0 0 s 1 1 3 i 1 4 while r i 0 do 5 q r i 1 r i 6 r i+1 r i 1 qr i 7 s i+1 s i 1 qs i 8 i i + 1 9 end 10 if s i 1 < 0 then return s i 1 + m 11 else return s i 1 3 1 i mod 17 =? q r i s i 0 17 0 1 3 1 2 5 2 5
Rozszerzony algorytm Euklidesa 1 r 0 m r 1 x 2 s 0 0 s 1 1 3 i 1 4 while r i 0 do 5 q r i 1 r i 6 r i+1 r i 1 qr i 7 s i+1 s i 1 qs i 8 i i + 1 9 end 10 if s i 1 < 0 then return s i 1 + m 11 else return s i 1 3 1 i mod 17 =? q r i s i 0 17 0 1 3 1 2 5 2 5 3 1 1 6
Rozszerzony algorytm Euklidesa 1 r 0 m r 1 x 2 s 0 0 s 1 1 3 i 1 4 while r i 0 do 5 q r i 1 r i 6 r i+1 r i 1 qr i 7 s i+1 s i 1 qs i 8 i i + 1 9 end 10 if s i 1 < 0 then return s i 1 + m 11 else return s i 1 3 1 i mod 17 =? q r i s i 0 17 0 1 3 1 2 5 2 5 3 1 1 6 4 2 0 17
Rozszerzony algorytm Euklidesa 1 r 0 m r 1 x 2 s 0 0 s 1 1 3 i 1 4 while r i 0 do 5 q r i 1 r i 6 r i+1 r i 1 qr i 7 s i+1 s i 1 qs i 8 i i + 1 9 end 10 if s i 1 < 0 then return s i 1 + m 11 else return s i 1 3 1 i mod 17 =? q r i s i 0 17 0 1 3 1 2 5 2 5 3 1 1 6 4 2 0 17 3 6 = 18 = 1 17 + 1
Łamanie LCG wyjście LCG 17, 15, 76, 38, 63, 70, 59, 30, 64, 80 zadanie m =?, a =?, c =?
Jeżeli znamy m x 2 = ax 1 + c x 3 = ax 2 + c mod m mod m x 3 x 2 = a(x 2 x 1 ) mod m [ ] (x 3 x 2 )(x 2 x 1 ) 1 a mod m
Odtwarzanie m x 2 =(ax 1 + c) mod m
Odtwarzanie m x 2 =(ax 1 + c) mod m x 3 =(ax 2 + c) mod m =...
Odtwarzanie m x 2 =(ax 1 + c) mod m x 3 =(ax 2 + c) mod m = (a 2 x 1 + (a + 1)c) mod m x 4 =(ax 3 + c) mod m =...
Odtwarzanie m x 2 =(ax 1 + c) mod m x 3 =(ax 2 + c) mod m = (a 2 x 1 + (a + 1)c) mod m x 4 =(ax 3 + c) mod m = (a 3 x 1 + (a 2 + a + 1)c) mod m x n =...
Odtwarzanie m x n =(a n 1 x 1 + (a n 2 +... + 1)c) mod m x n+1 x n =...
Odtwarzanie m x n =(a n 1 x 1 + (a n 2 +... + 1)c) mod m x n+1 x n =a n 1 (x 2 x 1 ) mod m = a n 1 δ mod m x n+2 x n =...
Odtwarzanie m x n =(a n 1 x 1 + (a n 2 +... + 1)c) mod m x n+1 x n =a n 1 (x 2 x 1 ) mod m = a n 1 δ mod m x n+2 x n =a n 1 (a + 1)δ mod m s =(x 4 x 2 )(x 2 x 1 ) =... t =(x 3 x 2 )(x 3 x 1 ) =...
Odtwarzanie m x n =(a n 1 x 1 + (a n 2 +... + 1)c) mod m x n+1 x n =a n 1 (x 2 x 1 ) mod m = a n 1 δ mod m x n+2 x n =a n 1 (a + 1)δ mod m s =(x 4 x 2 )(x 2 x 1 ) = a(a + 1)δ δ t =(x 3 x 2 )(x 3 x 1 ) = aδ(a + 1) δ s t mod m =...
Odtwarzanie m x n =(a n 1 x 1 + (a n 2 +... + 1)c) mod m x n+1 x n =a n 1 (x 2 x 1 ) mod m = a n 1 δ mod m x n+2 x n =a n 1 (a + 1)δ mod m s =(x 4 x 2 )(x 2 x 1 ) = a(a + 1)δ δ t =(x 3 x 2 )(x 3 x 1 ) = aδ(a + 1) δ s t mod m =... u =(x 3 x 2 ) 2 =... v =(x 4 x 3 )(x 2 x 1 ) =...
Odtwarzanie m x n =(a n 1 x 1 + (a n 2 +... + 1)c) mod m x n+1 x n =a n 1 (x 2 x 1 ) mod m = a n 1 δ mod m x n+2 x n =a n 1 (a + 1)δ mod m s =(x 4 x 2 )(x 2 x 1 ) = a(a + 1)δ δ t =(x 3 x 2 )(x 3 x 1 ) = aδ(a + 1) δ s t mod m =... u =(x 3 x 2 ) 2 =... v =(x 4 x 3 )(x 2 x 1 ) =... u v mod m =...
Odtwarzanie m s =(x 4 x 2 )(x 2 x 1 ) = a(a + 1)δ δ t =(x 3 x 2 )(x 3 x 1 ) = aδ(a + 1) δ s t mod m =... u =(x 3 x 2 ) 2 =... v =(x 4 x 3 )(x 2 x 1 ) =... u v mod m =... nwd(s t, u v) =...
Multiply-with-carry (X 0, C 0 ) =seed X n+1 =ax n + C n mod b axn + C n C n+1 = b
Multiply-with-carry (X 0, C 0 ) =seed X n+1 =ax n + C n mod b axn + C n C n+1 = b
Multiply-with-carry (X 0, C 0 ) =seed X n+1 =ax n + C n mod b axn + C n C n+1 = b Uwaga seed nie może być (0, 0) ani (a 1, b 1)
Dobór parametrów MWC Twierdzenie (o rozkładzie) Niech k {2, 3,..., ab} będzie najmniejszą liczbą taką, że b k mod (ab 1) = 1 Jeżeli k = ab 2, to MWC ma okres k (maksymalny możliwy) i ax n + C n U(1, ab 2).
Dobór parametrów MWC Twierdzenie (o rozkładzie) Niech k {2, 3,..., ab} będzie najmniejszą liczbą taką, że b k mod (ab 1) = 1 Jeżeli k = ab 2, to MWC ma okres k (maksymalny możliwy) i ax n + C n U(1, ab 2). Jaki rozkład ma zmienna X n, jeżeli parametry zapewniają pełen okres?
Implementacja // seed uint16 t c =10; uint16 t x =123; uint16 t next ( ) { uint32 t t=a x+c ; c = t >>16; x = t&0xffff ; return x ; }
Implementacja // seed uint16 t c =10; uint16 t x =123; uint16 t next ( ) { uint32 t t=a x+c ; c = t >>16; x = t&0xffff ; return x ; } Przykre twierdzenie Generator MWC dla którego b = 2 2u nie może mieć pełnego okresu.
XOR p q p q 0 0 0 1 1 0 1 1
XOR p q p q 0 0 0 0 1 1 1 0 1 1 1 0
XOR p q p q 0 0 0 0 1 1 1 0 1 1 1 0 x 9 1 0 0 1 y 5 0 1 0 1 x y......
XOR p q p q 0 0 0 0 1 1 1 0 1 1 1 0 x 9 1 0 0 1 y 5 0 1 0 1 x y... 1 1 0 0
XOR p q p q 0 0 0 0 1 1 1 0 1 1 1 0 x 9 1 0 0 1 y 5 0 1 0 1 x y 12 1 1 0 0
XOR p q p q 0 0 0 0 1 1 1 0 1 1 1 0 x 9 1 0 0 1 y 5 0 1 0 1 x y 12 1 1 0 0 x =[1, 0, 0, 1] y =[0, 1, 0, 1] x + y =[1, 1, 0, 0]
SHL y 9 1 0 0 1 y<<1......
SHL y 9 1 0 0 1 y<<1... 0 0 1 0
SHL y 9 1 0 0 1 y<<1 2 0 0 1 0
SHL y 9 1 0 0 1 y<<1 2 0 0 1 0 y =[1, 0, 0, 1] = [y 3, y 2, y 1, y 0 ] yl =[0, 0, 1, 0] = [y 2, y 1, y 0, 0]
SHL y 9 1 0 0 1 y<<1 2 0 0 1 0 y =[1, 0, 0, 1] = [y 3, y 2, y 1, y 0 ] yl =[0, 0, 1, 0] = [y 2, y 1, y 0, 0]???????? L =???????? ] [ ] [y 3 y 2 y 1 y 0 y 2 y 1 y 0 0
SHL y 9 1 0 0 1 y<<1 2 0 0 1 0 y =[1, 0, 0, 1] = [y 3, y 2, y 1, y 0 ] yl =[0, 0, 1, 0] = [y 2, y 1, y 0, 0] 0 0 0 0 1 0 0 0 L = 0 1 0 0 0 0 1 0 ] [ ] [y 3 y 2 y 1 y 0 y 2 y 1 y 0 0
SHR y 9 1 0 0 1 y>>1......
SHR y 9 1 0 0 1 y>>1... 0 1 0 0
SHR y 9 1 0 0 1 y>>1 4 0 1 0 0
SHR y 9 1 0 0 1 y>>1 4 0 1 0 0 y =[1, 0, 0, 1] = [y 3, y 2, y 1, y 0 ] yr =[0, 1, 0, 0] = [0, y 3, y 2, y 1 ]
SHR y 9 1 0 0 1 y>>1 4 0 1 0 0 y =[1, 0, 0, 1] = [y 3, y 2, y 1, y 0 ] yr =[0, 1, 0, 0] = [0, y 3, y 2, y 1 ]???????? R =???????? ] ] [y 3 y 2 y 1 y 0 [0 y 3 y 2 y 1
SHR y 9 1 0 0 1 y>>1 4 0 1 0 0 y =[1, 0, 0, 1] = [y 3, y 2, y 1, y 0 ] yr =[0, 1, 0, 0] = [0, y 3, y 2, y 1 ] 0 1 0 0 0 0 1 0 R = 0 0 0 1 0 0 0 0 ] ] [y 3 y 2 y 1 y 0 [0 y 3 y 2 y 1
Wielokrotne przesunięcia 0 1 0 0 0 0 1 0 R = 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 L = 0 1 0 0 0 0 1 0
Wielokrotne przesunięcia 0 1 0 0 0 0 0 0 0 0 1 0 1 0 0 0 R = L = 0 0 0 1 0 1 0 0 0 0 0 0 0 0 1 0 R = L T
Wielokrotne przesunięcia 0 1 0 0 0 0 1 0 R = 0 0 0 1 0 0 0 0 R = L T 0 0 0 0 1 0 0 0 L = 0 1 0 0 0 0 1 0 y>>n = ((y>>1)>>1)>>...>>1 = y R R... R = yr n y<<n = ((y<<1)<<1)<<...<<1 = y L L... L = yl n
Xorshift yˆ=y <<17;
Xorshift yˆ=y <<17; y=y ˆ( y <<17);
Xorshift yˆ=y <<17; y=y ˆ( y <<17); y = y + y L 17 = y(i + L 17 )
Xorshift yˆ=y <<17; y=y ˆ( y <<17); y = y + y L 17 = y(i + L 17 ) Generator Xorshift T = (I + T 1 a 1 )(I + T 2 a 2 )... (I + T l a l ) T i {L, R} a i {1,..., m 1}
Xorshift yˆ=y <<17; y=y ˆ( y <<17); y = y + y L 17 = y(i + L 17 ) Generator Xorshift T = (I + T 1 a 1 )(I + T 2 a 2 )... (I + T l a l ) T i {L, R} a i {1,..., m 1} X 0 =seed {0, 1} m X n+1 =X n T
Implementacja uint32 t x o r s h i f t ( uint32 t seed ) { seedˆ=seed <<2; seedˆ=seed >>7; seedˆ=seed <<9; return seed ; }
32-bitowy oraz 64-bitowy Xorshift Twierdzenie (o długości) 32-bitowy Xorshift (m = 32) oraz 64-bitowy Xorshift (m = 64) o pełnym okresie wymaga przynajmniej trzech przesunięć (l 3)
32-bitowy oraz 64-bitowy Xorshift Twierdzenie (o długości) 32-bitowy Xorshift (m = 32) oraz 64-bitowy Xorshift (m = 64) o pełnym okresie wymaga przynajmniej trzech przesunięć (l 3) Twierdzenie (o kierunkach) Jeżeli przesunięcia <<a, >>b, <<c zapewniają pełen okres, to dokonanie jednej lub kilku poniższych operacji nie zmieni długości okresu: odwrócenie kierunku wszystkich przesunieć zamiana a i c miejscami zamiana dwóch ostatnich przesunięć miejscami: <<a, <<c, >>b
32-bitowy oraz 64-bitowy Xorshift Twierdzenie (o długości) 32-bitowy Xorshift (m = 32) oraz 64-bitowy Xorshift (m = 64) o pełnym okresie wymaga przynajmniej trzech przesunięć (l 3) Twierdzenie (o kierunkach) Jeżeli przesunięcia <<a, >>b, <<c zapewniają pełen okres, to dokonanie jednej lub kilku poniższych operacji nie zmieni długości okresu: odwrócenie kierunku wszystkich przesunieć zamiana a i c miejscami zamiana dwóch ostatnich przesunięć miejscami: <<a, <<c, >>b Twierdzenie (o współczynnikach) Istnieje dokładnie 81 trójek (a, b, c) zapewniających pełen okres dla m = 32 i 275 trójek dla m = 64. G. Marsaglia Xorshift RNGs w: Journal of Statistical Software 8(14)
Trójki (a, b, c) dla m = 32 1, 3,10 1, 5,16 1, 5,19 1, 9,29 1,11, 6 1,11,16 1,19, 3 1,21,20 1,27,27 2, 5,15 2, 5,21 2, 7, 7 2, 7, 9 2, 7,25 2, 9,15 2,15,17 2,15,25 2,21, 9 3, 1,14 3, 3,26 3, 3,28 3, 3,29 3, 5,20 3, 5,22 3, 5,25 3, 7,29 3,13, 7 3,23,25 3,25,24 3,27,11 4, 3,17 4, 3,27 4, 5,15 5, 3,21 5, 7,22 5, 9,7 5, 9,28 5, 9,31 5,13, 6 5,15,17 5,17,13 5,21,12 5,27, 8 5,27,21 5,27,25 5,27,28 6, 1,11 6, 3,17 6,17, 9 6,21, 7 6,21,13 7, 1, 9 7, 1,18 7, 1,25 7,13,25 7,17,21 7,25,12 7,25,20 8, 7,23 8,9,23 9, 5,1 9, 5,25 9,11,19 9,21,16 10, 9,21 10, 9,25 11, 7,12 11, 7,16 11,17,13 11,21,13 12, 9,23 13, 3,17 13, 3,27 13, 5,19 13,17,15 14, 1,15 14,13,15 15, 1,29 17,15,20 17,15,23 17,15,26 G. Marsaglia Xorshift RNGs w: Journal of Statistical Software 8(14)
Atak na Xorshift Trywialny!
KISS: Keep it simple, stupid! X n+1 = (69069X n + 12345) mod 2 32 Y n+1 =Y n (I + L 13 )(I + R 17 )(I + L 5 ) 698769069Zn + C n C n+1 = 2 32 Z n+1 = (698769069Z n + C n ) mod 2 32 (X n+1 + Y n+1 + Z n+1 ) mod 2 32
KISS: Keep it simple, stupid! X n+1 = (69069X n + 12345) mod 2 32 Y n+1 =Y n (I + L 13 )(I + R 17 )(I + L 5 ) 698769069Zn + C n C n+1 = 2 32 Z n+1 = (698769069Z n + C n ) mod 2 32 (X n+1 + Y n+1 + Z n+1 ) mod 2 32 Hipoteza (G. Marsaglia) Okres generatora KISS jest dłuższy niż 2 124
KISS: Keep it simple, stupid! X n+1 = (69069X n + 12345) mod 2 32 Y n+1 =Y n (I + L 13 )(I + R 17 )(I + L 5 ) 698769069Zn + C n C n+1 = 2 32 Z n+1 = (698769069Z n + C n ) mod 2 32 (X n+1 + Y n+1 + Z n+1 ) mod 2 32 Hipoteza (G. Marsaglia) Okres generatora KISS jest dłuższy niż 2 124 Twierdzenie Generator KISS ma rozkład równomierny.
Implementacja KISS // seed uint32 t x =123456789, y =362436000; uint32 t z =521288629, c =7654321; uint32 t KISS ( ) { x =69069 x +13245; yˆ=y <<13; yˆ=y >>17; yˆ=y <<5; uint64 t t =698769069; t=t z+c ; c=t >>32; } return x+y+z ;
Mersenne twister Oznaczenia r { }} { 1 0... 0 0 1... 0 I r =............ 0 0... 1 b k 0... 0 0 b D b = k 1... 0.................. 0 0... b 0
Mersenne twister Oznaczenia r { }} { 1 0... 0 0 1... 0 I r =............ 0 0... 1 b k 0... 0 0 b D b = k 1... 0.................. 0 0... b 0 Postać ogólna [ ] [ ] 0 0 Iw r 0 X k+n =X k+m + X k+1 A + X 0 I k A r 0 0 Y k+n =X k+n T T =R u (L s D b )(L t D c )R l A, b, c, u, s, t, l, r, m to zdefiniowane stałe, w to liczba bitów
Mersenne twister Oznaczenia r { }} { 1 0... 0 0 1... 0 I r =............ 0 0... 1 b k 0... 0 0 b D b = k 1... 0.................. 0 0... b 0 Postać ogólna [ ] [ ] 0 0 Iw r 0 X k+n =X k+m + X k+1 A + X 0 I k A r 0 0 Y k+n =X k+n T T =R u (L s D b )(L t D c )R l A, b, c, u, s, t, l, r, m to zdefiniowane stałe, w to liczba bitów
MT19937 Wyjątkowo długi okres 2 19937 1 dla 32 bitowej wersji
MT19937 Wyjątkowo długi okres 2 19937 1 dla 32 bitowej wersji Bardzo popularny, domyślny dla Pythona i PHP
MT19937 Wyjątkowo długi okres 2 19937 1 dla 32 bitowej wersji Bardzo popularny, domyślny dla Pythona i PHP Podobny do Xorshift
MT19937 Wyjątkowo długi okres 2 19937 1 dla 32 bitowej wersji Bardzo popularny, domyślny dla Pythona i PHP Podobny do Xorshift Odwracalny
MT19937 Wyjątkowo długi okres 2 19937 1 dla 32 bitowej wersji Bardzo popularny, domyślny dla Pythona i PHP Podobny do Xorshift Odwracalny Wyjściem jest cały stan
MT19937 Wyjątkowo długi okres 2 19937 1 dla 32 bitowej wersji Bardzo popularny, domyślny dla Pythona i PHP Podobny do Xorshift Odwracalny Wyjściem jest cały stan Używa jednocześnie 624 liczb
MT19937 Wyjątkowo długi okres 2 19937 1 dla 32 bitowej wersji Bardzo popularny, domyślny dla Pythona i PHP Podobny do Xorshift Odwracalny Wyjściem jest cały stan Używa jednocześnie 624 liczb Implementacje często generują seed z jednej liczby
Zajrzyjmy do kodu! https://en.wikipedia.org/w/index.php?title=mersenne_ Twister&oldid=708041651#Python_implementation https://hg.python.org/cpython/file/tip/modules/ _randommodule.c, funkcja genrand int32
Atak na MT y4 = y3 ^ y3 >> 18
Atak na MT y4 = y3 ^ y3 >> 18 y3 y 31 y 30... y 14 y 13 y 12... y 1 y 0
Atak na MT y4 = y3 ^ y3 >> 18 y3 y 31 y 30... y 14 y 13 y 12... y 1 y 0 y3>>18 0 0... 0 y 31 y 30... y 19 y 18
Atak na MT y4 = y3 ^ y3 >> 18 y3 y 31 y 30... y 14 y 13 y 12... y 1 y 0 y3>>18 0 0... 0 y 31 y 30... y 19 y 18 y4=y3^(y3>>18) y 31 y 30... y 14 y 31 y 13 y 30 y 12... y 19 y 1 y 18 y 0
Atak na MT y4 = y3 ^ y3 >> 18 y3 y 31 y 30... y 14 y 13 y 12... y 1 y 0 y3>>18 0 0... 0 y 31 y 30... y 19 y 18 y4=y3^(y3>>18) y 31 y 30... y 14 y 31 y 13 y 30 y 12... y 19 y 1 y 18 y 0 y4>>18 0 0... 0 y 31 y 30... y 19 y 18
Atak na MT y... y y y4 = y3 ^ y3 >> 18 y3 y 31 y 30... y 14 y 13 y 12... y 1 y 0 y3>>18 0 0... 0 y 31 y 30... y 19 y 18 y4=y3^(y3>>18) y 31 y 30... y 14 y 31 y 13 y 30 y 12... y 19 y 1 y 18 y 0 y4>>18 0 0... 0 y 31 y 30... y 19 y 18 y4^(y4>>18) y 31 y 30... y 14 y 31 y 31 y 13 30 y 30 y 12 19 y 19 y 1 18 y 18 y 0
Atak na MT y... y y y4 = y3 ^ y3 >> 18 y3 y 31 y 30... y 14 y 13 y 12... y 1 y 0 y3>>18 0 0... 0 y 31 y 30... y 19 y 18 y4=y3^(y3>>18) y 31 y 30... y 14 y 31 y 13 y 30 y 12... y 19 y 1 y 18 y 0 y4>>18 0 0... 0 y 31 y 30... y 19 y 18 y4^(y4>>18) y 31 y 30... y 14 y 31 y 31 y 13 30 y 30 y 12 19 y 19 y 1 18 y 18 y 0 y3=y4^(y4>>18) y 31 y 30... y 14 y 13 y 12... y 1 y 0
Atak na MT y3 = y2 ^ ((y2 << 15) & 4022730752) c = 4022730752 = 11101111 11000110 00000000 00000000 y2 y 31 y 30... y 16 y 15 y 14... y 1 y 0 y2<<15 y 16 y 15... y 1 y 0 0... 0 0
Atak na MT y3 = y2 ^ ((y2 << 15) & 4022730752) c = 4022730752 = 11101111 11000110 00000000 00000000 y2 y 31 y 30... y 16 y 15 y 14... y 1 y 0 y2<<15 y 16 y 15... y 1 y 0 0... 0 0 c 1 1... 0 0 0 0 0 0
Atak na MT y3 = y2 ^ ((y2 << 15) & 4022730752) c = 4022730752 = 11101111 11000110 00000000 00000000 y2 y 31 y 30... y 16 y 15 y 14... y 1 y 0 y2<<15 y 16 y 15... y 1 y 0 0... 0 0 c 1 1... 0 0 0 0 0 0 (y2<<15)&c y 16 y 15... y 1 0 0 0 0 0
Atak na MT y3 = y2 ^ ((y2 << 15) & 4022730752) c = 4022730752 = 11101111 11000110 00000000 00000000 y2 y 31 y 30... y 16 y 15 y 14... y 1 y 0 y2<<15 y 16 y 15... y 1 y 0 0... 0 0 c 1 1... 0 0 0 0 0 0 (y2<<15)&c y 16 y 15... y 1 0 0 0 0 0 y3 y 31 y 16 y 30 y 15... y 16 y 15 y 14... y 1 y 0
Atak na MT y3 = y2 ^ ((y2 << 15) & 4022730752) c = 4022730752 = 11101111 11000110 00000000 00000000 y2 y 31 y 30... y 16 y 15 y 14... y 1 y 0 y2<<15 y 16 y 15... y 1 y 0 0... 0 0 c 1 1... 0 0 0 0 0 0 (y2<<15)&c y 16 y 15... y 1 0 0 0 0 0 y3 y 31 y 16 y 30 y 15... y 16 y 15 y 14... y 1 y 0 y3<<15 y 16 y 15... y 1 y 0 0 0 0 0
Atak na MT y3 = y2 ^ ((y2 << 15) & 4022730752) c = 4022730752 = 11101111 11000110 00000000 00000000 y2 y 31 y 30... y 16 y 15 y 14... y 1 y 0 y2<<15 y 16 y 15... y 1 y 0 0... 0 0 c 1 1... 0 0 0 0 0 0 (y2<<15)&c y 16 y 15... y 1 0 0 0 0 0 y3 y 31 y 16 y 30 y 15... y 16 y 15 y 14... y 1 y 0 y3<<15 y 16 y 15... y 1 y 0 0 0 0 0 (y3<<15)&c y 16 y 15... y 1 0 0 0 0 0
Atak na MT y3 = y2 ^ ((y2 << 15) & 4022730752) c = 4022730752 = 11101111 11000110 00000000 00000000 y2 y 31 y 30... y 16 y 15 y 14... y 1 y 0 y2<<15 y 16 y 15... y 1 y 0 0... 0 0 c 1 1... 0 0 0 0 0 0 (y2<<15)&c y 16 y 15... y 1 0 0 0 0 0 y3 y 31 y 16 y 30 y 15... y 16 y 15 y 14... y 1 y 0 y3<<15 y 16 y 15... y 1 y 0 0 0 0 0 (y3<<15)&c y 16 y 15... y 1 0 0 0 0 0 y3^(y3<<15)&c y 31 y 30... y 16 y 15 y 14... y 1 y 0
Atak na MT y2 = y1 ^ ((y1 << 7) & 2636928640) b = 2636928640 = 10011101 00101100 01010110 10000000 y1 y 31 y 30... y 13... y 8 y 7 y 6... y 1 y 0
Atak na MT y2 = y1 ^ ((y1 << 7) & 2636928640) b = 2636928640 = 10011101 00101100 01010110 10000000 y1 y 31 y 30... y 13... y 8 y 7 y 6... y 1 y 0 y1<<7 y 24 y 23... y 6... y 1 y 0 0 0 0 0
Atak na MT y2 = y1 ^ ((y1 << 7) & 2636928640) b = 2636928640 = 10011101 00101100 01010110 10000000 y1 y 31 y 30... y 13... y 8 y 7 y 6... y 1 y 0 y1<<7 y 24 y 23... y 6... y 1 y 0 0 0 0 0 b 1 0... 0... 0 1 0 0 0 0
Atak na MT y2 = y1 ^ ((y1 << 7) & 2636928640) b = 2636928640 = 10011101 00101100 01010110 10000000 y1 y 31 y 30... y 13... y 8 y 7 y 6... y 1 y 0 y1<<7 y 24 y 23... y 6... y 1 y 0 0 0 0 0 b 1 0... 0... 0 1 0 0 0 0 (y1<<7)&b y 24 0... 0... 0 y 0 0 0 0 0
Atak na MT y2 = y1 ^ ((y1 << 7) & 2636928640) b = 2636928640 = 10011101 00101100 01010110 10000000 y1 y 31 y 30... y 13... y 8 y 7 y 6... y 1 y 0 y1<<7 y 24 y 23... y 6... y 1 y 0 0 0 0 0 b 1 0... 0... 0 1 0 0 0 0 (y1<<7)&b y 24 0... 0... 0 y 0 0 0 0 0 y2 y 31 y 24 y 30... y 13... y 8 y 7 y 0 y 6... y 1 y 0
Atak na MT y2 = y1 ^ ((y1 << 7) & 2636928640) b = 2636928640 = 10011101 00101100 01010110 10000000 y1 y 31 y 30... y 13... y 8 y 7 y 6... y 1 y 0 y1<<7 y 24 y 23... y 6... y 1 y 0 0 0 0 0 b 1 0... 0... 0 1 0 0 0 0 (y1<<7)&b y 24 0... 0... 0 y 0 0 0 0 0 y2 y 31 y 24 y 30... y 13... y 8 y 7 y 0 y 6... y 1 y 0 z=y2&0x7f 0 0 0 0 0 0 0 y 6... y 1 y 0
Atak na MT y2 = y1 ^ ((y1 << 7) & 2636928640) b = 2636928640 = 10011101 00101100 01010110 10000000 y1 y 31 y 30... y 13... y 8 y 7 y 6... y 1 y 0 y1<<7 y 24 y 23... y 6... y 1 y 0 0 0 0 0 b 1 0... 0... 0 1 0 0 0 0 (y1<<7)&b y 24 0... 0... 0 y 0 0 0 0 0 y2 y 31 y 24 y 30... y 13... y 8 y 7 y 0 y 6... y 1 y 0 z=y2&0x7f 0 0 0 0 0 0 0 y 6... y 1 y 0 z<<7 0 0 0 y 6... y 1 y 0 0 0 0 0
Atak na MT y2 = y1 ^ ((y1 << 7) & 2636928640) b = 2636928640 = 10011101 00101100 01010110 10000000 y1 y 31 y 30... y 13... y 8 y 7 y 6... y 1 y 0 y1<<7 y 24 y 23... y 6... y 1 y 0 0 0 0 0 b 1 0... 0... 0 1 0 0 0 0 (y1<<7)&b y 24 0... 0... 0 y 0 0 0 0 0 y2 y 31 y 24 y 30... y 13... y 8 y 7 y 0 y 6... y 1 y 0 z=y2&0x7f 0 0 0 0 0 0 0 y 6... y 1 y 0 z<<7 0 0 0 y 6... y 1 y 0 0 0 0 0 w=(y2^((z<<7)&b)) ^(0x7F<<7) 0 0 0 y 13... y 8 y 7 0 0 0 0
Atak na MT y2 = y1 ^ ((y1 << 7) & 2636928640) b = 2636928640 = 10011101 00101100 01010110 10000000 y1 y 31 y 30... y 13... y 8 y 7 y 6... y 1 y 0 y1<<7 y 24 y 23... y 6... y 1 y 0 0 0 0 0 b 1 0... 0... 0 1 0 0 0 0 (y1<<7)&b y 24 0... 0... 0 y 0 0 0 0 0 y2 y 31 y 24 y 30... y 13... y 8 y 7 y 0 y 6... y 1 y 0 z=y2&0x7f 0 0 0 0 0 0 0 y 6... y 1 y 0 z<<7 0 0 0 y 6... y 1 y 0 0 0 0 0 w=(y2^((z<<7)&b)) ^(0x7F<<7) 0 0 0 y 13... y 8 y 7 0 0 0 0 v=(y2^((w<<7)&b)) odzyskujemy y 20 do y 14 ^(0x7F<<14)
Atak na MT y2 = y1 ^ ((y1 << 7) & 2636928640) b = 2636928640 = 10011101 00101100 01010110 10000000 y1 y 31 y 30... y 13... y 8 y 7 y 6... y 1 y 0 y1<<7 y 24 y 23... y 6... y 1 y 0 0 0 0 0 b 1 0... 0... 0 1 0 0 0 0 (y1<<7)&b y 24 0... 0... 0 y 0 0 0 0 0 y2 y 31 y 24 y 30... y 13... y 8 y 7 y 0 y 6... y 1 y 0 z=y2&0x7f 0 0 0 0 0 0 0 y 6... y 1 y 0 z<<7 0 0 0 y 6... y 1 y 0 0 0 0 0 w=(y2^((z<<7)&b)) ^(0x7F<<7) 0 0 0 y 13... y 8 y 7 0 0 0 0 v=(y2^((w<<7)&b)) odzyskujemy y 20 do y 14 ^(0x7F<<14) u=y2^((v<<7)&b) odzyskujemy y 27 do y 21 ^(0x7F<<21)
Atak na MT y2 = y1 ^ ((y1 << 7) & 2636928640) b = 2636928640 = 10011101 00101100 01010110 10000000 y1 y 31 y 30... y 13... y 8 y 7 y 6... y 1 y 0 y1<<7 y 24 y 23... y 6... y 1 y 0 0 0 0 0 b 1 0... 0... 0 1 0 0 0 0 (y1<<7)&b y 24 0... 0... 0 y 0 0 0 0 0 y2 y 31 y 24 y 30... y 13... y 8 y 7 y 0 y 6... y 1 y 0 z=y2&0x7f 0 0 0 0 0 0 0 y 6... y 1 y 0 z<<7 0 0 0 y 6... y 1 y 0 0 0 0 0 w=(y2^((z<<7)&b)) ^(0x7F<<7) 0 0 0 y 13... y 8 y 7 0 0 0 0 v=(y2^((w<<7)&b)) odzyskujemy y 20 do y 14 ^(0x7F<<14) u=y2^((v<<7)&b) odzyskujemy y 27 do y 21 ^(0x7F<<21) t=y2^((u<<7)&b) odzyskujemy y 31 do y 28 ^(0x7F<<28)
Atak na MT y2 = y1 ^ ((y1 << 7) & 2636928640) b = 2636928640 = 10011101 00101100 01010110 10000000 y1 y 31 y 30... y 13... y 8 y 7 y 6... y 1 y 0 y1<<7 y 24 y 23... y 6... y 1 y 0 0 0 0 0 b 1 0... 0... 0 1 0 0 0 0 (y1<<7)&b y 24 0... 0... 0 y 0 0 0 0 0 y2 y 31 y 24 y 30... y 13... y 8 y 7 y 0 y 6... y 1 y 0 z=y2&0x7f 0 0 0 0 0 0 0 y 6... y 1 y 0 z<<7 0 0 0 y 6... y 1 y 0 0 0 0 0 w=(y2^((z<<7)&b)) ^(0x7F<<7) 0 0 0 y 13... y 8 y 7 0 0 0 0 v=(y2^((w<<7)&b)) odzyskujemy y 20 do y 14 ^(0x7F<<14) u=y2^((v<<7)&b) odzyskujemy y 27 do y 21 ^(0x7F<<21) t=y2^((u<<7)&b) odzyskujemy y 31 do y 28 ^(0x7F<<28) y1=t u v w z y 31 y 30... y 13... y 8 y 7 y 6... y 1 y 0
Atak na MT y1 = y ^ (y>>11) m = 0xFFE00000 y y 31 y 30... y 21 y 20... y 10 y 9... y 1 y 0
Atak na MT y1 = y ^ (y>>11) m = 0xFFE00000 y y 31 y 30... y 21 y 20... y 10 y 9... y 1 y 0 y>>11 0 0... 0 y 31... y 21 y 20... y 12 y 11
Atak na MT y1 = y ^ (y>>11) m = 0xFFE00000 y y 31 y 30... y 21 y 20... y 10 y 9... y 1 y 0 y>>11 0 0... 0 y 31... y 21 y 20... y 12 y 11 y1 y 31 y 30... y 21 y 20 y 31... y 10 y 21 y 9 y 20... y 1 y 12 y 0 y 11
Atak na MT y1 = y ^ (y>>11) m = 0xFFE00000 y y 31 y 30... y 21 y 20... y 10 y 9... y 1 y 0 y>>11 0 0... 0 y 31... y 21 y 20... y 12 y 11 y1 y 31 y 30... y 21 y 20 y 31... y 10 y 21 y 9 y 20... y 1 y 12 y 0 y 11 x=y1&(0x7ff<<21) y 31 y 30... y 21 0 0 0 0 0 0 0
Atak na MT y1 = y ^ (y>>11) m = 0xFFE00000 y y 31 y 30... y 21 y 20... y 10 y 9... y 1 y 0 y>>11 0 0... 0 y 31... y 21 y 20... y 12 y 11 y1 y 31 y 30... y 21 y 20 y 31... y 10 y 21 y 9 y 20... y 1 y 12 y 0 y 11 x=y1&(0x7ff<<21) y 31 y 30... y 21 0 0 0 0 0 0 0 x>>11 0 0 0 0 y 31... y 21 0 0 0 0
Atak na MT y1 = y ^ (y>>11) m = 0xFFE00000 y y 31 y 30... y 21 y 20... y 10 y 9... y 1 y 0 y>>11 0 0... 0 y 31... y 21 y 20... y 12 y 11... y y... y y y1 y 31 y 30... y 21 y 20 y 31 10 y 21 9 y 20 1 y 12 0 y 11 x=y1&(0x7ff<<21) y 31 y 30... y 21 0 0 0 0 0 0 0 x>>11 0 0 0 0 y 31... y 21 0 0 0 0 w=y1^(x>>11) y 31 y 30... y 21 y 20... y 10 y 9 y 20... y 1 y 12 y 0 y 11
Atak na MT y1 = y ^ (y>>11) m = 0xFFE00000 y y 31 y 30... y 21 y 20... y 10 y 9... y 1 y 0 y>>11 0 0... 0 y 31... y 21 y 20... y 12 y 11 y1 y 31 y 30... y 21 y 20 y 31... y 10 y 21 y 9 y 20... y 1 y 12 y 0 y 11 x=y1&(0x7ff<<21) y 31 y 30... y 21 0 0 0 0 0 0 0 x>>11 0 0 0 0 y 31... y 21 0 0 0 0 w=y1^(x>>11) y 31 y 30... y 21 y 20... y 10 y 9 y 20 1 y 12 0 y 11 v=(w>>11)&0x3ff 0 0 0 0 0 0 0 y 20... y 12 y 11
Atak na MT y1 = y ^ (y>>11) m = 0xFFE00000 y y 31 y 30... y 21 y 20... y 10 y 9... y 1 y 0 y>>11 0 0... 0 y 31... y 21 y 20... y 12 y 11 y1 y 31 y 30... y 21 y 20 y 31... y 10 y 21 y 9 y 20... y 1 y 12 y 0 y 11 x=y1&(0x7ff<<21) y 31 y 30... y 21 0 0 0 0 0 0 0 x>>11 0 0 0 0 y 31... y 21 0 0 0 0 w=y1^(x>>11) y 31 y 30... y 21 y 20... y 10 y 9 y 20 1 y 12 0 y 11 v=(w>>11)&0x3ff 0 0 0 0 0 0 0 y 20... y 12 y 11 y=w^v y 31 y 30... y 21 y 20... y 10 y 9... y 1 y 0
Atak na MT y1 = y ^ (y>>11) m = 0xFFE00000 y y 31 y 30... y 21 y 20... y 10 y 9... y 1 y 0 y>>11 0 0... 0 y 31... y 21 y 20... y 12 y 11 y1 y 31 y 30... y 21 y 20 y 31... y 10 y 21 y 9 y 20... y 1 y 12 y 0 y 11 x=y1&(0x7ff<<21) y 31 y 30... y 21 0 0 0 0 0 0 0 x>>11 0 0 0 0 y 31... y 21 0 0 0 0 w=y1^(x>>11) y 31 y 30... y 21 y 20... y 10 y 9 y 20 1 y 12 0 y 11 v=(w>>11)&0x3ff 0 0 0 0 0 0 0 y 20... y 12 y 11 y=w^v y 31 y 30... y 21 y 20... y 10 y 9... y 1 y 0
Atak na generator w Pythonie https://github.com/jpotoniec/mp/blob/master/15_prng/mt_attack.py
Fortuna Stan C 128 bitowy licznik, monotoniczny K 256 bitowy klucz, ciąg pseudolosowy
Fortuna Stan C 128 bitowy licznik, monotoniczny K 256 bitowy klucz, ciąg pseudolosowy 1 Function Generate(n) assert: 0 n 2 20 2 result [] 3 for k 1 to n 16 do 4 result result AES(K, C) 5 C C + 1 6 end 7 K AES(K, C) AES(K, C + 1) 8 C C + 2 9 return result 0 end
Reseedowanie Fortuny Dane RC 32-bitowy licznik, początkowo 0 P 0,..., P 31 pule entropii 1 Function Reseed() 2 RC RC + 1 3 s [] 4 for i 0 to 31 do 5 if 2 i dzieli RC then 6 s s SHA 256 (P i ) 7 P i 8 end 9 end 0 K SHA 256 (K s) 1 end
Fortuna z automatycznym reseedowaniem 1 Function FullRandom(n) 2 if w P 0 spodziewamy się dostatecznie dużo entropii i od ostatniego reseedowania upłynęło co najmniej 100 ms then 3 Reseed() 4 C C + 1 5 end 6 if C > 0 then return Generate(n) 7 else return błąd 8 end
Źródła entropii czas pomiędzy naciśnięciami klawiszy na klawiaturze, ruchami myszy
Źródła entropii czas pomiędzy naciśnięciami klawiszy na klawiaturze, ruchami myszy czas pomiędzy przybyciem pakietów sieciowych
Źródła entropii czas pomiędzy naciśnięciami klawiszy na klawiaturze, ruchami myszy czas pomiędzy przybyciem pakietów sieciowych czas pomiędzy przerwaniami sprzętowymi
Źródła entropii czas pomiędzy naciśnięciami klawiszy na klawiaturze, ruchami myszy czas pomiędzy przybyciem pakietów sieciowych czas pomiędzy przerwaniami sprzętowymi precyzyjnie mierzony czas wykonania krótkiego, deterministycznego kodu (demon haveged)
Źródła entropii czas pomiędzy naciśnięciami klawiszy na klawiaturze, ruchami myszy czas pomiędzy przybyciem pakietów sieciowych czas pomiędzy przerwaniami sprzętowymi precyzyjnie mierzony czas wykonania krótkiego, deterministycznego kodu (demon haveged) generatory sprzętowe
Źródła entropii czas pomiędzy naciśnięciami klawiszy na klawiaturze, ruchami myszy czas pomiędzy przybyciem pakietów sieciowych czas pomiędzy przerwaniami sprzętowymi precyzyjnie mierzony czas wykonania krótkiego, deterministycznego kodu (demon haveged) generatory sprzętowe szumy termiczne
Źródła entropii czas pomiędzy naciśnięciami klawiszy na klawiaturze, ruchami myszy czas pomiędzy przybyciem pakietów sieciowych czas pomiędzy przerwaniami sprzętowymi precyzyjnie mierzony czas wykonania krótkiego, deterministycznego kodu (demon haveged) generatory sprzętowe szumy termiczne szum radiowy
Źródła entropii czas pomiędzy naciśnięciami klawiszy na klawiaturze, ruchami myszy czas pomiędzy przybyciem pakietów sieciowych czas pomiędzy przerwaniami sprzętowymi precyzyjnie mierzony czas wykonania krótkiego, deterministycznego kodu (demon haveged) generatory sprzętowe szumy termiczne szum radiowy rozpad promieniotwórczy
Źródła entropii czas pomiędzy naciśnięciami klawiszy na klawiaturze, ruchami myszy czas pomiędzy przybyciem pakietów sieciowych czas pomiędzy przerwaniami sprzętowymi precyzyjnie mierzony czas wykonania krótkiego, deterministycznego kodu (demon haveged) generatory sprzętowe szumy termiczne szum radiowy rozpad promieniotwórczy instrukcja rdseed (Intel)
Źródła entropii czas pomiędzy naciśnięciami klawiszy na klawiaturze, ruchami myszy czas pomiędzy przybyciem pakietów sieciowych czas pomiędzy przerwaniami sprzętowymi precyzyjnie mierzony czas wykonania krótkiego, deterministycznego kodu (demon haveged) generatory sprzętowe szumy termiczne szum radiowy rozpad promieniotwórczy instrukcja rdseed (Intel) Lotto
Źródła entropii czas pomiędzy naciśnięciami klawiszy na klawiaturze, ruchami myszy czas pomiędzy przybyciem pakietów sieciowych czas pomiędzy przerwaniami sprzętowymi precyzyjnie mierzony czas wykonania krótkiego, deterministycznego kodu (demon haveged) generatory sprzętowe szumy termiczne szum radiowy rozpad promieniotwórczy instrukcja rdseed (Intel) Lotto w wielu krajach, np. http://cryptoexperts.github.io/million-dollar-curve/
Źródła entropii czas pomiędzy naciśnięciami klawiszy na klawiaturze, ruchami myszy czas pomiędzy przybyciem pakietów sieciowych czas pomiędzy przerwaniami sprzętowymi precyzyjnie mierzony czas wykonania krótkiego, deterministycznego kodu (demon haveged) generatory sprzętowe szumy termiczne szum radiowy rozpad promieniotwórczy instrukcja rdseed (Intel) Lotto w wielu krajach, np. http://cryptoexperts.github.io/million-dollar-curve/ Ciekawostka rdrand = algorytm zbliżony do Fortuny
Prosty test losowości: Yahtzee?????
Prosty test losowości: Yahtzee?????
Model testu X i U(1, 6), niezależne
Model testu X i U(1, 6), niezależne { 1 X5i 4 = X 5i 3 = X 5i 2 = X 5i 1 = X 5i K i = 0 else
Model testu X i U(1, 6), niezależne { 1 X5i 4 = X 5i 3 = X 5i 2 = X 5i 1 = X 5i K i = 0 else K =K 1 + K 1 +... + K n?
Model testu X i U(1, 6), niezależne { 1 X5i 4 = X 5i 3 = X 5i 2 = X 5i 1 = X 5i K i = 0 else K =K 1 + K 1 +... + K n B (n, 6 ) 6 5
Model testu X i U(1, 6), niezależne { 1 X5i 4 = X 5i 3 = X 5i 2 = X 5i 1 = X 5i K i = 0 else K =K 1 + K 1 +... + K n B (n, 6 ) 6 5 B (n, 6 ) 6 5?
Model testu X i U(1, 6), niezależne { 1 X5i 4 = X 5i 3 = X 5i 2 = X 5i 1 = X 5i K i = 0 else K =K 1 + K 1 +... + K n B (n, 6 ) 6 5 B (n, 6 ) ( ) n λ 6 5 Poiss? 6 4
Model testu X i U(1, 6), niezależne { 1 X5i 4 = X 5i 3 = X 5i 2 = X 5i 1 = X 5i K i = 0 else K =K 1 + K 1 +... + K n B (n, 6 ) 6 5 B (n, 6 ) ( ) ( ) n λ n n 6 5 Poiss N 6 4 6 4, 6 4 ( ) n n K N 6 4, 6 4
Przeprowadzenie testu ( ) n n K N 6 4, 6 4 δ +δ n 6 4 ( n P 6 4 δ K n ) 6 4 + δ = 0,95 k δ =?
Wyniki eksperymentalne, n = 10 9 https://github.com/jpotoniec/mp/blob/master/15_prng/yahtzee.cpp δ = n 1,96 1722 64 generator odchylenie Dilbert 999228395
Wyniki eksperymentalne, n = 10 9 https://github.com/jpotoniec/mp/blob/master/15_prng/yahtzee.cpp δ = n 1,96 1722 64 generator odchylenie Dilbert 999228395 LCG(1229,1,2048) 771605
Wyniki eksperymentalne, n = 10 9 https://github.com/jpotoniec/mp/blob/master/15_prng/yahtzee.cpp δ = n 1,96 1722 64 generator odchylenie Dilbert 999228395 LCG(1229,1,2048) 771605 rand() modulo 938
Wyniki eksperymentalne, n = 10 9 https://github.com/jpotoniec/mp/blob/master/15_prng/yahtzee.cpp δ = n 1,96 1722 64 generator odchylenie Dilbert 999228395 LCG(1229,1,2048) 771605 rand() modulo 938 rand() z odrzucaniem 2383
Wyniki eksperymentalne, n = 10 9 https://github.com/jpotoniec/mp/blob/master/15_prng/yahtzee.cpp δ = n 1,96 1722 64 generator odchylenie Dilbert 999228395 LCG(1229,1,2048) 771605 rand() modulo 938 rand() z odrzucaniem 2383 MT19937 22
Wyniki eksperymentalne, n = 10 9 https://github.com/jpotoniec/mp/blob/master/15_prng/yahtzee.cpp δ = n 1,96 1722 64 generator odchylenie Dilbert 999228395 LCG(1229,1,2048) 771605 rand() modulo 938 rand() z odrzucaniem 2383 MT19937 22 Xorshift(2,7,9) 327
Wyniki eksperymentalne, n = 10 9 https://github.com/jpotoniec/mp/blob/master/15_prng/yahtzee.cpp δ = n 1,96 1722 64 generator odchylenie Dilbert 999228395 LCG(1229,1,2048) 771605 rand() modulo 938 rand() z odrzucaniem 2383 MT19937 22 Xorshift(2,7,9) 327 Xorshift(2,7, ) 771605
Wyniki eksperymentalne, n = 10 9 https://github.com/jpotoniec/mp/blob/master/15_prng/yahtzee.cpp δ = n 1,96 1722 64 generator odchylenie Dilbert 999228395 LCG(1229,1,2048) 771605 rand() modulo 938 rand() z odrzucaniem 2383 MT19937 22 Xorshift(2,7,9) 327 Xorshift(2,7, ) 771605 Uwaga To jest nadmierne uproszczenie!
Zestawy testów Szklana Pułapka http://stat.fsu.edu/pub/diehard/ Szklana Pułapka 2 https://www.phy.duke.edu/~rgb/general/dieharder.php TestU01 http://simul.iro.umontreal.ca/testu01/tu01.html
Dobre praktyki Stosuj dobre generatory
Dobre praktyki Stosuj dobre generatory W zastosowaniach mission-critical, stosuj generatory kryptograficznie bezpieczne
Dobre praktyki Stosuj dobre generatory W zastosowaniach mission-critical, stosuj generatory kryptograficznie bezpieczne Rozgrzewaj generator
Dobre praktyki Stosuj dobre generatory W zastosowaniach mission-critical, stosuj generatory kryptograficznie bezpieczne Rozgrzewaj generator Wykorzystuj tylko mały fragment okresu generatora
Dobre praktyki Stosuj dobre generatory W zastosowaniach mission-critical, stosuj generatory kryptograficznie bezpieczne Rozgrzewaj generator Wykorzystuj tylko mały fragment okresu generatora Zapewnij dostatecznie dużą przestrzeń seedów Rzeczywisty problem z Florydy Ile jest możliwych wyborów 80 ławników z listy 200 kandydatów? Czy ta liczba mieści się w 32-bitach? A 64-bitach?
Dobre praktyki Stosuj dobre generatory W zastosowaniach mission-critical, stosuj generatory kryptograficznie bezpieczne Rozgrzewaj generator Wykorzystuj tylko mały fragment okresu generatora Zapewnij dostatecznie dużą przestrzeń seedów Dbaj o dobry wybór seeda Symulacja na klastrze Zlecamy 100 symulacji opartych na RNG do wykonania na klastrze, identyczne zadania. Co się stanie jeżeli użyjemy time() jako seed?
Dobre praktyki Stosuj dobre generatory W zastosowaniach mission-critical, stosuj generatory kryptograficznie bezpieczne Rozgrzewaj generator Wykorzystuj tylko mały fragment okresu generatora Zapewnij dostatecznie dużą przestrzeń seedów Dbaj o dobry wybór seeda W razie wątpliwości zajrzyj do E. Barker, J. Kelsey Recommendation for Random Number Generation Using Deterministic Random Bit Generators (NIST Special Publication 800-90A)
Bibliografia 1 The Art of Computer Programming (Vol. 2) D. Knuth, rozdział III 2 Non-Uniform Random Variate Generation L. Devroye http://www.nrbook.com/devroye/ 3 N. Ferguson, B. Schneier, T. Kohno Cryptography engineering John Wiley & Sons, 2010