Metody probabilistyczne

Podobne dokumenty
Generowanie liczb o zadanym rozkładzie. ln(1 F (y) λ

Sieci Mobilne i Bezprzewodowe laboratorium 2 Modelowanie zdarzeń dyskretnych

Podstawy symulacji komputerowej

Ataki na RSA. Andrzej Chmielowiec. Centrum Modelowania Matematycznego Sigma. Ataki na RSA p. 1

Algorytmy i język C++

Przegląd generatorów liczb pseudolosowych i analiza ich wybranych własności

Generowanie ciągów bitów losowych z wykorzystaniem sygnałów pochodzących z komputera

Planowanie eksperymentu 2 (k p) w 2 r blokach. Stanisław Jaworski, Wojciech Zieliński

Obliczenia inspirowane Naturą

Kryptografia. z elementami kryptografii kwantowej. Ryszard Tanaś Wykład 8

Dr inż. Robert Wójcik, p. 313, C-3, tel Katedra Informatyki Technicznej (K-9) Wydział Elektroniki (W-4) Politechnika Wrocławska

2 Kryptografia: algorytmy symetryczne

Indukcja. Materiały pomocnicze do wykładu. wykładowca: dr Magdalena Kacprzak

Algorytmy zrandomizowane

Metody Rozmyte i Algorytmy Ewolucyjne

3 Przygotował: mgr inż. Maciej Lasota

Matematyka dyskretna - wykład - część Podstawowe algorytmy kombinatoryczne

,,Matematyczna Ruletka Czyli jak sie robi liczby (pseudo)losowe.

Identyfikacja i modelowanie struktur i procesów biologicznych

Technologie Informacyjne

Komputerowa analiza danych doświadczalnych

Zastosowania arytmetyki modularnej. Zastosowania arytmetyki modularnej

Wybrane zagadnienia teorii liczb

Authenticated Encryption

Podstawy programowania w języku C i C++

Metody numeryczne. Wykład nr 12. Dr Piotr Fronczak

Chaotyczne generatory liczb pseudolosowych

wykład IV uzupełnienie notatek: dr Jerzy Białkowski Programowanie C/C++ Język C, a C++. wykład IV dr Jarosław Mederski Spis Język C++ - wstęp

Architektura systemów komputerowych Laboratorium 13 Symulator SMS32 Operacje na bitach

Komputerowa analiza danych doświadczalnych

Wstęp do Informatyki

Programowanie w C Wartości pseudolosowe i pomiar czasu

Wykład 14. Testowanie hipotez statystycznych - test zgodności chi-kwadrat. Generowanie liczb losowych.

Komputerowa Analiza Danych Doświadczalnych

Kryptografia. z elementami kryptografii kwantowej. Ryszard Tanaś Wykład 7

Wstęp do programowania

xx + x = 1, to y = Jeśli x = 0, to y = 0 Przykładowy układ Funkcja przykładowego układu Metody poszukiwania testów Porównanie tabel prawdy

urządzenia: awaria układów ochronnych, spowodowanie awarii oprogramowania

Zygmunt Kubiak Instytut Informatyki Politechnika Poznańska

Generatory liczb pseudolosowych. Tomasz Kubik

Wstęp do programowania

Generowanie ciągów pseudolosowych o zadanych rozkładach przykładowy raport

DIAGRAMY SYNTAKTYCZNE JĘZYKA TURBO PASCAL 6.0

Liczby pseudolosowe. #include <stdio.h> #include <stdlib.h> int main() { printf("%d\n", RAND_MAX); return 0; }

Kodowanie i kompresja Streszczenie Studia Licencjackie Wykład 14, Kryptografia: algorytmy asymetryczne (RSA)

Operatory. Operatory bitowe i uzupełnienie informacji o pozostałych operatorach. Programowanie Proceduralne 1

Modelowanie komputerowe

Krytyczność, przejścia fazowe i symulacje Monte Carlo. Katarzyna Sznajd-Weron Physics of Complex System

FUNKCJA REKURENCYJNA. function s(n:integer):integer; begin if (n>1) then s:=n*s(n-1); else s:=1; end;

Generatory Liczb Losowych

Kodowanie i kompresja Streszczenie Studia Licencjackie Wykład 15, Kryptografia: algorytmy asymetryczne (RSA)

wykład V uzupełnienie notatek: dr Jerzy Białkowski Programowanie C/C++ Język C++ klasy i obiekty wykład V dr Jarosław Mederski Spis Język C++ - klasy

Wstęp do programowania

Podstawy programowania. Wykład: 5. Instrukcje sterujące c.d. Stałe, Typy zmiennych c.d. dr Artur Bartoszewski -Podstawy programowania, sem 1 - WYKŁAD

Wnioskowanie statystyczne i weryfikacja hipotez statystycznych

1 Wykład 3 Generatory liczb losowych o dowolnych rozkładach.

Generowanie sygnałów na DSP

GENEROWANIE ROZDAŃ: TEORIA I PRAKTYKA MICHAŁ KLICHOWICZ KRAJOWA KURSOKONFERENCJA SĘDZIÓW IT PZBS, GRUDZIEŃ 2018

Zamiana porcji informacji w taki sposób, iż jest ona niemożliwa do odczytania dla osoby postronnej. Tak zmienione dane nazywamy zaszyfrowanymi.

Instytut Fizyki Politechniki Łódzkiej Laboratorium Metod Analizy Danych Doświadczalnych Ćwiczenie 3 Generator liczb losowych o rozkładzie Rayleigha.

ANALIZA WŁAŚCIWOŚCI STATYSTYCZNYCH SYGNAŁÓW PSEUDOLOSOWYCH GENERATORÓW ZBUDOWANYCH NA REJESTRACH PRZESUWNYCH

Pętle instrukcje powtórzeo

WHILE (wyrażenie) instrukcja;

Liczby losowe i pętla while w języku Python

Parametry systemów klucza publicznego

Języki i paradygmaty programowania

Wstęp do programowania

Instrukcje cykliczne (pętle) WHILE...END WHILE

Podstawowe algorytmy i ich implementacje w C. Wykład 9

Optymalizacja. Symulowane wyżarzanie

1. Symulacje komputerowe Idea symulacji Przykład. 2. Metody próbkowania Jackknife Bootstrap. 3. Łańcuchy Markova. 4. Próbkowanie Gibbsa

Elementy metod numerycznych - zajęcia 9

WYKŁAD 8. Funkcje i algorytmy rekurencyjne Proste przykłady. Programy: c3_1.c..., c3_6.c. Tomasz Zieliński

Algorytmy i struktury danych. Wykład 6 Tablice rozproszone cz. 2

Matematyka dyskretna

1 Wprowadzenie do algorytmiki

Zwiększanie losowości

Zadanie 1 Przygotuj algorytm programu - sortowanie przez wstawianie.

Programowanie w C++ Wykład 2. Katarzyna Grzelak. 5 marca K.Grzelak (Wykład 1) Programowanie w C++ 1 / 41

Prawdopodobieństwo i statystyka

Wykład 6. Wyszukiwanie wzorca w tekście

PAKIETY STATYSTYCZNE

Wstęp do programowania

WHILE (wyrażenie) instrukcja;

W 5_2 Typy języków programowania sterowników PLC (zdefiniowane w IEC-61131) - języki graficzne (LD, FBD); języki tekstowe (ST, IL).

Programowanie w C++ Wykład 2. Katarzyna Grzelak. 4 marca K.Grzelak (Wykład 1) Programowanie w C++ 1 / 44

Programowanie w Turbo Pascal

Podstawy programowania. Podstawy C# Przykłady algorytmów

LSB MSB dwu bajtową sumą kontrolną CRC. Ramka transmitowana jest jako pojedynczy blok danych.

Generatory takie mają niestety okres, po którym sekwencja liczb powtarza się.

Aplikacje WWW - laboratorium

Wstęp do programowania

Algorytmy i Struktury Danych, 2. ćwiczenia

Strategie ewolucyjne (ang. evolu4on strategies)

Równoległy algorytm wyznaczania bloków dla cyklicznego problemu przepływowego z przezbrojeniami

Instrukcje pętli przykłady. Odgadywanie hasła. 1) Program pyta o hasło i podaje adres, gdy hasło poprawne lub komunikat o błędnym haśle.

wytwarzających ciągi okresowe liczb naturalnych

Liczby losowe w informatyce Filip Piękniewski

Technologie cyfrowe semestr letni 2018/2019

Transkrypt:

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