Ich brauche kryptografisch sichere Zufallsdaten in C++ 11 und ich bin besorgt, dass die Verwendung von random_device für alle Daten die Leistung stark einschränken würde (Siehe Folie 23 von Stephan T. Lavavejs "rand() Considered Harmful", wo er sagt, dass wenn er getestet (auf seinem System), war random_device 1,93 MB/s und mt19937 war 499 MB/s, da dieser Code auf mobilen Geräten (Android über JNI und iOS) laufen wird, die wahrscheinlich langsamer als die oben genannten Zahlen sind.Kann ich kryptografisch sichere Zufallsdaten aus einer Kombination von random_device und mt19937 mit Neuansätzen erzeugen?
Außerdem ist mir bekannt, dass mt19937 nicht kryptographisch sicher ist, von wikipedia: "Beobachten einer ausreichenden Anzahl von Iterationen (624 im Fall von MT19937, da dies die Größe des Zustandsvektors ist, aus dem zukünftige Iterationen erzeugt werden) erlaubt es, alle zukünftigen Iterationen vorherzusagen ".
Unter Berücksichtigung aller oben genannten Informationen kann ich kryptografisch sichere Zufallsdaten generieren, indem ich alle 624 Iterationen von mt19937? Oder (möglicherweise) noch besser, jede X-Iteration, bei der X eine Zufallszahl ist (von random_device oder mt19937, die von random_device gesetzt wird) zwischen 1 und 624?
'random_device' ist nicht einmal erforderlich, um nichtdeterministisch zu sein, also würde ich denken, das ist keine sehr gute Idee. Wenn Sie wirklich nicht-deterministische Daten benötigen, ist die Verwendung der Krypto-API, die das Betriebssystem anbietet, wahrscheinlich der richtige Weg. – Praetorian
@Praetorian Auf iOS verwendet LLVM/dev/urandom als Quelle, die laut [this] (https://www.apple.com/br/ipad/business/docs/iOS_Security_Oct12.pdf) garantiert kryptographisch sicher ist) (Seite 7). Auf Android verwendet gcc entweder/dev/random oder/dev/urandom als Quelle, daher kann ich mich dafür entscheiden, mit "/ dev/random" zu initialisieren, was von OpenSSl und anderen verwendet wird und garantiert (nach bestem Wissen von Android) dass es nicht deterministisch ist –
Wenn Sie a priori 'random_device's Quellen kennen, die für die Verwendung als CSPRNG geeignet sind, dann ist das natürlich eine geeignete Wahl. Aber ich wäre immer noch vorsichtig mit Ihrer 'mt19937' Idee. Eine einfache Regel, wenn es um Kryptographie geht, sollte, wenn Sie nicht ein Experte in diesem Bereich sind, immer eine bestehende bewährte Lösung gegenüber etwas scheinbar cleverem bevorzugen. Es ist viel wahrscheinlicher, dass du etwas vermasselst als mit einer wirklich neuen Idee. Haben Sie den Durchsatz Ihrer Idee getestet? 'mt19937' hat 19937 Bits des Zustands, daher kann häufiges erneutes Auslesen nicht viel besser als' random_device' sein – Praetorian