Generatory liczb losowych wykorzystujące pin GPIO?

22

Właśnie przeczytałem pytanie Generator liczb losowych AVR i spotkałem się z wieloma sposobami generowania losowych nasion w AVR:

  • Użyj specjalnego „Bezpiecznego AVR”
  • Użyj wewnętrznego czujnika temperatury
  • Czytaj niepisaną pamięć EEPROM
  • Zmierz odstępy czasu między danymi wprowadzanymi przez użytkownika
  • Użyj pływającego pinu ADC.

Dlaczego nie tylko pojedynczy pin cyfrowy, skonfigurowany jako wejście bez podciągania i swobodnego? Teoretycznie powinno to generować strumień losowych bitów. Dlaczego tego nie użyć? Czy stan zmienia się zbyt wolno? Czy ma tendencję do zatrzymywania się na 1 lub 0? Jakieś inne problemy?

Vorac
źródło
1
Bezpieczny AVR nie żyje AFAIK
vicatcu
1
Czy niepisany eeprom nie zawsze jest 0xFF?
vsz
@vsz, może jeśli coś do tego napiszesz i zapomnisz o tym, co napisałeś, teraz jest to „losowe”. lol.
Vorac,

Odpowiedzi:

5

„Losowo” to podchwytliwe słowo. W niektórych kontekstach oznacza to po prostu „nieprzewidywalny”, ale w innych kontekstach - w szczególności związanych z przetwarzaniem sygnałów i kryptografią - oznacza „statystycznie nieskorelowany”.

Nawet jeśli wartość odczytana z pływającego pinu jest nieprzewidywalna („losowa” w pierwszym znaczeniu), prawdopodobnie nie będzie użyteczna w drugim znaczeniu.

Dave Tweed
źródło
15

Oczywista różnica między użyciem wejścia cyfrowego i analogowego polega na tym, że w analogu istnieje większy zakres wartości początkowych.

Po drugie, ale być może bardziej istotne: jeśli zmienna „mediana” cyfrowego pinu nie znajduje się dokładnie w połowie między poziomami logiki (które nie są poziomami mocy i szyny uziemienia, ale progami przełączania obwodów wejściowych), powstały strumień bitów będzie miał mocne odchylenie w kierunku 1 lub 0. To odchylenie wypacza nasiona znacznie silniej niż wypaczenie w poziomach analogowych.

Zajmie to bardzo mało sprzężenia, pochodzącego z pobliskich śladów lub sygnałów, lub poprzez rezystancyjne podciąganie / opuszczanie, niezależnie od tego, czy jest zaprojektowane, czy przypadkowe, aby wypchnąć „pływający” pin cyfrowy na powierzchnię - i równie dobrze może to nastąpić po rozlokowanie. W inżynierii każdego projektu najlepiej unikać tej formy trybu awarii.

Anindo Ghosh
źródło
14

Dane zmiennoprzecinkowe są niezdefiniowane. Może dać ci losowe bity, ale może również utknąć na 0 lub 1. W większości przypadków utknie. A gdy jest naprawdę pływający, może powodować zwiększony hałas i zużycie energii. Pływające wejścia są generalnie złą rzeczą, nawet jeśli nie są używane do niczego.


źródło
Nie tylko utknie przez jakiś czas w 0 lub 1, ale dopóki dwa tranzystory, które tworzą pierwszy stopień bufora wejściowego, nie są idealnie zbalansowane, lub po drodze będzie jakieś zewnętrzne źródło prądu, wejście będzie się unosić ostatecznie do 1 lub ostatecznie do 0.
wjl
9

Najprostszym rozwiązaniem jest zbudowanie sprzętowego obwodu generatora sygnałów losowych z niewłaściwie wykorzystywanego obwodu tranzystora z otwartym kolektorem. Użyj wyjścia strumienia bitów do wejścia mikrokontrolera. Próbkuj przychodzące bity w odstępach czasu. Aby zapewnić z grubsza parzystą liczbę 1 i 0, wystarczy użyć zmiany stanu jako 1, a bez zmiany jako zero. Google dla generatora szumów tranzystorowych, aby uzyskać więcej informacji.

Chris
źródło
Ciekawy. Jak wygląda „niewłaściwie wykorzystywany obwód tranzystora otwartego kolektora”?
Stephen Collings
7
@Remiel - Odwracasz uprzedzenie połączenia tranzystora z emiterem bazy i działa on jak naprawdę gówniany zener. Bierzesz bardzo głośny zener i wzmacniasz szum, aby uzyskać losowy strumień bitów. Zobacz robseward.com/misc/RNG2
Connor Wolf
3

Jednym losowym generatorem, który jest dostępny w wielu mikrokontrolerach, jest błąd między dwoma źródłami zegara (być może jednym wewnętrznym a drugim zewnętrznym). Porównując je, dryfują nieco z powodu hałasu i można ich użyć.

W końcu to zależy od tego, czego potrzebujesz? Trochę randomizacji i możesz nawet użyć wtyku ADC podłączonego do niczego. Lub po prostu użyj algorytmu takiego jak

Mersenne twister http://en.wikipedia.org/wiki/Mersenne_twister

Brak, jeśli jest to kryptograficznie bezpieczne, ale wystarczające do większości celów.

Gustavo Litovsky
źródło
takie podejście zostało zastosowane w notatce o aplikacji msp430 we wspomnianym wcześniejszym pytaniu, według mojej wiedzy system zegara AVR nie obsługuje tej techniki
vicatcu
Poprawny. Nadal powinno być możliwe zrobienie tego z tym samym źródłem zegara, nawet jeśli nie jest ono bezpośrednio obsługiwane.
Gustavo Litovsky
3

Jakość losowego materiału siewnego i jego algorytmu zależy od wielkości entropii lub niepewności w każdym losowym bicie. Wtedy najlepszy generator nasion używa wysokiej entropii z bardzo małą liczbą kroków, a nie wieloma stopniami niskiej entropii.

Dobry przykład wysokiej entropii wykorzystuje metodę Latin Squares dla losowego materiału siewnego.

Swobodny sygnał wejściowy jest łatwo odchylany przez wady, wycieki lub hałas wnikający.

Tony Stewart Sunnyskyguy EE75
źródło
0

W mikroprocesorze PIC18F musisz mieć ziarno dla liczby losowej. Ziarno może mieć wartość od 0 do 32767 (15 bitów). Proponuję na początku programu zrobić jeden z pinów i analogowy pin wejściowy. Przeczytaj ten pin i weź najmniej znaczący bit i umieść go w zmiennej 16-bitowej. Następnie przesuń zmienną w lewo o 1. Ponownie przeczytaj pin i umieść LSB wyniku ADC w pierwszym bicie zmiennej, w której zapisałeś ostatni bit. Przesuń ponownie w lewo .....

Powtarzaj to, dopóki nie będziesz mieć 15 bitów w swojej zmiennej. Jest to liczba, którą musisz umieścić w swoim nasieniu.

Po wykonaniu tej czynności możesz po prostu uczynić analogowy pin wejściowy cyfrowym pinem wejściowym i umożliwić słabe podciągnięcie go lub uczynić go cyfrowym pinem wyjściowym. Każdy z nich powstrzyma ten pin od unoszenia się.

Portreathbeach
źródło