PyCryptodome
PyCryptodome — это библиотека для языка программирования Python, предоставляющая набор криптографических функций и протоколов. Она является форком более старой библиотеки PyCrypto и разрабатывается как самодостаточный пакет, не требующий внешних зависимостей. PyCryptodome включает в себя реализации симметричных и асимметричных шифров, хеш-функций, алгоритмов электронной подписи, генераторов случайных чисел и вспомогательных утилит для работы с криптографическими протоколами.
История
Предшественник: PyCrypto
Первоначальная библиотека PyCrypto была создана в начале 2000-х годов и долгое время оставалась стандартным криптографическим пакетом для Python. Однако к середине 2010-х годов её развитие практически остановилось: последний стабильный релиз (версия 2.6.1) вышел в 2013 году. Библиотека имела ряд недостатков: устаревшие алгоритмы, проблемы с поддержкой новых версий Python, неполную документацию и трудности с установкой на некоторых платформах.
Создание и развитие PyCryptodome
В 2014 году разработчик Ливио Кокки (Livio Cocchi) начал форк PyCrypto, названный PyCryptodome. Основной целью было исправление ошибок, добавление поддержки Python 3 и внедрение современных криптографических стандартов. Первый стабильный релиз PyCryptodome (версия 3.0) состоялся в 2016 году. С тех пор библиотека активно развивается: выходят новые версии, добавляются алгоритмы (например, ChaCha20-Poly1305, AES-GCM, Ed25519), улучшается производительность и безопасность. По состоянию на 2025 год PyCryptodome является де-факто стандартом для криптографии в Python, заменив устаревший PyCrypto.
Архитектура и модули
PyCryptodome организована в виде набора модулей, каждый из которых отвечает за определённый класс криптографических операций. Библиотека написана на Python с критическими участками на C для повышения производительности.
Симметричное шифрование
Модуль Crypto.Cipher предоставляет реализации симметричных блочных и поточных шифров. Поддерживаются следующие алгоритмы:
- AES (Advanced Encryption Standard) — с длиной ключа 128, 192 или 256 бит, в режимах ECB, CBC, CFB, OFB, CTR, GCM, CCM, SIV, EAX, OCB.
- DES и Triple DES (3DES) — устаревшие алгоритмы с длиной ключа 56 и 112/168 бит соответственно.
- Blowfish — блочный шифр с переменной длиной ключа.
- Twofish — блочный шифр, финалист конкурса AES.
- ChaCha20 — поточный шифр, часто используемый в паре с аутентификацией Poly1305 (режим
ChaCha20_Poly1305). - Salsa20 — предшественник ChaCha20.
Асимметричное шифрование и подписи
Модуль Crypto.PublicKey реализует генерацию и управление ключами для асимметричных криптосистем. Модуль Crypto.Signature — алгоритмы электронной подписи.
- RSA — шифрование и подпись (с поддержкой OAEP, PKCS1_v1_5, PSS).
- DSA (Digital Signature Algorithm) — подпись.
- ECDSA (Elliptic Curve Digital Signature Algorithm) — подпись на эллиптических кривых (кривые NIST P-192, P-224, P-256, P-384, P-521, а также кривая 25519).
- Ed25519 и Ed448 — современные алгоритмы подписи на эллиптических кривых (EdDSA).
- X25519 и X448 — алгоритмы обмена ключами на эллиптических кривых (Curve25519, Curve448).
Хеширование
Модуль Crypto.Hash содержит реализации криптографических хеш-функций:
- SHA-1 (160 бит) — устаревший, не рекомендуется для новых проектов.
- SHA-224, SHA-256, SHA-384, SHA-512 (семейство SHA-2).
- SHA-3 (Keccak) — стандарт NIST 2015 года.
- BLAKE2 (BLAKE2s и BLAKE2b) — высокопроизводительные хеш-функции.
- MD5 (128 бит) — устаревший, используется только для совместимости.
- RIPEMD-160 (160 бит).
- Poly1305 — аутентификационный код сообщения (MAC).
Коды аутентификации сообщений (MAC)
Модуль Crypto.Hash также включает MAC-алгоритмы:
- HMAC (Hash-based Message Authentication Code) — на основе любой хеш-функции.
- CMAC (Cipher-based MAC) — на основе блочного шифра (например, AES-CMAC).
- Poly1305 — часто используется с ChaCha20.
Генерация случайных чисел
Модуль Crypto.Random предоставляет криптографически стойкий генератор случайных чисел, основанный на системных источниках энтропии (например, /dev/urandom в Linux, CryptGenRandom в Windows). Также есть модуль Crypto.Util.number для генерации больших простых чисел, необходимых для RSA и DSA.
Протоколы и утилиты
- Crypto.Protocol.KDF — функции формирования ключей (Key Derivation Functions): PBKDF2, scrypt, bcrypt, HKDF.
- Crypto.Protocol.SecretSharing — схема разделения секрета Шамира (Shamir's Secret Sharing).
- Crypto.Util.Padding — функции дополнения (padding) для блочных шифров (PKCS7, ISO 7816-4, X.923).
- Crypto.Util.strxor — побитовое исключающее ИЛИ для строк.
- Crypto.IO — модули для чтения/записи зашифрованных данных в форматах PEM, DER, PGP.
Установка и использование
PyCryptodome распространяется через менеджер пакетов pip. Установка производится командой:
`` pip install pycryptodome ``
Библиотека поддерживает Python версий 3.5 и выше (включая 3.11, 3.12). Для работы не требуются внешние зависимости, хотя для сборки из исходного кода может потребоваться компилятор C.
Пример использования: шифрование и дешифрование данных с помощью AES в режиме GCM:
```python from Crypto.Cipher import AES from Crypto.Random import get_random_bytes
key = get_random_bytes(16) # 128-битный ключ cipher = AES.new(key, AES.MODE_GCM) ciphertext, tag = cipher.encrypt_and_digest(b"Секретные данные") nonce = cipher.nonce
Дешифрование
cipher_dec = AES.new(key, AES.MODE_GCM, nonce=nonce) plaintext = cipher_dec.decrypt_and_verify(ciphertext, tag) print(plaintext) # b"Секретные данные" ```
Отличия от PyCrypto
PyCryptodome существенно переработана по сравнению с PyCrypto:
- Поддержка Python 3 — в PyCrypto отсутствовала.
- Современные алгоритмы — добавлены ChaCha20-Poly1305, SHA-3, Ed25519, X25519, scrypt.
- Улучшенная безопасность — исправлены уязвимости, добавлены защищённые режимы (GCM, CCM, SIV).
- Единый интерфейс — все шифры используют одинаковый API (объекты
new(),encrypt(),decrypt()). - Самодостаточность — не требует установки OpenSSL или других внешних библиотек.
- Производительность — критические функции реализованы на C и оптимизированы.
Критика и ограничения
Несмотря на широкую распространённость, PyCryptodome имеет некоторые недостатки:
- Отсутствие поддержки постквантовой криптографии — библиотека не включает алгоритмы, устойчивые к атакам с использованием квантовых компьютеров (например, Kyber, Dilithium).
- Ограниченная поддержка аппаратного ускорения — нет встроенной поддержки Intel AES-NI или ARM Crypto Extensions (хотя некоторые операции могут использовать их через низкоуровневые библиотеки).
- Сложность с некоторыми протоколами — реализация TLS/SSL отсутствует; для этого используются другие библиотеки (например,
sslиз стандартной библиотеки Python илиcryptography). - Документация — хотя документация есть, она не всегда подробно описывает все нюансы использования.
Применение
PyCryptodome используется в широком спектре проектов:
- Разработка защищённых приложений (шифрование файлов, сообщений).
- Реализация криптографических протоколов (например, Signal, OTR, PGP).
- Научные исследования и обучение криптографии.
- Тестирование и аудит безопасности.
- Встраивание в веб-фреймворки (Django, Flask) для обработки токенов и сессий.
См. также
- Криптография
- Python
- PyCrypto
- Библиотека
cryptography(альтернативный криптографический пакет для Python)
Источники
- Официальная документация PyCryptodome (pycryptodome.readthedocs.io)
- Репозиторий PyCryptodome на GitHub (github.com/Legrandin/pycryptodome)
- Статья «PyCrypto vs PyCryptodome» на Stack Overflow
- Документация Python по стандартной библиотеке
hashlibиhmac
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →