Wprowadzenie Generowanie liczb o zadanym rozkładzie Generowanie liczb o zadanym rozkładzie wejście X U(0, 1) wyjście Y z zadanego rozkładu F (y) = 1 e λy y = ln(1 F (y) λ = ln(1 0,1563 0, 5 0,34 Wprowadzenie Analiza algorytmu Analiza algorytmu wejście Xi U(0, 2 n 1) Xi niezależne wyjście (Y1, Y2,..., Yl) Yj U(0, k 1) 2 n 1 < k 2 n 1 Ile potrzebujemy liczb na wejściu, żeby wygenerować l liczb na wyjściu? Żeby wygenerować jedną liczbę potrzebujemy N liczb z wejścia, gdzie N ma rozkład geometryczny (pobieramy X y do pierwszego sukcesu) z p = k 2 n. Żeby wygenerować l takich liczb, musimy zsumować l zmiennych o takim rozkładzie: W = N 1 + N 2 +... + N l. Te zmienne są niezależne, ponieważ X y są niezależne. EN i = p 1 = 2n k, D 2 N i = 1 p 2 p 1 = 2n (2 n k) k 2 Z niezależności EN = l 2n k i D 2 N = l 2n (2 n k) k 2. Nierówność Czebyszewa: P(N EN ε) P(lstlisting N EN ε) D2 N Niech ε = lϱ i k = 2 n 1 (najgorszy możliwy przypadek): ε 2 P(N EN ε) = P(N l( 2n k n l2 2 n 1 + ϱ)) = P(N l(2 + ϱ)) 2 2(n 1) l 2 ϱ 2 = 2 lϱ 2 Niech ϱ = 8 i wtedy P(N 10l) 1 32l
Multiply-with-carry 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 axn + Cn U(1, ab 2). k jest rzędem b w grupie Z m. (C n, X n ) ma pełen okres wtw k = ab 2. Niestety, nie wynikają z tego żadne porządne własności X n. Przykładowo, dla a = 12, b = 29 rząd jest 173 Multiply-with-carry 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 axn + Cn U(1, ab 2). Jaki rozkład ma zmienna Xn, jeżeli parametry zapewniają pełen okres? Skoro ax n + C n U(1, ab 2), to X n+1 = (ax n + C n ) mod b nie może mieć rozkładu jednostajnego, ponieważ zbiór możliwych wartości dla ax n + C n, tzn. {1, 2,..., ab 1}, ma ab 2 elementy, a więc liczbę niepodzielną bez reszty przez b. W zbiorze brakuje elementu o reszcie 0 (elementu 0) i elementu o reszcie b 1, tzn. ab 1. Inaczej: każda możliwa reszta występuje w zbiorze a krotnie, natomiast 0 i b 1 występują w nim a 1 krotnie. Dla dużego a z praktycznego punktu widzenia rozbieżność jest pomijalnie mała. Empiryczna obserwacja na bazie parametrów (6, 10), (6, 78) i (10, 162): rozkład jest delikatnie nierównomierny, wartości od 1 do b 2 pojawiają się z prawdopodobieństwem a ab 2, natomiast 0 i b 1 z prawdopodobieństwem a 1 ab 2.
yˆ=y<<17; m to liczba bitów na jakiej operujemy Atak na Atak na Trywialny! Wystarczy sprawdzić wszystkie możliwości dla zadanej pary x 1, x 2. Jest ich dostatecznie mało.
Xn+1 = (69069Xn + 12345) mod 2 32 Yn+1 =Yn(I + L 13 )(I + R 17 )(I + L 5 ) 698769069Zn + Cn Cn+1 = 2 32 Zn+1 = (698769069Zn + Cn) mod 2 32 (Xn+1 + Yn+1 + Zn+1) mod 2 32 Hipoteza (G. Marsaglia) Okres generatora KISS jest dłuższy niż 2 124 Wydaje mi się, że rozumowanie jest następujące: jeżeli generatory są niezależne, to możemy pomnożyć ich okresy. LCG i mają po 2 32, MWC ma (w wariancie optymistycznym, nie sprawdzałem czy tak jest w rzeczywistości) 698769069 2 32 1 2 2 260, zatem cały generator ma okres 2 32 2 32 2 60 = 2 124. 1 2 bierze się z problemów z b = 232. Xn+1 = (69069Xn + 12345) mod 2 32 Yn+1 =Yn(I + L 13 )(I + R 17 )(I + L 5 ) 698769069Zn + Cn Cn+1 = 2 32 Zn+1 = (698769069Zn + Cn) mod 2 32 (Xn+1 + Yn+1 + Zn+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. Dowód mojego autorstwa. Rozpatrzmy dwie niezależne zmienne losowe X, Y takie, że X, Y U(0, 2 32 1). Niech W = X + Y, rozpatrujemy dwa przypadki: 1. 0 k < 2 32 P(W = k) = k x=0 P(X = x)p(y = k x) = k x=0 1 2 64 = k + 1 2 64 2. 2 32 k < 2 6 4, niech k = 2 32 + l i wtedy 0 l < 2 32. Chcemy sumować w taki sposób, żeby 0 x < 2 32 i 0 k x < 2 32, rozwiązując nierówności otrzymujemy x {l + 1,..., 2 32 1} P(W = k) = 2 32 1 x=l+1 Następnie rozpatrzmy U = (X + Y ) mod 2 32. P(X = x)p(y = k x) = 232 1 (l + 1) + 1 2 6 4 = 1 (l + 1) 232 2 64 = 1 P(W = l) 232 P(U = k) = P(W = k) + P(W = k + 2 32 ) = P(W = k) + 1 1 P(W = k) = 232 2 32
Stan C 128 bitowy licznik, monotoniczny K 256 bitowy klucz, ciąg pseudolosowy Potrzebujemy regularnie wymieniać klucz, inaczej pojawią się statystycznie rozpoznawalne różnice, bo AES nie powtórzy bloku. Stąd ograniczenie do 2 20. 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 10 end Potrzebujemy regularnie wymieniać klucz, inaczej pojawią się statystycznie rozpoznawalne różnice, bo AES nie powtórzy bloku. Stąd ograniczenie do 2 20.
z automatycznym reseedowaniem z automatycznym reseedowaniem 1 Function FullRandom(n) 2 if w P0 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 100ms 2 32 13lat, więc tak łatwo nie wyczerpiemy zapasów Źródła entropii Źródła entropii czas pomiędzy naciśnięciami klawiszy na klawiaturze, ruchami myszy https://software.intel.com/en-us/articles/ intel-digital-random-number-generator-drng-software-implementation-g
Testowanie generatorów Przeprowadzenie testu Przeprowadzenie testu P δ K N ( n 6 4, n 6 4 ) +δ n 6 4 ( n 6 4 δ K n 6 4 + δ ) δ =? = 0,95 k P( n 6 4 δ K n + δ) = P( δ 64 σ K µ σ 2Φ( δ σ ) 1 = 0,95 Φ( δ σ ) = 0,975 n δ = σφ 1 (0,975) = 6 4 1,96 = 0,054 n δ σ ) = Φ( δ σ ) Φ( δ σ ) = 2Φ( δ σ ) 1 Dla n = 10 9, δ 1708, zatem spodziewamy się wyniku pomiędzy 76988, a 77333. Podsumowanie Dobre praktyki Dobre praktyki Stosuj dobre generatory log2(nchoosek(200,80))=190