Ich habe gerade die Frage AVR Random Number Generator durchgelesen und bin auf eine Reihe von Möglichkeiten gestoßen, um Zufallssamen in einem AVR zu generieren:
- Verwenden Sie einen speziellen "Secure AVR"
- Verwenden Sie einen internen Temperatursensor
- Lese ungeschriebenes EEPROM
- Zeitintervalle zwischen Benutzereingaben messen
- Verwenden Sie einen potentialfreien ADC-Pin.
Warum nicht einfach einen einzelnen digitalen Pin, der als Eingang ohne Pull-up und Floating konfiguriert ist? Theoretisch sollte das einen Strom von zufälligen Bits erzeugen. Warum nicht nutzen? Ändert sich der Zustand zu langsam? Neigt es dazu, bei 1 oder 0 zu stecken? Irgendwelche anderen Probleme?
Antworten:
"Random" ist ein kniffliges Wort. In einigen Kontexten bedeutet es einfach "unvorhersehbar", in anderen Kontexten - insbesondere in Bezug auf Signalverarbeitung und Kryptographie - bedeutet es "statistisch nicht korreliert".
Selbst wenn der von einem potentialfreien Stift gelesene Wert nicht vorhersehbar ist ("zufällig" im ersten Sinne), ist es unwahrscheinlich, dass er im zweiten Sinne nützlich ist.
quelle
Der offensichtliche Unterschied zwischen der Verwendung eines digitalen und eines analogen Eingangs besteht darin, dass bei analogen Eingängen eine größere Spanne von Startwerten möglich ist.
Zweitens, aber vielleicht entscheidender: Wenn der gleitende "Median" -Wert des digitalen Pins nicht genau in der Mitte zwischen den logischen Erfassungspegeln liegt (die nicht die Leistungs- und Erdungsschienenpegel sind, sondern die Schaltschwellen für die Eingangsschaltung), hat der resultierende Bitstrom a starke Verzerrung gegen 1 oder 0. Diese Verzerrung verzerrt die Samen viel stärker als eine Verzerrung bei analogen Pegeln.
Es würde sehr wenig Kopplung erfordern, entweder durch nahegelegene Spuren oder Signale, oder durch ein Widerstands-Pull-Up / Pull-Down-Verfahren, ob geplant oder versehentlich, um einen "schwebenden" digitalen Stift auf freiem Fuß zu setzen - und das könnte auch nachher passieren. Einsatz. In der Konstruktion wird diese Form des Fehlermodus am besten vermieden.
quelle
Ein schwebender Eingang ist undefiniert. Es könnte Ihnen zufällige Bits geben, aber es könnte auch dazu neigen, bei einer 0 oder 1 hängen zu bleiben. Die meiste Zeit bleibt es hängen. Und wenn es wirklich schwebend ist, kann es zu erhöhten Systemgeräuschen und einem erhöhten Stromverbrauch führen. Floating-Eingänge sind im Allgemeinen eine schlechte Sache, auch wenn die Eingänge für nichts verwendet werden.
quelle
Die einfachste Lösung besteht darin, eine Hardware-Zufallssignal-Generatorschaltung aus einer missbrauchten Open-Collector-Transistorschaltung aufzubauen. Verwenden Sie den Bitstrom-Ausgang zu einem Eingang des Mikrocontrollers. Abtastung der eingehenden Bits in Intervallen. Um eine annähernd gerade Anzahl von Einsen und Nullen zu gewährleisten, verwenden Sie einfach die Zustandsänderung als 1 und keine Änderung als Null. Google für Transistorrauschgenerator für weitere Informationen.
quelle
Ein Zufallsgenerator, der in vielen Mikrocontrollern verfügbar ist, ist der Fehler zwischen zwei Taktquellen (möglicherweise einer internen und einer anderen externen). Wenn Sie sie vergleichen, driften sie leicht aufgrund von Rauschen und das kann verwendet werden.
Am Ende kommt es darauf an, wofür Sie es brauchen? Ein bisschen Randomisierung und Sie können sogar einen ADC-Pin verwenden, der mit nichts verbunden ist. Oder verwenden Sie einfach einen Algorithmus wie
Mersenne Twister http://de.wikipedia.org/wiki/Mersenne_twister
Keine, wenn dies zwar kryptografisch sicher ist, aber für die meisten Zwecke gut genug.
quelle
Die Qualität eines Zufallskeims und seines Algorithmus wird durch den Betrag der Entropie oder der Unsicherheit in jedem Zufallsbit bestimmt. Dann verwendet der beste Generator eines Samens eine hohe Entropie mit sehr wenigen Schritten anstelle vieler Schritte mit niedriger Entropie.
Ein gutes Beispiel für eine hohe Entropie ist die Latin-Squares- Methode für einen zufälligen Samen.
Der potentialfreie Eingang kann leicht durch Fehler, Leckagen oder Eingangsgeräusche vorgespannt werden.
quelle
In einem PIC18F-Mikroprozessor müssen Sie einen Startwert für die Zufallszahl haben. Der Startwert kann zwischen 0 und 32767 (15 Bit) liegen. Ich würde vorschlagen, dass Sie zu Beginn des Programms einen der Stifte und den analogen Eingangsstift herstellen. Lesen Sie diesen Pin und nehmen Sie das niedrigstwertige Bit und setzen Sie es in eine 16-Bit-Variable. Verschieben Sie dann die Variable um 1 nach links. Lesen Sie den Pin erneut und setzen Sie das LSB des ADC-Ergebnisses in das erste Bit der Variablen, in der Sie das letzte Bit gespeichert haben. Verschieben Sie erneut nach links.
Wiederholen Sie diesen Vorgang, bis Sie 15 Bits in Ihrer Variablen haben. Dies ist die Zahl, die Sie in Ihren Samen setzen müssen.
Nachdem Sie dies getan haben, können Sie einfach den analogen Eingangspin zu einem digitalen Eingangspin machen und einen schwachen Pullup aktivieren oder ihn zu einem digitalen Ausgangspin machen. Entweder verhindert man, dass dieser Pin schwebt.
quelle