Entropiequelle auf Mikrochip PIC24F

7

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

Wenn es eine andere Möglichkeit gibt, eine Zufallszahl zu generieren, als eine Entropie-Methode, würde ich sie gerne von Ihnen hören!

Die Software, die ich benutze:

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

Das Gerät / die Werkzeuge, die ich benutze:

DM240415 - PIC24F Starter Kit für die Entwicklung von Zubehör für Android

Ezylryb
quelle
2
Was meinst du mit "der Wert ändert sich nicht"? Wie, es gibt nur 9 jedes Mal aus, wenn Sie es aufrufen?
Endolith
Beispiel, wenn ich einen Zufallsgenerator ausführe, um ein Array zufälliger Ganzzahlen zu generieren. Der Wert ist zu Beginn gleich, egal wie oft ich ihn ausführe. ZB Array [1] = 4; Array [2] = 49; Array [3] = 22; Array [4] = 91; Array [5] = 33; ...
Ezylryb
@ Esylryb - sieht aus wie ein schlecht gestaltetes PRNG. Ein PRNG erzeugt immer dieselbe Sequenz, aber normalerweise stützen sie sich auf ein wirklich zufälliges Ereignis, um zu bestimmen, wo in der Sequenz es beginnt. Dieses zufällige Ereignis wird häufig aus dem Zeitpunkt abgeleitet, zu dem eine Benutzeraktion stattfindet, beispielsweise wenn eine Taste gedrückt wird. Der Wert eines freilaufenden Timers kann dann als Startwert für das PRNG verwendet werden. Anscheinend beginnt Ihr PRNG immer mit dem gleichen Startwert.
Stevenvh
1
Bingo! Ich verwende einen zufälligen Wert in einer kryptografischen Anwendung, entwickle aber kein Glücksspielsystem. Bis zu einem gewissen Grad ja. Der Benutzer kann Schaden nehmen, wenn jemand in der Lage ist, die Zufallszahlen @Dr X
Ezylryb

Antworten:

12

"Jeder, der arithmetische Methoden zur Erzeugung zufälliger Ziffern in Betracht zieht, befindet sich natürlich in einem Zustand der Sünde." - - John Von Neumann

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

Generator für weißes Rauschen

Wenn Sie sich nicht dafür interessieren, dass 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. Falls erforderlich, kaskadieren Sie 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 zufälliger Bits von dieser Schaltung zu takten.
(Der SPI ist nur eine einfache Möglichkeit, 8 zufällige Bits automatisch zu erfassen. Er fügt keine Determinismusstufe hinzu: Die Eingabe ändert sich kontinuierlich und zufällig, und Sie wissen nie, wie sie bei der nächsten Taktflanke aussehen wird. Sie können auch eine lesen E / A-Pin und verschieben Sie den Pegel dieses Bits in Ihr Ergebnisbyte.)

Diese Schaltung ist eine mögliche alternative Lösung, die auch auf einer Zenerdiode als Rauschquelle beruht:

Zufallsbitschaltung

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

Um den Zufallszahlengenerator zu testen, können Sie die Normalität testen . Dies bedeutet, dass eine lange Folge von Zufallszahlen erstellt wird. Je länger, desto besser. Am besten transportieren Sie es zur Analyse auf den PC. Zähle die Ein-Bit-Sequenzen, das sind die 0s und 1s. Es sollte ungefähr die gleiche Anzahl von jedem 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 kann es bessere / einfachere Tests geben. Fühlen Sie sich frei, sie hinzuzufügen.


Pseudozufallszahlengenerator

stevenvh
quelle
Aufgrund der Einschränkung PIC24FJ256GB110 ist weißes Rauschen nur möglich, wenn ich zusätzliche Hardware hinzufüge. Sie erwähnen SPI, um Bytes von zufälligen Bits zu takten. Ist das wirklich eine Zufallszahl? oder es basiert auf einem Algorithmus, um die Zufallszahl
auszugeben
@ Esylryb - 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, dass das Testen auf Normalität in einer langen Sequenz ein guter Test sein könnte.
Stevenvh
1
@Ezylryb - Ohne die hier in beiden Schaltkreisen gezeigte zusätzliche Hardware generiert der SPI-Port keine wirklich zufälligen Zahlen. Ich bin mir nicht sicher, ob uns das klar war.
Kevin Vermeer
@ Kevin Vermeer Das SPI-Modul für Zufallszahlen basiert also auch auf einem mathematischen Algorithmus und ist nicht wirklich zufällig über Entropie. Hm .. Es scheint, dass es keine Möglichkeit gibt, auf PIC24FJ256GB110
Ezylryb
@Ezylryb - Das SPI-Modul hat sehr wenig mit der Erzeugung von Zufallszahlen zu tun. Es ist nur eine gute Möglichkeit, Daten von den oben beschriebenen Zufallszahlengeneratoren abzurufen. Sie können auch einen digitalen Eingang verwenden, um den Status des Ausgangs der oben genannten Schaltungen zu lesen.
Kevin Vermeer
4

