Ich möchte ein CSPRNG für eine Stream-Chiffre implementieren. Ich habe versucht, das BBS zu implementieren, aber ich habe gehört, dass es sehr große Seeds braucht, um sicher zu sein.
Gibt es in einer Bibliothek für Python 3 eine Funktion, die einen Pseudozufallszahlengenerator hinzufügt, der sicher ist und für jeden Seed dieselben Ausgaben liefert?
Was Sie suchen, ist eher ein DRBG (deterministischer Zufallsbitgenerator) als ein CSPRNG, da letzterer nicht reproduzierbar sein muss oder sogar einen beobachtbaren Zustand tragen muss. DRBGs sind so definiert, dass sie einen Seed nehmen und einen Strom kryptografisch sicherer Bits basierend auf diesem Seed zurückgeben (d. h. DRBGs sind technisch gesehen eine Teilmenge aller CSPRNGs, aber wenn Leute CSPRNG sagen, meinen sie im Allgemeinen die Art des "Entropiepools" von nicht deterministischen Designs) .
Dafür gibt es in Python selbst nichts, da die einzige Quelle für kryptografisch sichere Bytes, die Python bereitstellt, letztendlich der eigene nicht deterministische Generator des Betriebssystems ist, der Ihren Anforderungen nicht entspricht.
Sie könnten kryptografische PyCrypto -Primitive verwenden, um ein bekanntes gutes DRBG wie HMAC-DRBG zu implementieren. Es gibt auch dieses Github-Repo , das HMAC-SHA512-DRBG mit Testvektoren implementiert. Möglicherweise gibt es auch Python-Bindungen an Kryptobibliotheken wie SSL, die möglicherweise ein gebrauchsfertiges DRBG bereitstellen (obwohl ich nicht weiß, ob die kryptografische Schicht von OpenSSL so etwas bietet).
Ich habe einen Python-Code, der ein auf RSA basierendes PRBG implementiert, verfügbar unter http://s13.zetaboards.com/Crypto/topic/7234475/1/ Ich hoffe, dass es Ihnen auf die eine oder andere Weise von Nutzen sein könnte.
Das beste CSPRNG zum Implementieren einer Stromverschlüsselung ist – warten Sie darauf – eine Stromverschlüsselung oder eine Blockverschlüsselung im Stromverschlüsselungsmodus wie AES im Zählermodus (CTR). So etwas ist theoretisch ein CS-PRNG.
Tatsächliche Implementierungen von Zufallszahlengeneratoren können sich dahingehend ändern, wie sie Bits / Bytes zurückgeben, sie können einen zufälligen Seed verwenden oder sie können einen Reseeding durchführen. Sie wurden entwickelt, um schließlich eine zufällige Ausgabe zu liefern. Daher würde ich diese nicht verwenden, wenn eine Stream-Verschlüsselung vollkommen in Ordnung ist.
otus