CSPRG в Python

Я хочу реализовать CSPRNG для потокового шифра. Я пытался внедрить BBS, но слышал, что для безопасности нужны очень большие семена.

Есть ли в какой-нибудь библиотеке для Python 3 функция, которая добавляет безопасный генератор псевдослучайных чисел и дает одинаковые результаты для каждого начального числа?

Однако вы можете реализовать PRNG (или даже более простой потоковый шифр), используя безопасные хэши в hashlib. Также планируется добавить CSPRNG в стандартную библиотеку в 3.6 IIRC.

Ответы (3)

То, что вы ищете, на самом деле является DRBG (детерминированный генератор случайных битов), а не CSPRNG, поскольку последний не обязательно должен быть воспроизводимым или даже иметь наблюдаемое состояние. DRBG определены так, чтобы брать начальное число и возвращать поток криптографически безопасных битов на основе этого начального числа (то есть DRBG технически являются подмножеством всех CSPRNG, но когда люди говорят CSPRNG, они обычно имеют в виду недетерминированные конструкции типа «пул энтропии») .

Внутри самого Python для этого нет ничего, поскольку единственным источником криптографически безопасных байтов, который предоставляет Python, является, в конечном счете, собственный недетерминированный генератор ОС, который не соответствует вашим потребностям.

Вы можете использовать криптографические примитивы PyCrypto для реализации хорошо зарекомендовавшего себя DRBG, такого как HMAC-DRBG. Существует также этот репозиторий Github , который реализует HMAC-SHA512-DRBG с тестовыми векторами. Также могут быть привязки Python к криптографическим библиотекам, таким как SSL, которые могут предоставить готовый к использованию DRBG (хотя я не знаю, предоставляет ли криптографический уровень OpenSSL такую ​​​​вещь).

HMAC есть в стандартных библиотеках, поэтому использовать PyCrypto не нужно.
@otus Хорошо, вы можете сделать это из коробки, если вам нужна только хэш-функция или примитивы HMAC для вашей конструкции. Как только вам понадобится какая-либо схема шифрования, вам не повезло!

У меня есть код Python, реализующий PRBG на основе RSA, доступный по адресу http://s13.zetaboards.com/Crypto/topic/7234475/1/ Надеюсь, что он может быть вам полезен в том или ином смысле.

Лучший CSPRNG для реализации потокового шифрования — дождитесь его — потоковый шифр или блочный шифр в режиме потокового шифрования, такой как AES в режиме счетчика (CTR). Такая вещь теоретически называется CS-PRNG.

Фактические реализации генератора случайных чисел могут измениться в том, как они возвращают биты / байты, они могут использовать случайное начальное число или они могут повторно задавать. В конце концов, они были разработаны для обеспечения случайного вывода. Поэтому я бы не стал использовать их там, где потоковый шифр отлично подходит.