Sie verwenden keinen PIC24FJ256GB110, der folgendermaßen aussieht:

TQFP-100, nicht unbedingt PIC24FJ256GB110

Sie verwenden ein Android Starter Kit:

Bild von Brett

Wie Sie verstehen, handelt es sich um eine ziemlich feste Leiterplatte: Sie entwerfen die Leiterplatte nicht, und ein kurzer Blick auf den Schaltplan ergab nicht viel, das für eine Hardware-Entropiequelle entwickelt wurde oder als Hardware-Entropiequelle verwendet werden könnte, mit Ausnahme einiger ADC-Spuren das könnte als Antenne funktionieren, wie von Matt vorgeschlagen .

Angenommen, Sie interagieren mit einem Android-Gerät, dann haben Sie drei mögliche Quellen für zufälliges Rauschen:

  1. Sie können die genauen Zeitpunkte der asynchronen Kommunikation oder der Kommunikation auf 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 erreicht werden kann und daher nicht für Sicherheitsanwendungen geeignet ist.
  2. Verwenden Sie die unteren Bits der ADC-Lesevorgänge, um zufälliges Rauschen zu erzeugen. Sie haben mehrere schwebende Spuren, 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, z. B. 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 schwierig 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 in ernsthafte Schwierigkeiten geraten.

Kevin Vermeer
quelle
3

Das Problem bei Pseudozufallszahlengeneratoren ist, dass dies nicht der Fall ist. Sie erzeugen eine Folge von Zahlen von einem bekannten Ausgangspunkt aus. Dies ist normalerweise zufällig genug für die meisten Anwendungen auf niedriger Ebene, jedoch nicht, wenn Sie sicherheitsbewusst sind oder möchten, dass mehr als ein System ohne Kollisionen interagiert (z. B. Netzwerk).

Also ja, wie Sie zu Recht sagen, möchten Sie eine Entropiequelle. Dies kann verwendet werden, um den 'Startwert' des Zufallszahlengenerators auf einen unbekannten Wert zu setzen. Da nur der Startwert gesetzt wird und die Zufallszahlen nicht tatsächlich generiert werden, muss die Entropie nur einmal verwendet werden, sodass sie in Bezug auf Taktzyklen ziemlich "schwer" sein kann. Es kann beim Systemstart einmal ausgeführt werden und sollte von da an nie wieder ausgeführt werden müssen.

Die meiste Entropie wird aus 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 dem vielleicht ein bisschen Spur verbunden ist, um als Antenne zu fungieren. Dies sollte ziemlich zufällig zwischen Werten wechseln, mit denen Sie einen numerischen Wert in der richtigen Reihenfolge erstellen können, um Ihren Pseudozufallszahlengenerator zu setzen.

Eine andere Idee könnte darin bestehen, eine Art Wandler an diesen Eingang anzuschließen, damit er zuverlässig "Rauschen" sammelt, das als Entropiequelle verwendet werden soll. Das kann alles sein, von einem einfachen Mikrofon und einem Operationsverstärker bis zu ein paar Operationsverstärkern, die miteinander verbunden sind, um eine enorme Verstärkung und damit einen Ausgang mit weißem Rauschen zu erzielen. Es gibt eine beliebige Anzahl möglicher Geräuschquellen in einem Stromkreis, je nachdem, was Ihnen in Bezug auf Board-Immobilien und Budget zur Verfügung steht.

Majenko
quelle
2
Ich habe den Eindruck, dass eine gute Entropiequelle (Sicherheitsstufe) nicht so einfach ist. OTOH für Netzwerkprotokolle und andere gelegentliche Anwendungen Ihre analogen Lösungen werden wahrscheinlich gut genug sein.
JPC
1
Ja, aus Sicherheitsgründen würde ich definitiv einen externen Chip zur Erzeugung von Sicherheitsentropie oder eine CPU mit integrierter Entropie und SHA (zum Beispiel) verwenden.
Majenko
Ist es beim PIC24F256GB110 möglich, eine wirklich zufällige Entropiequelle ohne zusätzliches Hardware-Add-On zu haben?
Ezylryb
@ Esylryb las den 3. Absatz
Kellenjb
@Majenko: Die Antennenidee ist in der Praxis nicht gut; es wird wahrscheinlich meistens hoch oder niedrig bleiben.
Brian Carlton