Entropiequelle auf Microchip PIC24F

Ich arbeite an der Entwicklung einer Android-Zubehörhardware. Derzeit versuche ich, eine Zufallszahl (C-Sprache) auf einem eingebetteten System zu generieren, aber der Wert ändert sich nicht. Ich frage mich, ob es eine Entropiequelle gibt, die ich zum Generieren von Zufallszahlen verwenden kann.

Wenn es eine andere Möglichkeit gibt, Zufallszahlen zu erzeugen, als die Verwendung einer Entropiemethode, würde ich es sehr gerne von Ihnen hören!

Die von mir verwendete Software:

MPLAB IDE Version 8.73 MPLAB C Compiler für PIC24 und dsPIC v3.30

Die Geräte/Tools, die ich verwende:

DM240415 - PIC24F-Zubehörentwicklungs-Starterkit für Android

Was meinst du mit "der Wert ändert sich nicht"? Zum Beispiel gibt es jedes Mal, wenn Sie es aufrufen, nur 9 aus?
Beispiel, wenn ich einen Zufallsgenerator ausführe, um ein Array zufälliger Ganzzahlen zu generieren. Der Wert ist am Anfang gleich, egal wie oft ich ihn starte. ZB Array[1] = 4; Array[2] = 49; Array[3] = 22; Array[4] = 91; Array[5] = 33; ...
@Ezylryb - sieht aus wie ein schlecht gestaltetes PRNG. Ein PRNG erzeugt immer dieselbe Sequenz, aber normalerweise verlassen sie sich auf ein wirklich zufälliges Ereignis, um zu bestimmen, wo in der Sequenz es beginnt. Dieses zufällige Ereignis wird häufig von der Zeit abgeleitet, zu der eine Benutzeraktion stattfindet, z. B. wenn eine Schaltfläche gedrückt wird. Der Wert eines freilaufenden Timers kann dann als Seed für den PRNG verwendet werden. Anscheinend beginnt Ihr PRNG immer mit demselben Startwert.
Verwenden Sie die Zufallswerte in einer kryptografischen Anwendung? Verwenden Sie die Zufallswerte in einem Glücksspielsystem? Mit anderen Worten, würde das Produkt versagen und/oder dem Benutzer ein ernsthafter Schaden entstehen, wenn jemand die Zufallszahlen kennt/vorhersagen kann?
Bingo! Ich verwende einen zufälligen Wert in einer kryptografischen Anwendung, aber ich entwickle kein Glücksspielsystem. Bis zu einem gewissen Grad, ja. Der Benutzer kann Schaden nehmen, wenn jemand in der Lage ist, die Zufallszahlen @Dr X vorherzusagen
In diesem Fall müssen Sie besonders auf die Eigenschaften Ihres RNG achten. Die gute Nachricht ist, dass Sie in Software viel tun können. Ein guter Ausgangspunkt ist en.wikipedia.org/wiki/Hardware_random_number_generator , beachten Sie insbesondere die Abschnitte „Umgang mit Voreingenommenheit“ und „Probleme“.

Antworten (3)

„Jeder, der arithmetische Methoden zur Erzeugung von Zufallsziffern in Betracht zieht, ist natürlich in einem Zustand der Sünde“ Johann von Neumann

Eine gute Rauschquelle ist das Durchbruchrauschen einer Zenerdiode. Das einfache Schema unten zeigt, wie man weißes Rauschen von einem Zener erhält, indem man zwei LNAs (Low Noise Amplifiers) kaskadiert, um den Rauschpegel zu erhöhen.

Generator für weißes Rauschen

Wenn es Ihnen egal ist, ob das Rauschen weiß ist, können Sie einfach einen Operationsverstärker mit hoher Verstärkung verwenden, dem ein Komparator folgt. Die Verstärkung des Operationsverstärkers begrenzt die Bandbreite und damit die Änderungsrate Ihres digitalen Signals. Kaskadieren Sie bei Bedarf zwei Operationsverstärker wie die LNAs im angegebenen Schema, um einen schnelleren zufälligen Bitstrom zu erhalten.

Sie können das SPI-Modul verwenden, um Bytes mit zufälligen Bits von dieser Schaltung einzutakten.
(Die SPI ist nur eine einfache Möglichkeit, automatisch 8 zufällige Bits zu sammeln, sie fügt keinerlei Determinismus hinzu: Die Eingabe ändert sich kontinuierlich und zufällig und Sie wissen nie, was sie bei der nächsten Taktflanke sein wird. Sie können auch eine lesen I/O-Pin und verschieben Sie den Pegel dieses Bits in Ihr Ergebnisbyte.)

Diese Schaltung ist eine mögliche alternative Lösung, die sich ebenfalls auf eine Zenerdiode als Rauschquelle stützt:

