Ich habe eine Appnote von TI ( slaa338 ) gelesen , die eine Technik zur Erzeugung von Zufallszahlen "für echte" (im Gegensatz zu "Pseudo") beschreibt. Es nutzt das etwas exotische Clock-Subsystem des MSP430, um dieses Ziel zu erreichen. Kennt jemand eine Technik, die auf einem AVR implementiert werden kann (ich interessiere mich insbesondere für den XMega), um "für echte" Zufallszahlen zu generieren?
avr
xmega
random-number
vicatcu
quelle
quelle
Antworten:
Wie schlecht kannst du den XMega benutzen? Wenn die Erzeugung von Krypto- und Zufallszahlen einen großen Teil Ihres Projekts ausmacht, dann ist Atmel's Krypto- bietet Atmels SecureAVR , verfügt Serie von über eine integrierte Hardware-Zufallszahl und wurde für kryptografische Anwendungen entwickelt.
Ungeachtet dessen bezweifle ich, dass Sie eine zufällige Samenquelle finden, die eine gute Verteilung aufweist. Sie werden es ein paar Mal durch einen Pseudozufallszahlengenerator laufen lassen wollen. Solange Sie jedes Mal mit einem anderen Startwert beginnen, erhalten Sie einen schönen Satz von Zufallszahlen. Ein LGC ist ein schneller und einfacher Pseudozufallsgenerator:
quelle
Schließen Sie den ADC an eine Hardware-Rauschquelle an und verwenden Sie Software, um die Zufallszahlen bei Bedarf "aufzuhellen".
Hier ist ein AVR-basiertes Projekt, das dies tut: Leons Mini Portable Random Number Generator (mPRNG)
Abhängig davon, wie kryptografisch sicher es sein muss, können Sie das Rauschen eines geerdeten Analogeingangs oder die " internen Temperatursensor" verwenden " als Zufallsgenerator anstelle externer Hardware verwenden.
Update : Ich habe später ein Programm für Arduino geschrieben, das die Timer des Chips als Entropiequelle verwendet (der ADC erwies sich als nutzlos, da die verrauschten Bits abgeschnitten sind), und dies hat die Erstellung der Entropy-Bibliothek inspiriert .
In beiden Fällen ergibt sich die Zufälligkeit nicht beispielsweise aus dem Temperaturwert selbst, der sich nur langsam ändert, sondern aus den niedrigstwertigen Bits , die sich zufällig von einem Lesevorgang zum nächsten ändern. Ich habe den Wert mehrmals gelesen, einmal für jedes Bit der Ausgabe, Bitverschiebung und XOR-Verknüpfung mit dem vorherigen Lesevorgang. Durch XOR-Verknüpfung eines wirklich zufälligen Bits mit einem nicht korrelierten Bit bleibt die Zufälligkeit erhalten , sodass sich die Zufälligkeit auf alle Bits verteilt und zu echtem weißem Rauschen wird. Ihre Bitrate wird jedoch nicht sehr hoch sein, da Sie nur ein Bit der Ausgabe pro Erfassungszeit oder Zeitgeberzyklus erhalten. Mit der Timer-Methode erhielt ich ungefähr 64 Bit / s.
quelle
Ein weiterer Trick zum Erzeugen eines zufälligen Startwerts besteht darin, die Anzahl der Taktzyklen bis zu einem externen Ereignis zu zählen. Wenn es sich beispielsweise um ein Gerät handelt, das von einer Person verwendet werden soll, zählen Sie die Anzahl der Taktzyklen, bis diese Person den Startknopf drückt, und verwenden Sie diesen als zufälligen Startwert.
quelle
Um nicht mit derselben Sequenz neu zu starten, verwende ich somme byte im eeprom:
Dies gibt ziemlich gute Zufallszahlen und kostet nicht viel im Programm / Speicher.
quelle
Ich habe eine Bibliothek erstellt, die zwar ursprünglich für das Arduino entwickelt wurde, aber als Klasse in einer C ++ - Implementierung mit g ++ auf dem avr gut funktioniert, in der Tat wurde sie kürzlich auch auf die ARM-Architektur portiert.
Es nutzt den Jitter zwischen Watchdog-Timer und Systemuhr und wurde auf verschiedenen Chips getestet (auf der Wiki-Seite dokumentiert).
http://code.google.com/p/avr-hardware-random-number-generation/wiki/WikiAVRentropy
quelle
Hast du dir mal so etwas angeschaut randomSeed () beschäftigt ? - In der Arduino IDE verwendet
Mit dieser Funktion können Sie einen schwebenden (freien) analogen Pin am atmel AVR abtasten. Anschließend wird anhand des Werts ein beliebiger Startpunkt für das Pseudo erstellt - random () - erstellt.
Der mit random () erzeugte Wert kann eine Pseudozufallszahl sein - der mit randomSeed () erzeugte willkürliche Startpunkt sollte jedoch so real wie möglich sein.
quelle
Es gibt ein Papier darüber, wie dies mit AVR-Hardware erreicht werden kann. Dabei wird auf Clock Jitter zurückgegriffen. Grundsätzlich verwenden Sie einen Timer-Interrupt, der auf einer Taktquelle basiert, um die unteren Bits eines separaten Timers abzutasten, der von einer separaten unabhängigen Taktquelle getaktet wird. Mit den beiden Takten ist ein zufälliger Jitter verbunden, und die Abtastung ist nicht perfekt periodisch.
Ich habe auf einem STM32-Mikrocontroller einen kleinen Proof of Concept gemacht, Code ist hier auf Github . Basierend auf einer Reihe von Randomisierungstestsuiten wurden einige gute Ergebnisse erzielt.
Meiner Meinung nach ist dies besser, als einen schwebenden Pin mit einem ADC abzutasten, der extrem leicht anzugreifen ist (binde den Pin an den Boden und deine Zahl ist nicht mehr so zufällig!). Ich bin mir sicher, dass es eine Möglichkeit gibt, ein auf Clock-Jitter basierendes RNG zu manipulieren, aber ich fühle mich ein bisschen besser, wenn ich dies rein auf der Basis von internen Clock-Quellen auf dem Chip tun kann.
quelle