Dlaczego nie łączymy generatorów liczb losowych?


60

Istnieje wiele aplikacji, w których używany jest pseudolosowy generator liczb losowych. Dlatego ludzie wdrażają taki, który ich zdaniem jest świetny, aby później stwierdzić, że jest wadliwy. Coś takiego stało się ostatnio z generatorem liczb losowych Javascript. RandU też dużo wcześniej. Istnieją również problemy z niewłaściwym początkowym zaszczepieniem czegoś takiego jak Twister.

Nie mogę znaleźć przykładów połączenia dwóch lub więcej rodzin generatorów ze zwykłym operatorem xor. Jeśli istnieje wystarczająca moc komputera, aby uruchamiać rzeczy takie jak java.SecureRandom lub implementacje Twister, dlaczego ludzie ich nie łączą? ISAAC xor XORShift xor RandU powinien być dość dobrym przykładem, w którym widać słabość jednego generatora łagodzonego przez inne. Powinno to również pomóc w rozkładzie liczb na wyższe wymiary, ponieważ wewnętrzne algorytmy są zupełnie inne. Czy istnieje jakaś fundamentalna zasada, że ​​nie należy ich łączyć?

Jeśli zbudowałbyś prawdziwy generator liczb losowych, ludzie prawdopodobnie doradziliby połączenie dwóch lub więcej źródeł entropii. Czy mój przykład jest inny?

Wykluczam wspólny przykład kilku rejestrów przesuwnych z liniowym sprzężeniem zwrotnym pracujących razem, ponieważ pochodzą one z tej samej rodziny.


Odpowiedź może zależeć od aplikacji. Do czego chcesz użyć sekwencji pseudolosowej?
Yuval Filmus

1
Czy znalazłeś Fortunę ( en.wikipedia.org/wiki/Fortuna_%28PRNG%29 ), to brzmi jak zbliżone do tego, co opisujesz, że agreguje różne losowe źródła w jedno.
Mały kod

1
@LittleCode Właściwie to brzmi zupełnie inaczej. Fortuna wyprowadza dane z jednej funkcji skrótu. Po prostu miesza się z wieloma słabymi mechanizmami zbierania entropii przed (ponownym) mieszaniem go przez funkcję pojedynczego wyjścia. Moje pytanie dotyczyło wyjścia z kilku funkcji (dlaczego nie 10 z nich)? Jeśli jest to urządzenie napełniające, prędkość i tak nie ma znaczenia.
Paul Uszak

1
Nieżyjący już George Marsaglia, znany badacz w dziedzinie PRNG, który wynalazł wiele nowych rodzajów PRNG, takich jak multiply-with-carry i xor-shift, zrobił to dokładnie, kiedy zaproponował generator KISS w latach 90., który jest kombinacją trzech PRNG innego rodzaju. Używam KISS z powodzeniem przez ostatnie dwadzieścia lat, oczywiście nie do kryptografii. Przydatnym wtórnym źródłem w odniesieniu do KISS jest ten artykuł Grega Rosea z 2011 r., W którym zwraca uwagę na problem z jednym ze składowych PRNG, który nie unieważnia koncepcji łączenia
njuffa

4
Knuth relacjonuje wynik naiwnego łączenia generatorów liczb pseudolosowych (za pomocą jednej liczby losowej, aby wybrać, którego generatora użyć), w wyniku czego funkcja zbiega się do stałej wartości! W czasach poprzedzających rewolucję mikrokomputerów ostrzegł nas, abyśmy nigdy nie mieszali losowych generatorów.
JDługosz

Odpowiedzi:


7

IIRC (i to z pamięci), bestseller Rand z 1955 r. A Million Random Digits zrobił coś takiego. Zanim komputery były tanie, ludzie wybrali z tej książki losowe liczby.

Autorzy wygenerowali losowe bity z szumem elektronicznym, ale okazało się to stronnicze (ciężko jest, aby flipflop spędził dokładnie tyle samo razy na flipie i flopie). Jednak połączenie bitów sprawiło, że rozkład był znacznie bardziej jednolity.


45

Oczywiście możesz łączyć PRNG w ten sposób, jeśli chcesz, zakładając, że są one rozstawione niezależnie. Będzie jednak wolniejszy i prawdopodobnie nie rozwiąże najpilniejszych problemów, jakie mają ludzie.

W praktyce, jeśli masz wymaganie bardzo wysokiej jakości PRNG, używasz sprawdzonego PRNG o sile kryptograficznej i wysiewasz go z prawdziwą entropią. Jeśli to zrobisz, najbardziej prawdopodobny tryb awarii nie stanowi problemu z samym algorytmem PRNG; najbardziej prawdopodobnym trybem awarii jest brak odpowiedniej entropii (lub może błędy implementacji). Xoring wielu PRNG nie pomaga w tym trybie awarii. Tak więc, jeśli chcesz bardzo wysokiej jakości PRNG, prawdopodobnie nie ma sensu go wysyłać.

Alternatywnie, jeśli chcesz statystycznego PRNG, który jest wystarczająco dobry do celów symulacji, zwykle najważniejszą kwestią jest szybkość (generowanie liczb pseudolosowych naprawdę szybko) lub prostota (nie chcesz poświęcać dużo czasu na opracowanie lub wdrożenie). Xor-ing spowalnia PRNG i czyni go bardziej złożonym, więc nie zaspokaja również podstawowych potrzeb w tym kontekście.

Tak długo, jak wykażesz się należytą starannością i kompetencjami, standardowe PRNG są wystarczająco dobre, więc naprawdę nie ma powodu, dla którego potrzebujemy czegoś bardziej wymyślnego (nie ma potrzeby xorowania). Jeśli nie masz nawet minimalnego poziomu opieki lub kompetencji, prawdopodobnie nie wybierzesz czegoś złożonego, takiego jak xoring, a najlepszym sposobem na poprawę sytuacji jest skupienie się na większej dbałości i kompetencjach w wyborze PRNG zamiast na Xor-in.

Konkluzja : Zasadniczo sztuczka xor nie rozwiązuje problemów, które ludzie zwykle mają podczas korzystania z PRNG.


3
„brak odpowiedniej entropii ... Xoring wielu PRNG nie pomaga w tym” - w rzeczywistości może to utrudniać, ponieważ zwiększasz ilość entropii potrzebną do zalania swoich PRNG. Dlatego nie chcesz, aby rutynowa praktyka polegała na łączeniu dobrze sprawdzonych PRNG, nawet jeśli naprawdę chroni cię przed jednym z tych dobrze sprawdzonych PRNG, które okazują się kompletnymi śmieciami (w implementacji, której używasz) .
Steve Jessop,

Innym powodem jest to, że błędy implementacyjne są o wiele bardziej powszechne niż podstawowe problemy z algorytmami, więc im prościej, tym lepiej. Standardowy algorytm można przynajmniej przetestować pod kątem innej implementacji lub wartości referencyjnych, czego nie może zrobić niestandardowy xor.
Gilles

1
@DW Dlaczego „seeded niezależnie?” Ponieważ moje pytanie dotyczy kombinacji różnych rodzin generatorów, każda rodzina powinna wytworzyć unikalną sekwencję wyjściową z identycznych nasion. Na przykład java.SecureRandom i RC4 można łatwo zainicjować z tego samego klucza, a następnie połączyć.
Paul Uszak

1
@DW Wielkie założenie, że twierdzisz, że „używasz dobrze sprawdzonego PRNG o sile kryptograficznej”. Rzeczywistość jest praktycznie niemożliwa do ustalenia, jak w przypadku większości szyfrów szyfrowych, skrótów i tak dalej - słabości są z czasem wykrywane. Byli „dobrze sprawdzeni” pod względem wiedzy o wczoraj lub w przeszłości.
Shiv

1
@PaulUszak, nie sądzę, żebym kiedykolwiek twierdził, że xor-dwa generatory zwiększają podatność na błędy. Mówię, że jeśli wybierzesz dobry PRNG (tylko jeden), jednym z najbardziej prawdopodobnych trybów awarii jest błąd inicjowania lub błąd implementacji, a xor dwóch generatorów nie pomaga w żadnym z nich. (Oczywiście, jeśli pojedynczy PRNG nie zawiedzie, Xor-dwa generatory też nie są przydatne.) W zasadzie rozwiązuje to zły problem. Innymi słowy, generatory xor nie zwiększają znacznie pewności, ponieważ nie zajmują się najważniejszymi przyczynami niepewności.
DW

19

W rzeczywistości właśnie ogłoszono coś przełomowego.

Profesor informatyki z Uniwersytetu Teksasu David Zuckerman i doktorant Eshan Chattopadhyay odkryli, że można wygenerować liczbę losową „wysokiej jakości” poprzez połączenie dwóch źródeł losowych „niskiej jakości”.

Oto ich artykuł: Wyraźne ekstraktory z dwóch źródeł i sprężyste funkcje


8
Jest to czysto teoretyczny artykuł na inny temat, który nie ma absolutnie żadnego praktycznego znaczenia, pomimo wysiłków PR podjętych przez UT.
Yuval Filmus,

4
@Yuval Filmus - czy chciałbyś rozwinąć ten komentarz?
Nietzschean,

8
Istnieje duża różnica między teorią a praktyką. Zwykle praktykujący nie dbają o teorię i odwrotnie. W tym przypadku oddział PR UT postanowił zatrzasnąć się na doskonałej pracy teoretycznej, opisując ją jako praktycznie istotną, co nie jest. Problemy rozważane w artykule nie są tak interesujące z praktycznego punktu widzenia i mają proste rozwiązania, które działają wystarczająco dobrze, chociaż nie można tego udowodnić.
Yuval Filmus,

2
Co więcej, ten konkretny artykuł to tylko jedna praca w teoretycznym obszarze ekstraktorów. Możesz wystawić rachunek za każdy inny papier w okolicy w ten sam sposób. Chodzi o połączenie słabych źródeł, aby stworzyć silne źródło. Różnica polega tylko na parametrach.
Yuval Filmus,

3
Wreszcie, konstrukcja tego dokumentu jest prawdopodobnie przesadą, a nie czymś, co kiedykolwiek chciałbyś wdrożyć. Konkretne parametry tego typu konstrukcji są trudne do ustalenia i zwykle są bardzo złe, ponieważ dokumenty zawsze koncentrują się na systemie asymptotycznym i ignorują stałe.
Yuval Filmus,

9

Załóżmy, że jest pseudolosową sekwencją binarną. Oznacza to, że każdy jest losową zmienną obsługiwaną w , a zmienne niekoniecznie są niezależne. Możemy pomyśleć o wygenerowaniu tej sekwencji w następujący sposób: najpierw próbkujemy jednolicie losowy klucz , a następnie używamy funkcji do wygenerowania sekwencji pseudolosowej.X1,,XnXi{0,1}X1,,XnKf(K)

Jak mierzymy, jak dobra jest pseudolosowa sekwencja ? Chociaż można zmierzyć, jak dobra jest konkretna realizacja (powiedzmy, używając złożoności Kołmogorowa), tutaj skoncentruję się na miarach, które zależą od całego rozkładu zmiennej losowej . Jednym z takich przykładów jest entropia, ale będziemy potrzebować tylko dwóch właściwości naszej miary : (większy oznacza bardziej losową sekwencję)X1,,Xn(X1,,Xn)LL()

  • Jeśli jest sekwencją deterministyczną (tj. Ustaloną sekwencją), to . L ( X 1y 1 , , X ny n ) = L ( X 1 , , X n )y1,,ynL(X1y1,,Xnyn)=L(X1,,Xn)

  • Jeśli to dwie niezależne sekwencje pseudolosowe, jest niezależnym bitem losowym, a , a następnie .X0,X1T{0,1}Z=XTL(Z)min(X0,X1)

Pierwsza właściwość oznacza, że ​​miara jest niezmienna przy odwróceniu tego bitu. Druga właściwość oznacza, że ​​jeśli pomieszamy dwie dystrybucje , to wynik będzie co najmniej tak dobry, jak gorszy.iX,Y

Każda rozsądna miara losowości zaspokoi pierwszą właściwość. Drugą właściwość spełniają najbardziej popularne miary, takie jak entropia i min-entropia .HH

Możemy teraz stwierdzić i udowodnić twierdzenie pokazujące, że XORing dwóch sekwencji pseudolosowych jest zawsze dobrym pomysłem.

Twierdzenie. Niech będą dwiema niezależnymi pseudolosowymi sekwencjami o tej samej długości i niech będzie dopuszczalną miarą losowości (jedna spełniająca dwa powyższe warunki). NastępnieX,YL

