Zufallszahlengeneratoren mit einem GPIO-Pin?

22

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?

Vorac
quelle
1
Sichere AVR ist tot AFAIK
vicatcu
1
Ist ungeschriebenes EEPROM nicht immer 0xFF?
vsz
@vsz, vielleicht ist es jetzt "zufällig", wenn du etwas darauf schreibst und vergisst, was du geschrieben hast. lol.
Vorac

Antworten:

5

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

Dave Tweed
quelle
15

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.

Anindo Ghosh
quelle
14

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
Nicht nur wird es auf 0 oder 1 einen Teil der Zeit stecken, aber es sei denn , die beiden Transistoren, die die erste Stufe des Eingangs bilden Puffer sind PERFEKT ausgewogen, oder es gibt einige externe Stromquelle auf eine oder andere Weise, der Eingang wird schweben bis zu einer 1 oder bis zu einer 0 schließlich.
WJL
9

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.

chris
quelle
Interessant. Wie sieht eine "missbrauchte Open-Collector-Transistorschaltung" aus?
Stephen Collings
7
@Remiel - Sie spannen den Basis-Emitter-Übergang eines Transistors in Sperrrichtung und er wirkt wie ein wirklich beschissener Zener. Sie nehmen den sehr lauten Zener und verstärken das Rauschen, um einen zufälligen Bitstrom zu erhalten. Siehe robseward.com/misc/RNG2
Connor Wolf
3

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.

Gustavo Litovsky
quelle
Das ist der Ansatz in der msp430 App Notiz in der referenzierten Vorfrage genommen, mein Wissen AVR Taktsystem nicht über diese Technik unterstützen
vicatcu
Richtig. Es sollte weiterhin möglich sein, dies mit derselben Taktquelle zu tun, auch wenn dies nicht direkt unterstützt wird.
Gustavo Litovsky
3

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.

Tony Stewart Sunnyskyguy EE75
quelle
0

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.

portreathbeach
quelle