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?


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.


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.


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.


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.


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.


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.


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ę.

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.