2013-03-22 17 views
6

Ich arbeite an dem STM32L152xx, der ein Peripheriegerät für die AES128 (CBC) -Verschlüsselung hat. Um jedoch eine zufällige IV zu initialisieren, suche ich nach einem guten Schema, um eine kryptografisch sichere Zufallszahlenfolge zu erzeugen. Ich benutze einen einfachen LCRG (linear congruential generator) als Platzhalter für jetzt, aber das ist schwach.Kryptographischer Pseudozufallszahlengenerator im eingebetteten System?

Ich bin neu bei der Implementierung von Verschlüsselung auf einer eingebetteten Plattform, also frage ich mich, was ist die übliche Praxis da draußen, um kryptographische PRNG zu erzeugen? Oder was ist eine gute Strategie für die Wahl des Schlüssels und der IV?

Die meisten Antworten zu StackOverflow für kryptografisches PRNG beziehen sich auf die Bibliothek von Drittanbietern, die auf dieser Plattform nicht verfügbar ist. Wenn es sich jedoch lohnt, kann ich versuchen, es zu portieren. Links und Hinweise zu Ressourcen wären auch hilfreich!

Ich habe Zugriff auf die Systemuhr und Beschleunigungsmesser an Bord. Ich betreibe FreeRTOS. Vielen Dank!

+0

Laufen Sie unter Windows, Linux oder einem benutzerdefinierten geschriebenen Betriebssystem? Wenn es benutzerdefiniert ist, wer hat es geschrieben, und haben sie irgendwelche APIs, um kryptografische Variablen zu bekommen? – SecurityMatt

+0

Ich würde eine bereits vorhandene Bibliothek empfehlen, aber wenn Sie unbedingt Ihre eigenen rollen müssen, FIPS 186-2 Change Notice 1 (Abschnitt: ** Überarbeiteter Algorithmus für Computing m Werte von x ** und ** Allgemeine Zufallszahlenerzeugung **) ist einfach zu implementieren. Sie müssen es immer noch mit einem PRNG mit guter Entropie einsetzen, und Sie benötigen eine Bignum-Bibliothek und SHA-Implementierung. – indiv

+0

Danke. Ich betreibe FreeRTOS. – tll

Antwort

9

Sie werden wahrscheinlich "Cryptographic Secure" oder Ihre Anwendung ein wenig besser definieren müssen. Wenn dies für ein Spiel auf einem Mobiltelefon wäre, könnten Sie wahrscheinlich den Beschleunigungsmesser als eine Quelle der Zufälligkeit verwenden. Wenn Sie versuchen, x.509-Zertifikate zu signieren, könnten Sie eine angeschlossene Hardware in Erwägung ziehen, die den radioaktiven Zerfall misst.

