CSPRGs in Python

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?

Sie können jedoch ein PRNG (oder noch einfacher eine Stream-Chiffre) implementieren, indem Sie die sicheren Hashes in hashlib verwenden. Es ist auch geplant, der Standardbibliothek in 3.6 IIRC ein CSPRNG hinzuzufügen.

Antworten (3)

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).

HMAC ist in den Standardbibliotheken enthalten, sodass PyCrypto nicht verwendet werden muss.
@otus Guter Punkt, Sie können dies sofort tun, wenn Sie nur Hash-Funktionen oder HMAC-Primitive für Ihre Konstruktion benötigen. Sobald Sie jedoch irgendeine Art von Verschlüsselungsschema benötigen, haben Sie Pech!

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.