L(XY)max(L(X),L(Y)).

Dowód. Załóżmy, że . Następnie jest mieszaniną Rozkłady zmieszane zgodnie z podziałem . Ponieważ i mieszanina jest co najmniej tak dobra, jak najgorszy mieszany rozkład, otrzymujemy . L(X)L(Y)XYXyYL(Xy)=L(X)L(XY)L(X) 

To twierdzenie oznacza, że ​​jeśli XOR wygeneruje dwie pseudolosowe sekwencje wygenerowane przy użyciu dwóch niezależnych kluczy, wynik będzie zawsze co najmniej tak dobry, jak lepsza sekwencja XORed, w odniesieniu do dowolnej dopuszczalnej miary losowości.

W praktyce, aby użyć dwóch niezależnych kluczy, prawdopodobnie pseudolosowo rozszerzamy jeden klucz na dwa klucze. Dwa klucze nie są wówczas niezależne. Jeśli jednak użyjemy „drogiego” sposobu na rozwinięcie jednego klucza na dwa klucze, spodziewamy się, że otrzymane dwa klucze będą „wyglądać” niezależnie, a zatem twierdzenie będzie utrzymywać „moralnie”. W kryptografii teoretycznej istnieją sposoby na sprecyzowanie tego stwierdzenia.


Czy zatem powinniśmy XOR dwa generatory liczb pseudolosowych? Jeśli nie ogranicza nas prędkość, to z pewnością dobry pomysł. Ale w praktyce mamy ograniczenie prędkości. Następnie możemy zadać następujące pytanie. Załóżmy, że otrzymujemy dwa PRNG, każdy z parametrem który kontroluje czas działania (a więc i siłę) generatora. Na przykład może być długością LFSR lub liczbą rund. Załóżmy, że używamy jednego PRNG z parametrem , drugiego z parametrem , a XOR wynik. Możemy założyć, że , więc całkowity czas działania jest stały. Jaki jest najlepszy wybórTTT1T2T1+T2=tT1,T2? Tutaj jest kompromis, na który ogólnie trudno jest odpowiedzieć. Może się zdarzyć, że ustawienie jest znacznie gorsze niż lub .(t/2,t/2)(t,0)(0,t)

Najlepszą radą jest trzymanie się popularnego PRNG, który jest uważany za silny. Jeśli możesz poświęcić więcej czasu na wygenerowanie sekwencji, XOR kilka kopii, używając niezależnych kluczy (lub kluczy generowanych przez rozwinięcie jednego klucza za pomocą drogiego PRNG).


Komentarze nie są przeznaczone do rozszerzonej dyskusji; ta rozmowa została przeniesiona do czatu . Po konstruktywnym zakończeniu edytuj odpowiedź, aby uwzględnić wyniki dyskusji.
Raphael

4

Dam temu szansę, ponieważ wystarczająco niepokoi mnie rada zawarta w niektórych innych odpowiedziach.

Niech będą nieskończonymi sekwencjami bitowymi generowanymi przez dwa RNG (niekoniecznie PRNG, które są deterministyczne po poznaniu stanu początkowego), i rozważamy możliwość użycia sekwencji z nadzieją na poprawę zachowania w pewnym sensie. Istnieje wiele różnych sposobów, w których można uznać za lepsze lub gorsze w porównaniu do każdego z i ; oto garstka, które moim zdaniem są znaczące, użyteczne i zgodne z normalnym użyciem słów „lepiej” i „gorzej”:X,YXYXYXY

  • (0) Prawdopodobieństwo prawdziwej losowości sekwencji wzrasta lub maleje
  • (1) Prawdopodobieństwo zwiększenia lub zmniejszenia obserwowalnego braku losowości (prawdopodobnie w odniesieniu do niektórych obserwatorów stosujących pewną określoną kontrolę)
  • (2) Nasilenie / oczywistość obserwowalnej nieprzypadkowości wzrasta lub maleje.