In allen Ernstes, abhängig von der Stärke der „Zufälligkeit“, die Sie beachten müssen, die folgenden:

  1. Die aktuelle 32-Bit-Wert einer Uhr, die jeden Nanosekunde (Zeitraum von ca. 4 Sekunden tickt - Wahrscheinlich "Zufällig" genug, je nachdem, wie oft Sie Samen brauchen. Sie müssen sicherstellen, dass Sie diesen Wert nicht deterministisch erfassen. Wenn Sie es greifen, wenn es auf Benutzereingaben basiert, dann ist es wahrscheinlich in Ordnung.
  2. An Avalanche Noise Generator in einen Schmitt-Trigger-Eingang eingespeist.
  3. Das exklusive OR aller Achsen von Ihnen sind Beschleunigungsmesser (Kann nicht gut sein, wenn das Ding immer noch sitzt, es sei denn es nimmt Vibrationen in seiner normalen Anwendung auf). Wenn das für ein Radio ist, das herumgetragen wird, dann ist das wahrscheinlich in Ordnung.
  4. Der Wert eines großen Stücks nicht initialisierten Speichers (Sie möchten ihn wahrscheinlich hashen, weil große Teile nicht initialisierten Speichers ähnliche Werte vom Einschalten bis zum Einschalten enthalten können). Wenn Ihr Gerät nicht vollständig ausgeschaltet wird, ist das wahrscheinlich nicht gut.
  5. Einige Kombination von einem oder mehreren der oben genannten (Exclusive OR ist wahrscheinlich der einfachste Weg, um zwei der oben genannten Ausgaben zu kombinieren)
  6. Comedy Option: A CCD Camera pointed at a lava lamp

Jede der oben genannten Methoden haben müssen eine Art von de-bias Algorithmus auf sie angewendet. Am einfachsten ist es, wenn Sie Ihre Eingabe jeweils 2 Bits lang betrachten. Wenn die 2 Bits gleich sind, verwerfen Sie sie. 0b10 wird 1 und 0b01 wird 0. Das wird sicherstellen, dass Sie mehr oder weniger die gleiche Anzahl von 1s und 0s in Ihrem endgültigen zufälligen Wert bekommen.

Schließlich, wenn dies für etwas ernst ist, sollten Sie alle oben genannten Ratschläge missachten und Ihren eigenen CRYPTO NICHT ROLLEN. Finden Sie eine API für Ihre Plattform, die bereits überprüft wurde und verwenden Sie diese. Es ist sehr schwierig, einen Algorithmus auf Zufälligkeit zu testen.

Vielleicht die F‑2 series of the STM32 core betrachten, die offenbar eine Hardware

+2

Ich wünschte, ich könnte noch einmal +1 für die Comedy-Option geben. "Malicious Cryptography: Exposed Cryptovirology" hat einen "Caveman key generation algorithm"; "Eine ausfallsichere Möglichkeit, einen öffentlichen Schlüssel zu generieren und zu zertifizieren, ohne sich um Hintertüren kümmern zu müssen": Klettern Sie in die tiefste Spalte der Erdkruste, stellen Sie sicher, dass Ihnen niemand nach unten folgt, werfen Sie eine Münze und führen Sie Neumann auf Ergebnisse, um unvoreingenommene Münzwürfe zu erzeugen, einen Bleistift zu verwenden, um den resultierenden privaten Schlüssel aufzuschreiben, den öffentlichen Schlüssel auf Papier zu berechnen, das Schlüsselpaar zu merken, Papier, Bleistift und Taschenlampe zu verbrennen ... " – Sebivor

+0

@Pete Baughman: Danke! Die Anwendung hat mit der Gewährleistung der Sicherheit für die Kommunikation über Funk zwischen zwei Geräten zu tun, aber ich muss keine X.509-Zertifikate signieren und da der Formfaktor eher klein ist, ist es besser, mit vorhandener Hardware zu gehen. De-Beeinflussung kam mir nicht in den Sinn und es ist ein guter Ratschlag. Ich denke, dass 1 und 3 für mich jetzt die erste Wahl sein würden. Ich habe mir auch die F-2-Serie angeschaut und das könnte eine Möglichkeit sein. – tll

+0

@TrungLe x.509 "Ding war mehr ein Beispiel für eine "Serious" -Anwendung. Es sollte wirklich sagen "Betrachte die Konsequenzen, wenn das nicht zufällig genug ist". Wenn die Antwort lautet: "Die Leute könnten verletzt werden" oder "Millionen von Dollar könnten verloren gehen", dann müssen Sie besonders darauf achten, Ihre Entropiequelle zu validieren. –

3

Pete Braughman Antwort RNG enthält bedeckt, was eine gute Antwort auf diese Frage sollte: unbiasing und schwache Quellen der Entropie zu kombinieren. Ich wäre ein bisschen zögerlich, um nicht initialisiertes Gedächtnis zu verwenden. Ich kann mir Szenarien vorstellen, in denen ein System, das auf der Annahme basiert, dass nicht initialisierter Speicher zuvor nicht von einem böswilligen Benutzer verwendet wurde, möglicherweise kompromittiert wird. Ansonsten kann ich nicht sehr widersprechen.

Im Interesse, Ihnen Zeit zu sparen, ein möglicherweise bereits erfinderisches Rad neu zu erfinden, würde mein Vorschlag sein, einen kurzen Blick auf cryptlib zu nehmen, vorausgesetzt, Sie haben nicht bereits getan; "cryptlibs hochgradig portierbare Art bedeutet, dass es auch in einer Vielzahl von benutzerdefinierten Embedded-Systemumgebungen wie AMX, ChorusOS, eCos, FreeRTOS/OpenRTOS, uITRON, MQX, PalmOS, RTEMS, ThreadX, T-Kernel, uC/OS II verwendet wird , VDK, VxWorks und XMK. "Diese Bibliothek wird wahrscheinlich die meiste Arbeit für Sie übernehmen; Angenommen, es ist möglich, cryptilib zu verwenden, müssen Sie es nur mit zufälligen Informationen (aus mehreren Quellen) füttern: "Die zufällige Daten sammeln Operation wird gesteuert mit der 0 cryptAddRandom-Funktion , die verwendet werden kann, um entweder Ihre eigenen zufügen Informationen in die internen Zufälligkeit Pool oder cryptlib zu sagen, das System für Zufallsinformationen abzufragen. "

+0

Danke! Dies ist ein großartiger Zeiger und ich habe diese Lib nicht näher betrachtet. Ich habe zu meinem Post hinzugefügt, dass ich FreeRTOS verwende – tll

0

ich weiß, dass dies eine ziemlich alte Frage, aber da niemand noch kryptografisch sicheren PRNG erwähnt, ich dachte, ich würde "Kryptografisch sichere" IVs und Schlüssel sollen unter Verwendung von Krypto-PRNG erzeugt werden, z HMAC_DRBG or CTR_DRBG. Ersteres basiert auf HMAC, letzteres basiert auf AES in CTR mode. Diese zwei PRNGs sind in PolarSSL, which also runs on FreeRTOS verfügbar. Achten Sie darauf, DUAL_EC_DRBG NICHT zu verwenden, dies ist backdoored by the NSA und darf nie mehr benutzt werden.

Am wichtigsten ist, dass Sie eine Entropiequelle benötigen, um diese PRNGs zu erzeugen. Leider ist dies der schwierige Teil bei Embedded-Geräten. Sie können einige Ideen in this blog finden, z.B. Nehmen Sie den ADC-Ausgang.

Speziell bei IVs ist ein weiteres wichtiges Kriterium, dass es unvorhersehbar sein sollte. Das heißt, es sollte keinen systematischen Weg für einen Angreifer geben, um die IV des nächsten Chiffretextes angesichts des aktuellen Chiffretextes vorherzusagen. Dies ist zu vermeiden, BEAST-like attack on TLS 1.0.

Schließlich, für diese Art von Fragen, hätten Sie eine bessere Chance, hervorragende Antworten auf crypto.stackexchange.com zu bekommen.

Verwandte Themen