2016-04-30 5 views
3

Ich schreibe einen Dienst, wo ein deterministischer RNG über mehrere Plattformen hinweg benötigt wird, die keine Codebasis teilen (außer vielleicht C). Die Zufallszahlen müssen genau 128 Bit lang sein. Ist es in Ordnung, wenn ich eine vordefinierte echte Zufallszahl verwende, wenn ich AES verwende, um eine Folge von Zufallszahlen zu erzeugen? Wie es funktionieren würde, ist, ich würde den Samen verschlüsseln die erste Zufallszahl zu bekommen, Verschlüsseln der ersten Zufallszahl, die zweite zu bekommen, usw.AES als tragbaren RNG mit einem wirklich zufälligen Seed verwenden?

Grundsätzlich gilt:

rand[0] = truly_random_number; 
rand[1] = AES(truly_random_number); 
rand[2] = AES(AES(truly_random_number)); 
rand[n] = AES(AES(AES...AES(truly_random_number...))) //n times 

Ein Argument hier AES ist als die definierte Klartext immer nur Nullen.

Die Clients teilen ihre Sequenznummer, wenn sie kommunizieren, daher sollte es für jede von ihnen möglich sein, das benötigte Ergebnis deterministisch zu rekonstruieren.

Ist dies eine ordnungsgemäße Verwendung von AES? Kann ich etwas schneller dafür verwenden, wie SHA-256 und das Ergebnis abschneiden? Sollte ich nur eine C-Implementierung einiger RNG finden und diese stattdessen verwenden? Ich stehe auf AES, weil die Plattformen, auf die ich abziele, AES-Beschleuniger haben, also sollte die Geschwindigkeit kein großes Problem darstellen.

+0

Es ist nicht garantiert, dass die PRNG für alle Clients gleich ist. Um sicherzustellen, dass ich einen solchen PRNG habe, müsste ich einen guten in C. finden und implementieren. Für AES, die nur ein Argument oben verwenden, sei angenommen, dass das Argument immer 0 oder nur eine gegebene Konstante ist. – Ermir

+0

Sie könnten auch 'rand [0] = AES (wahrheitsgetreue_Zufallszahl, 0); rand [1] = AES (true_random_number, 1); usw. – immibis

+2

Wenn Sie fragen möchten, ob dieses Schema ein CSDVNG ist, dann ist [crypto.se] viel besser geeignet als Stack Overflow. –

Antwort

1

Ich würde dies als einen Hack bestenfalls betrachten.

AES ist ein Verschlüsselungsalgorithmus, kein Algorithmus zur Generierung von Zufallszahlen. Ich würde nicht erwarten, AES immer und immer wieder anzuwenden, um eine anständige Zufälligkeit zu erzeugen.

Sie erwähnen, dass Sie über die Leistung besorgt sind und AES-Hardware verwenden möchten. Der Grund für die AES-Hardwarebeschleunigung ist, dass AES ziemlich kompliziert ist. Die meisten PRNGs sind jedoch nicht; xorshift zum Beispiel sind nur wenige xor- und shift-Operationen. Sie wären auch darauf angewiesen, dass Ihre Zielhardware über AES-Beschleuniger verfügt.

Holen Sie sich eine anständige C PRNG-Bibliothek von irgendwo (sie sind nicht schwer zu finden), säen Sie es mit Ihrer geteilten Zufallszahl, und lassen Sie es dabei.

+0

'Ich würde nicht erwarten, AES immer und immer wieder anzuwenden, um eine anständige Zufälligkeit zu erzeugen." Nun, AES (++ k) wurde getestet, um ziemlich anständig zu sein RNG, IIRC. Obwohl der Rat, eine vernünftige PRNG-Bibliothek zu bekommen, richtig ist. –

0

Sie sollten ein Lesen der folgenden haben, es Links zu anderen Referenzen auf PRNG der hat

http://c-faq.com/lib/rand.html

Tun Sie das nicht, was Sie tun, wenn Sie etwas in referierten Literatur, dass diese finden würde arbeiten und selbst dann würde ich es mit Vorsicht behandeln. Wenn Sie einen tragbaren PRNG wollen dann in dem oben angegebenen Link derjenige ist

#define a 48271 
#define m 2147483647 
#define q (m/a) 
#define r (m % a) 

static long int seed = 1; 

long int PMrand() 
{ 
    long int hi = seed/q; 
    long int lo = seed % q; 
    long int test = a * lo - r * hi; 
    if(test > 0) 
     seed = test; 
    else seed = test + m; 
    return seed; 
} 

Beachten Sie die Änderung a am unteren Rand des Dokuments. Sie sollten auch nichts von dem, was ich gerade geschrieben habe, vertrauen, dh machen Sie Ihre Hausaufgaben und stellen Sie sicher, dass das oben genannte oder ein anderes PRNG für Ihre Anwendung funktioniert.

+0

https://en.wikipedia.org/wiki/Cryptographically_secure_pseudorandom_number_generator Nach diesem Artikel scheint mein Vorschlag ziemlich üblich. Performance scheint der einzige Kritikpunkt zu sein. – Ermir

+0

@Emirir Eine CPRNG ist nicht das, was Sie in Ihrer Frage beschreiben. Zufallszahlen und Sicherheit erscheinen oft zusammen, aber sie sind zwei sehr unterschiedliche Themen. – Harry

0

Sie geben Ihre Sicherheitsanforderungen nicht an. Wenn Sie eine kryptographisch sichere Lösung wünschen, ist Ihre Frage nicht trivial. Eine mögliche Lösung finden Sie unter A Block Cipher based Pseudo Random Number Generator Secure Against Side-Channel Key Recovery.

Ein solcher RNG wird aufgrund der Sicherheitsanforderungen langsam sein. Wie Colonel Thirty Two sagt, könnte Ihr Problem besser durch einen RNG ohne Kryptografie gelöst werden, der schneller und wahrscheinlich einfacher zu warten ist.