Najpierw zastanówmy się nad (0), który jest jedynym z trzech, który ma nadzieję, że zostanie sprecyzowany. Zauważ, że jeśli w rzeczywistości jeden z dwóch wejściowych RNG jest naprawdę losowy, bezstronny i niezależny od drugiego, wynik XOR będzie również naprawdę losowy i bezstronny. Mając to na uwadze, rozważ przypadek, w którym uważasz, że jest naprawdę przypadkowym, bezstronnym, izolowanym strumieniem bitów, ale nie jesteś całkowicie pewien. Jeśli są odpowiednimi prawdopodobieństwami, że mylisz się co do każdego z nich, wówczas prawdopodobieństwo, że nie jest tak naprawdę losowy, to , w rzeczywistości znacznie mniej odX,YεX,εYXYεXεY<min{εX,εY}εX,εY przyjmuje się, że są bardzo bliskie zeru („uważasz, że są naprawdę przypadkowe”). I w rzeczywistości jest nawet lepsze, gdy weźmiemy również pod uwagę możliwość, że będzie naprawdę niezależny, nawet jeśli żadne z nich nie jest naprawdę losowe: Dlatego możemy stwierdzić, że w sensie (0) XOR nie może zaszkodzić i może potencjalnie bardzo pomóc.X,Y

Pr(XY not truly random)min{Pr(X not truly random),Pr(Y not truly random),Pr(X,Y dependent)}.

Jednak (0) nie jest interesujące dla PRNG, ponieważ w przypadku PRNG żadna z omawianych sekwencji nie ma szans na bycie naprawdę losową.

Dlatego w przypadku tego pytania, które w rzeczywistości dotyczy PRNG, musimy mówić o czymś takim jak (1) lub (2). Ponieważ są to właściwości i ilości, takie jak „obserwowalne”, „surowe”, „oczywiste”, „pozorne”, mówimy teraz o złożoności Kołmogorowa i nie zamierzam tego wyjaśniać. Ale posunę się tak daleko, aby uczynić, miejmy nadzieję, kontrowersyjną tezę, że według takiego środka „01100110 ...” (okres = 4) jest gorszy niż „01010101 ...” (okres = 2), który jest gorszy niż „ 00000000 ... ”(stała).

Teraz można się domyślać, że (1) i (2) będą podążać tą samą tendencją co (0), i dlatego wniosek „XOR nie może zranić” nadal może się utrzymywać. Zwróć jednak uwagę na znaczącą możliwość, że ani ani było zauważalnie nieprzypadkowe, ale że korelacje między nimi powodują, że jest zauważalnie nieprzypadkowy. Najcięższym przypadkiem tego jest oczywiście sytuacja, gdy (lub ), w którym to przypadku jest stały, najgorszy ze wszystkich możliwych wyników; ogólnie łatwo zauważyć, że niezależnie od tego, jak dobre są i ,XYXYX=YX=not(Y)XYXYXi muszą być „bliskie” niezależności, aby ich xor nie był zauważalnie nielosowy. W rzeczywistości brak zależności, którą można zaobserwować, można rozsądnie zdefiniować jako która nie jest zauważalnie nieprzypadkowa.YXY

Taka zależność od niespodzianek okazuje się naprawdę dużym problemem.


Przykład tego, co idzie nie tak

Pytanie brzmi: „Wykluczam wspólny przykład kilku rejestrów przesuwnych z liniowym sprzężeniem zwrotnym pracujących razem, ponieważ pochodzą one z tej samej rodziny”. Ale na razie wykluczę to wyłączenie, aby dać bardzo prosty, jasny przykład z życia rzeczy, które mogą się nie udać w XORing.

Moim przykładem będzie stara implementacja rand (), która była w jakiejś wersji Uniksa około 1983 roku. IIRC, ta implementacja funkcji rand () miała następujące właściwości:

  • wartość każdego wywołania funkcji rand () wynosiła 15 pseudolosowych bitów, to jest liczb całkowitych z zakresu [0, 32767).
  • kolejne zwracane wartości na przemian parzyste-nieparzyste-parzyste-nieparzyste; to znaczy najmniej zmienny bit na przemian 0-1-0-1 ...
  • bit najmniej znaczący miał okres 4, następny miał okres 8, ... więc bit najwyższego rzędu miał okres .215
  • dlatego sekwencja 15-bitowych wartości zwracanych przez rand () była okresowa z okresem .215