zufällige Bitschaltung

Der Schaltplan erwähnt den OPA2340 für den Verstärker, ist aber für den Komparator nicht klar. Obwohl der OPA2340 ziemlich schnell ist, würde ich vorschlagen, hier einen echten Komparator zu verwenden , da diese normalerweise viel schneller sind als Operationsverstärker. Beispielsweise hat der TL3016 eine Ausbreitungsverzögerung von weniger als 10 ns und eine typische Anstiegszeit von 0,5 ns. Das bedeutet, dass Sie Zufallswerte schneller abtasten können, ohne das Risiko einer Kohärenz zwischen aufeinanderfolgenden Abtastungen.

Um den Zufallszahlengenerator zu testen, können Sie auf Normalität testen . Das bedeutet, eine lange Folge von Zufallszahlen zu erstellen, je länger desto besser. Am besten transportieren Sie es für die Analyse zum PC. Zählen Sie die Ein-Bit-Folgen, das sind die 0s und 1s. Es sollten jeweils ungefähr die gleiche Anzahl vorhanden sein. Nächste Wiederholung für Zwei-Bit-Sequenzen. Es sollte so viele 00s wie 01s, 10s und 11s geben. Wiederholen Sie dies für Drei-Bit-Sequenzen usw.
Ich bin kein Statistiker, daher gibt es möglicherweise bessere / einfachere Tests. Fühlen Sie sich frei, sie hinzuzufügen.


Pseudozufallszahlengenerator

Aufgrund der PIC24FJ256GB110-Beschränkung ist weißes Rauschen unmöglich, es sei denn, ich füge eine zusätzliche Hardware hinzu. Sie erwähnen SPI, um Bytes mit zufälligen Bits zu takten. Ist das wirklich eine Zufallszahl?? oder es basiert auf einem Algorithmus zur Ausgabe der Zufallszahl
@Ezylryb - das sollte dir eine gute Zufallszahl geben. Stellen Sie einfach sicher, dass in einem SPI-Taktzyklus genügend Pegelübergänge vorhanden sind. Um die Zufälligkeit zu testen, können Sie statistische Tests durchführen. Ich bin kein Experte, aber ich denke, das Testen auf Normalität bei einer langen Sequenz könnte ein guter Test sein.
@Ezylryb - Ohne die zusätzliche Hardware, die hier in beiden Schaltungen gezeigt wird, generiert der SPI-Port keine echten Zufallszahlen. Ich bin mir nicht sicher, ob uns das klar war.
@Kevin Vermeer Das SPI-Modul der Zufallszahl basiert also auch auf einem mathematischen Algorithmus und nicht wirklich zufällig über Entropie. Hm .. Es scheint, dass es auf PIC24FJ256GB110 keine Möglichkeit gibt, wirklich zufällig zu generieren
@Ezylryb - Das SPI-Modul hat sehr wenig mit der Generierung von Zufallszahlen zu tun, es ist nur eine nette Möglichkeit, Daten von den oben beschriebenen Zufallszahlengeneratoren zu erhalten. Sie können auch einen digitalen Eingang verwenden, um den Zustand des Ausgangs der obigen Schaltungen zu lesen.
Es scheint, dass es keine Möglichkeit gibt, echte Zufallszahlen nur auf dem Mikrocontroller zu erzeugen, ja. Es ist jedoch sehr ungewöhnlich, nur auf den IC beschränkt zu sein; Der PIC24 (und Sie können ihn so nennen, ohne dass Sie FJ256GB110 angeben müssen) kann ohne zusätzliche Hardware überhaupt nicht viel. Oh warte - ich bin dem Link zum IC gefolgt, du verwendest ein Starter-Kit! Jetzt macht es Sinn.
Ausgezeichnete Verwendung des Dilbert-Comics. Ich denke, das ist ein automatisches +1, genau wie XKCD ein automatisches +1 auf MSO ist.
Ich mag das Zitat von „John von Neumann“ (es ging mir drei Tage lang durch den Kopf!). Ursprünglich dachte ich daran, eine Zufallszahl über einen sehr komplexen mathematischen Algorithmus zu erstellen, um sicher zu sein. Aber in dem Moment, als ich das Zitat gesehen habe, habe ich einfach . . .

Sie verwenden keinen PIC24FJ256GB110, der so aussieht:

TQFP-100, nicht unbedingt PIC24FJ256GB110

Sie verwenden ein Android Starter Kit:

Bild von Bord

