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.
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
Sie könnten auch 'rand [0] = AES (wahrheitsgetreue_Zufallszahl, 0); rand [1] = AES (true_random_number, 1); usw. – immibis
Wenn Sie fragen möchten, ob dieses Schema ein CSDVNG ist, dann ist [crypto.se] viel besser geeignet als Stack Overflow. –