Nie udało mi się znaleźć oryginalnego kodu źródłowego, ale zgaduję, że poskładałem kilka postów z https://groups.google.com/forum/#!topic/comp.os.vms/9k4W6KrRV3A tego zrobił dokładnie to (kod C), co zgadza się z moją pamięcią powyższych właściwości:

#define RAND_MAX 32767
static unsigned int next = 1;
int rand(void)
{
    next = next * 1103515245 + 12345;
    return (next & RAND_MAX);
}
void srand(seed)
unsigned int seed;
{
    next = seed;
}

Jak można sobie wyobrazić, próba użycia tego rand () na różne sposoby doprowadziła do szeregu rozczarowań.

Na przykład w pewnym momencie próbowałem symulować sekwencję losowych rzutów monetą, wielokrotnie wykonując:

rand() & 1

czyli najmniej znaczący bit. Wynik był prosty naprzemiennie głowice-ogony-głowice-ogony. Na początku trudno było w to uwierzyć (to musi być błąd w moim programie!), Ale po tym, jak przekonałem się, że to prawda, spróbowałem użyć następnego najmniej znaczącego bitu. Nie jest to o wiele lepsze, jak zauważono wcześniej - ten bit jest okresowy z okresem 4. Dalsze badanie kolejnych wyższych bitów ujawniło wzór, który zauważyłem wcześniej: to znaczy, że każdy następny bit wyższego rzędu miał dwa razy większy okres niż poprzedni, więc w pod tym względem bit najwyższego rzędu był najbardziej przydatny ze wszystkich. Zauważ jednak, że nie było czarno-białego progu „bit jest przydatny, bit nie jest użyteczny” tutaj; wszystko, co możemy naprawdę powiedzieć, to to, że numerowane pozycje bitów miały różny stopień przydatności / bezużyteczności.ii1

Próbowałem także dalej mieszać wyniki lub XORing razem wartości zwracane z wielu wywołań funkcji rand (). XORing par kolejnych wartości rand () był oczywiście katastrofą - spowodował wszystkie nieparzyste liczby! Dla moich celów (mianowicie wytwarzanie „pozornie losowej” sekwencji rzutów monetą) wynik XOR o stałej parzystości był nawet gorszy niż naprzemienne zachowanie parzyste i nieparzyste oryginału.

Niewielka odmiana umieszcza to w oryginalnym frameworku: niech będzie sekwencją 15-bitowych wartości zwróconych przez rand () z danym ziarnem , a sekwencją z innego ziarna . Ponownie, będzie sekwencją liczb parzystych lub nieparzystych, co jest gorsze niż pierwotne zachowanie na przemian parzystych / nieparzystych.XsXYsYXY

Innymi słowy, jest to przykład, w którym XOR pogorszył sytuację w sensie (1) i (2), przy jakiejkolwiek rozsądnej interpretacji. Gorzej jest również na kilka innych sposobów:

  • (3) Bit najmniej znaczący XOR jest oczywiście stronniczy, tj. Ma nierówne częstotliwości zer i jedynek, w przeciwieństwie do jakiejkolwiek numerowanej pozycji bitu na którymkolwiek z wejść, które są całkowicie niezależne.
  • (4) W rzeczywistości dla każdej pozycji bitu istnieją pary nasion, dla których ta pozycja bitu jest tendencyjna w wyniku XOR, a dla każdej pary nasion istnieją (co najmniej 5) pozycje bitu, które są tendencyjne w XOR wynik.
  • (5) Okres całej sekwencji 15-bitowych wartości w wyniku XOR wynosi 1 lub , w porównaniu do dla oryginałów.214215

Żaden z (3), (4), (5) nie jest oczywisty, ale wszystkie można łatwo zweryfikować.


Na koniec zastanówmy się nad ponownym wprowadzeniem zakazu PRNG z tej samej rodziny. Problem w tym, jak sądzę, polega na tym, że nigdy tak naprawdę nie jest jasne, czy dwa PRNG są „z tej samej rodziny”, dopóki / chyba że ktoś zacznie używać XOR i zauważy (lub atakujący zauważy), że sytuacja pogorszyła się w sensie (1) i (2), tzn. dopóki nieprzypadkowe wzorce na wyjściu nie przekroczą progu od niezauważonego do zauważonego / zawstydzającego / katastrofalnego, i wtedy jest już za późno.

