Przeczytałem notatkę z TI ( slaa338 ), która opisuje technikę generowania „rzeczywistych” (w przeciwieństwie do „pseudo”) liczb losowych. Wykorzystuje nieco egzotyczny podsystem zegara MSP430, aby osiągnąć ten cel. Czy ktoś wie o technice, która może być zaimplementowana w AVR (interesuję się w szczególności XMegą) do generowania liczb „rzeczywistych”?
avr
xmega
random-number
vicatcu
źródło
źródło
Odpowiedzi:
Jak źle używasz XMega? Jeśli generowanie liczb kryptograficznych i liczb losowych stanowi dużą część Twojego projektu, seria SecureAVR firmy Atmel ma wbudowany sprzętowy numer losowy i jest przeznaczony do zastosowań kryptograficznych.
Niezależnie od tego wątpię, czy znajdziesz przypadkowe źródło nasion o dobrej dystrybucji. Będziesz chciał uruchomić go kilka razy przez generator pseudolosowych liczb. Jeśli zaczniesz za każdym razem z innym ziarnem, da ci to niezły zestaw liczb losowych. LGC to szybki i łatwy pseudolosowy generator:
źródło
Podłącz ADC do sprzętowego źródła szumu i użyj oprogramowania do „wybielania” liczb losowych, jeśli to konieczne.
Oto projekt oparty na AVR, który to robi: Mini przenośny generator liczb losowych Leona (mPRNG)
W zależności od tego, jak bezpieczne musi być kryptograficznie, możesz użyć szumu uziemionego wejścia analogowego lub „ wewnętrznego czujnika temperatury ” jako materiału losowego zamiast zewnętrznego sprzętu.
Aktualizacja : Później napisałem program dla Arduino, który używa zegarów układu jako źródła entropii (ADC okazało się bezużyteczne, ponieważ hałaśliwe bity są obcięte), co zainspirowało stworzenie biblioteki Entropy .
W obu przypadkach losowość nie wynika na przykład z samej wartości temperatury, która zmienia się tylko powoli, ale z najmniej znaczących bitów , które zmieniają się losowo od jednego odczytu do następnego. Czytam tę wartość wiele razy, raz dla każdego bitu wyjściowego, przesunięcia bitów i XOR z poprzednim odczytem. XOR prawdziwie losowy bit z nieskorelowanym bitem zachowuje losowość , więc losowość rozprzestrzenia się na wszystkie bity i staje się prawdziwym białym szumem. Szybkość transmisji nie będzie jednak bardzo wysoka, ponieważ otrzymujesz tylko jeden bit mocy wyjściowej na czas akwizycji lub cykl timera. Dzięki metodzie timera uzyskiwałem około 64 bitów / s.
źródło
Kolejną sztuczką w generowaniu losowego materiału siewnego jest policzenie liczby cykli zegara do zdarzenia zewnętrznego. Na przykład, jeśli jest to urządzenie, z którego ma korzystać osoba, policz liczbę cykli zegara, aż naciśnie przycisk „idź”, i użyj go jako losowego ziarna.
źródło
Aby upewnić się, że nie uruchomię się ponownie w tej samej sekwencji, używam bajtu somme w eepromie:
Daje to całkiem dobrą losowość i nie kosztuje dużo w programie / pamięci.
źródło
Stworzyłem bibliotekę, która choć oryginalnie zaprojektowana dla Arduino, działa również jako klasa w implementacji C ++ przy użyciu g ++ na avr, ale ostatnio została również przeniesiona do architektury ARM.
Wykorzystuje jitter między zegarem nadzorującym a zegarem systemowym i został przetestowany na wielu różnych układach scalonych (udokumentowane na stronie wiki)
http://code.google.com/p/avr-hardware-random-number-generation/wiki/WikiAVRentropy
źródło
Czy zastanawiałeś się nad użyciem czegoś takiego jak randomSeed () ? - stosowany w Arduino IDE
Można używać tej funkcji do próbki ruchomy bolec (wolny) analogowego Atmel AVR, to wtedy wykorzystuje się wartość do tworzenia dowolnego punktu wyjścia do pseudo losową funkcją numeru - losowo ().
Wartość utworzona przez random () może być pseudolosową liczbą - ale dowolny punkt początkowy utworzony przez randomSeed () powinien być tak rzeczywistą liczbą losową / wartością, jak to tylko możliwe.
źródło
Jest artykuł na temat tego, jak to osiągnąć za pomocą sprzętu AVR. Polega na poleganiu na wahaniach zegara. Zasadniczo używasz przerwania timera opartego na jednym źródle zegara, aby próbkować dolne bity osobnego timera, który jest taktowany oddzielnym niezależnym źródłem zegara. Oba zegary będą powiązane z jakimś przypadkowym jitterem, a próbkowanie nie będzie idealnie okresowe.
Zrobiłem mały dowód tego na mikrokontrolerze STM32, kod jest tutaj na github . Otrzymał kilka dobrych wyników w oparciu o zestaw testów losowych.
Moim zdaniem myślę, że jest to lepsze niż próbkowanie pływającego pinu za pomocą ADC, który jest niezwykle łatwy do ataku (przywiązanie pinu do ziemi, a twój numer nie jest już tak losowy!). Jestem pewien, że istnieje sposób na manipulowanie RNG opartym na flukcie zegara, ale to sprawia, że czuję się trochę lepiej, że mogę to zrobić w oparciu o wewnętrzne źródła zegara.
źródło