die, wie Sie verstehen, eine ziemlich feste Leiterplatte ist: Sie entwerfen die Leiterplatte nicht, und ein kurzer Blick auf den Schaltplan ergab nicht viel, was als Hardware-Entropiequelle gebaut wurde oder als Hardware-Entropiequelle umfunktioniert werden könnte, außer einigen ADC-Spuren die als Antennen fungieren könnten, wie von Matt vorgeschlagen .

Angenommen, Sie interagieren mit einem Android-Gerät, haben Sie jedoch drei potenzielle Quellen für zufälliges Rauschen:

  1. Sie könnten die genauen Zeitpunkte der asynchronen Kommunikation oder der Kommunikation auf dem Android messen und die unteren Bits dieser Messung als Entropiequelle verwenden. Beachten Sie natürlich, dass dies durch präzise Steuerung des Android-Geräts gespielt werden könnte und daher nicht für Sicherheitsanwendungen geeignet ist.
  2. Verwenden Sie die unteren Bits von ADC-Lesevorgängen, um zufälliges Rauschen zu erzeugen. Sie haben mehrere Floating-Traces, daher sollte dies zu unvorhersehbaren Ergebnissen führen.
  3. Sie haben Breakout-Header zu einem Arduino-Schild! Dies bedeutet, dass Sie alle Arten von Hardware hinzufügen können, wie die von Steven vorgeschlagenen Lösungen , dieses Schild oder die in dieser Frage vorgeschlagenen . Ja, hierfür ist externe Hardware erforderlich.

Beachten Sie jedoch, dass kryptografische Sicherheit und echte Zufälligkeit schwierige Dinge sind. Es hört sich so an, als müssten Sie noch etwas lesen, bevor Sie versuchen, etwas zu produzieren, auf das sich die Leute verlassen können, oder Sie könnten sich in ernsthafte Schwierigkeiten bringen.

Das Problem mit Pseudozufallszahlengeneratoren ist, dass sie es nicht sind. Sie erzeugen eine Zahlenfolge von einem bekannten Startpunkt aus. Dies ist normalerweise für die meisten Anwendungen auf niedriger Ebene zufällig genug, aber nicht, wenn Sie sicherheitsbewusst sind oder möchten, dass mehr als ein System ohne Kollisionen interagiert (z. B. Netzwerke).

Also ja, wie Sie richtig sagen, Sie wollen eine Entropiequelle. Dies kann verwendet werden, um den 'Seed' des Zufallszahlengenerators auf einen unbekannten Wert zu setzen. Da nur der Seed gesetzt und die Zufallszahlen nicht wirklich generiert werden, muss die Entropie nur einmal wirklich verwendet werden, kann also in Bezug auf Taktzyklen ziemlich "schwer" sein. Es kann einmal beim Systemstart ausgeführt werden und sollte von da an nie wieder ausgeführt werden müssen.

Die meiste Entropie wird von Interrupts und anderen externen Quellen gesammelt (geerntet?). Meine erste Idee, die mir in den Sinn kommt, wäre, einen Eingang schwebend zu lassen (vielleicht einen analogen?) mit vielleicht einem Stückchen damit verbundener Spur, um als Antenne zu fungieren. Dies sollte ziemlich zufällig zwischen Werten wechseln, die Sie verwenden können, um einen numerischen Wert in der richtigen Reihenfolge zu erstellen, um Ihren Pseudozufallszahlengenerator zu starten.

Eine andere Idee könnte darin bestehen, eine Art Wandler an diesen Eingang anzuschließen, damit er zuverlässig "Rauschen" sammeln kann, das als Ihre Entropiequelle verwendet werden kann. Das kann alles sein, von einem einfachen Mikrofon und Operationsverstärker bis hin zu ein paar Operationsverstärkern, die miteinander verbunden sind, um eine enorme Verstärkung und damit eine Ausgabe mit weißem Rauschen zu erzielen. Es gibt eine beliebige Anzahl möglicher Rauschquellen in einer Schaltung, je nachdem, was Sie an Platinenplatz und Budget zur Verfügung haben.

Ich habe den Eindruck, dass eine gute (Sicherheits-) Entropiequelle nicht so einfach ist. OTOH für Netzwerkprotokolle und andere Gelegenheitsanwendungen werden Ihre analogen Lösungen wahrscheinlich gut genug sein.
Ja, aus Sicherheitsgründen würde ich definitiv einen externen Sicherheits-Entropie-Generierungschip oder eine CPU mit eingebauter Entropie und SHA (zum Beispiel) verwenden.
Ist es auf dem PIC24F256GB110 möglich, eine wirklich zufällige Entropiequelle ohne zusätzliches Hardware-Add-On zu haben?
@Ezylryb lies den 3. Absatz
@Majenko: Die Antennenidee ist in der Praxis nicht gut; es wird wahrscheinlich meistens hoch oder niedrig bleiben.