Jestem zaniepokojony innymi odpowiedziami, które udzielają niekwalifikowanej porady, że „XOR nie może zaszkodzić” na podstawie teoretycznych miar, które wydają się źle wykonywać modelowanie tego, co większość ludzi uważa za „dobre” i „złe” na temat PRNG w prawdziwym życiu. Ta rada jest sprzeczna z wyraźnymi i rażącymi przykładami, w których XOR pogarsza sytuację, takimi jak przykład rand () podany powyżej. Chociaż można sobie wyobrazić, że stosunkowo „silne” PRNG mogłyby konsekwentnie wykazywać odwrotne zachowanie, gdy XORed do zabawkowego PRNG, który był rand (), dzięki czemu XOR był dla nich dobrym pomysłem, nie widziałem żadnych dowodów w tym kierunku, teoretycznych lub empiryczny, więc nie wydaje mi się rozsądne zakładanie, że tak się dzieje.

Osobiście, będąc ugryzionym z zaskoczenia przez XORing rand () w mojej młodości i niezliczonymi innymi powiązaniami z niespodziankami przez całe moje życie, nie mam powodu, aby sądzić, że wynik będzie inny, jeśli spróbuję ponownie podobnej taktyki. Właśnie dlatego osobiście byłbym bardzo niechętny wobec XOR razem wielu PRNG, chyba że przeprowadzono bardzo obszerną analizę i weryfikację, aby dać mi pewność, że może to być bezpieczne dla poszczególnych RNG, o których mowa. Jako potencjalne lekarstwo na to, kiedy mam niskie zaufanie do jednego lub więcej indywidualnych PRNG, XOR nie jest w stanie zwiększyć mojej pewności, więc raczej nie użyję go do takiego celu. Wyobrażam sobie, że odpowiedź na twoje pytanie jest taka, że ​​jest to powszechne przekonanie.


Jak więc wyjaśnić użycie A5 / 1 przez dosłownie miliardy ludzi?
Paul Uszak

@PaulUszak Nie mam pojęcia. Czy miliardy ludzi używane przez A5 / 1 zaprzeczają temu, co powiedziałem?
Don Hatch

To trzy prngs (właściwie z tej samej rodziny) połączone razem, aby stworzyć lepszy sposób, który przeszkadza i alarmuje ...
Paul Uszak

Niepokoi mnie i niepokoi niepokojąca rada „jeśli nie jesteś pewien, śmiało i XOR razem kilka RNG; to nie może pogorszyć sprawy”. Nie chciałem powiedzieć ani sugerować, że XOR jest zły we wszystkich przypadkach i nie mam żadnej opinii na temat A5 / 1 ani użycia w nim XOR. Czy pomogłoby to, jeśli zmienię moje ostatnie głupie podsumowanie, aby uczynić to jaśniejszym?
Don Hatch

1
Na końcu uproszczone słowo „po prostu odmów XORing RNG” zastąpiłem czymś bardziej realnym i, mam nadzieję, mniej wprowadzającym w błąd.
Don Hatch

0

OŚWIADCZENIE: Ta odpowiedź dotyczy wyłącznie „Nie robimy tego”, a nie „oto matematyczny dowód, dlaczego może lub nie może działać”. Nie twierdzę, że XOR wprowadza (lub nie) jakiekolwiek luki w zabezpieczeniach kryptograficznych. Chodzi mi tylko o to, że doświadczenie pokazuje nam, że nawet najprostsze schematy prawie zawsze powodują nieprzewidziane konsekwencje - i dlatego ich unikamy.

„Losowość” to tylko wierzchołek góry lodowej, jeśli chodzi o RNG i PRNG. Istnieją inne cechy, które są ważne, np. Jednolitość.

Wyobraź sobie zwykłą kostkę, która sama w sobie jest całkiem dobrym RNG. Ale powiedzmy teraz, że potrzebujesz zakresu 1-5 zamiast 1-6. Pierwszą rzeczą, która przychodzi na myśl, jest po prostu wymazanie 6 twarzy i zastąpienie jej dodatkowym 1. „Losowość” pozostaje (wyniki są nadal naprawdę losowe), jednak jednorodność bardzo cierpi: teraz 1 jest dwa razy bardziej prawdopodobne niż inne wyniki.

Łączenie wyników z wielu RNG jest podobnie śliskie nachylenie. Na przykład. proste dodanie 2 rzutów kostką całkowicie usuwa wszelką jednolitość, ponieważ „7” jest teraz 6 razy bardziej prawdopodobne niż „2” lub „12”. Zgadzam się, że XOR wygląda lepiej niż dodawanie na pierwszy rzut oka, ale w PRNG nic nie wychodzi, jak wygląda na pierwszy rzut oka.

Właśnie dlatego trzymamy się znanych implementacji - ponieważ ktoś spędził mnóstwo czasu i pieniędzy na ich badaniu, a wszystkie niedociągnięcia są dobrze znane, zrozumiałe i można je obejść. Wdrażając własne, możesz stworzyć luki i powinieneś podjąć podobne wysiłki, aby to udowodnić. Jak pokazuje przykład dodawania kości, łączenie nie może bardzo różnić się od tworzenia nowego od zera.

Bezpieczeństwo to łańcuch tak silny, jak jego najsłabszy element. Praktyczna zasada bezpieczeństwa: za każdym razem, gdy łączysz 2 rzeczy, zwykle dostajesz sumę wad, a nie sumę mocnych stron.


7
Zdecydowanie się nie zgadzam. Jeśli XOR naprawdę losowa sekwencja z dowolną sekwencją, nadal otrzymujesz prawdziwie losową sekwencję. Podobnie, jeśli XOR dwie niezależne sekwencje pseudolosowe (tj. Wygenerowane przy użyciu różnych kluczy), otrzymamy coś co najmniej tak silnego jak każda z osobna.
Yuval Filmus

3
Wydaje mi się to złe. Zazwyczaj tutaj jest tak, że myślę, że mam dwa bardzo wysokiej jakości RNG wytwarzające zasadniczo naprawdę losowe bity, ale istnieje niewielka szansa epsilon, że mogę (być może rażąco) pomylić się co do jednego (lub, znacznie mniej prawdopodobne, obu) z nich. Jeśli poproszę ich razem, o ile mam rację co najmniej jednego z nich, wynik będzie naprawdę losowy i jestem dobry. Łącząc je, zmniejszyłem szansę na złą RNG z grubszego epsilon / 2 do bardzo małego epsilon ^ 2, co jest zdecydowanie wygraną. Podejrzewam, że podobna dynamika utrzymuje się nawet w przypadkach, w których mniej próbowano.
Don Hatch

2
Nadal nie jestem przekonany. Kiedy pisałem „naprawdę losowy”, miałem na myśli „jednolicie losowy”. Jeśli XOR jednolicie losowa sekwencja z dowolną sekwencją, otrzymamy jednolicie losową sekwencję.
Yuval Filmus

2
@DonHatch Z pewnością to by się kwalifikowało. Powiedzmy, że Twój PRNG generuje sekwencję o długości 100, następnie hałaśliwą wersję tej samej sekwencji i tak dalej. Załóżmy, że bitowa korelacja drugiej kopii z pierwszą to . Sekwencja spełnia . Od, można śmiało powiedzieć, że korelacje nie zostały „rażąco powiększone”, ale raczej rażąco zmniejszone. Pr[Xi+100=Xi]=(1+ϵ)/2Zi=XiYiPr[Zi+100=Zi]=(1+ϵ2)/2ϵ2|ϵ|
Yuval Filmus,

3
@YuvalFilmus Prawdopodobnie masz rację, że korelacja między pozycją i a pozycją i + 100 została znacznie zmniejszona, ale nie o to chodzi. Dla bardzo konkretnego i rzeczywistego przykładu: pamiętam, że stara, gówniana implementacja rand () na Uniksie miała okresowe zachowanie w bitach najniższego rzędu każdej 31-bitowej liczby całkowitej, czego większość ludzi nie zauważyła. Xw tej sekwencji liczb całkowitych z przesuniętą kopią samego siebie (którą otrzymujesz, gdy używasz innego ziarna) o niefortunnym rozmiarze przesunięcia, otrzymasz wszystkie liczby parzyste. W większości przypadków jest to znacznie gorsze niż problem z oryginalnej sekwencji.
Don Hatch,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.