PyCrypto
PyCrypto — это набор криптографических модулей для языка программирования Python, предназначенный для реализации различных алгоритмов шифрования, хеширования, генерации случайных чисел и аутентификации. Библиотека предоставляет низкоуровневый интерфейс для работы с симметричными и асимметричными шифрами, цифровыми подписями и хеш-функциями. PyCrypto является одной из старейших и наиболее известных библиотек для криптографии в экосистеме Python, однако в настоящее время её развитие практически остановлено, а сообщество рекомендует использовать более современные аналоги, такие как cryptography или PyCryptodome.
История
Проект PyCrypto был создан в начале 2000-х годов как попытка предоставить Python-разработчикам доступ к стандартным криптографическим алгоритмам без необходимости писать низкоуровневый код на C. Первоначально библиотека разрабатывалась как обёртка над библиотекой OpenSSL, но со временем стала включать собственные реализации алгоритмов.
Основные вехи развития:
- 2001 год — первый публичный релиз PyCrypto (версия 0.1). Поддержка DES, AES, MD5, SHA-1.
- 2004 год — добавлена поддержка асимметричного шифрования RSA и DSA.
- 2009 год — выпуск версии 2.0, включающей оптимизированные реализации на C.
- 2013 год — последний стабильный релиз (версия 2.6.1). После этого проект фактически перешёл в режим поддержки без активной разработки.
- 2019 год — официальное объявление о прекращении активной разработки PyCrypto. Разработчики рекомендовали переходить на библиотеку
PyCryptodome, которая является форком PyCrypto с исправлениями и новыми функциями.
Несмотря на устаревание, PyCrypto до сих пор используется в некоторых старых проектах и учебных курсах по криптографии.
Архитектура и основные компоненты
PyCrypto состоит из модулей, каждый из которых реализует определённый класс криптографических операций. Библиотека написана на Python с критическими участками на C для повышения производительности.
Симметричные шифры
PyCrypto поддерживает несколько режимов работы блочных шифров:
- ECB (Electronic Codebook) — простейший режим, при котором каждый блок шифруется независимо. Уязвим для атак по образцу.
- CBC (Cipher Block Chaining) — каждый блок XOR-ится с предыдущим зашифрованным блоком перед шифрованием.
- CFB (Cipher Feedback) — превращает блочный шифр в поточный.
- OFB (Output Feedback) — генерирует поток ключей, который XOR-ится с открытым текстом.
- CTR (Counter) — использует счётчик для генерации потока ключей.
Поддерживаемые алгоритмы:
| Алгоритм | Размер ключа (бит) | Размер блока (бит) | Статус |
|---|---|---|---|
| AES | 128, 192, 256 | 128 | Актуален |
| DES | 56 | 64 | Устарел |
| Triple DES | 112, 168 | 64 | Устарел |
| Blowfish | 32–448 | 64 | Устарел |
| CAST5 | 40–128 | 64 | Устарел |
| ARC2 | 8–1024 | 64 | Устарел |
Асимметричные шифры
Поддерживаются алгоритмы:
- RSA — шифрование и цифровая подпись. Размер ключа от 512 до 4096 бит.
- DSA — цифровая подпись на основе дискретного логарифмирования.
- ElGamal — шифрование на основе задачи дискретного логарифмирования.
Хеш-функции
PyCrypto включает реализации следующих хеш-функций:
- MD5 (128 бит) — устарел, не рекомендуется к использованию.
- SHA-1 (160 бит) — устарел.
- SHA-256, SHA-384, SHA-512 (семейство SHA-2) — актуальны.
- RIPEMD-160 (160 бит) — используется редко.
Генерация случайных чисел
Библиотека предоставляет модуль Random, который использует системные источники энтропии (/dev/urandom в Linux, CryptGenRandom в Windows). Для криптографических целей рекомендуется использовать Crypto.Random.get_random_bytes().
Протоколы и утилиты
PyCrypto включает модули для работы с:
- PKCS#1 OAEP — оптимальное асимметричное шифрование с дополнением.
- PKCS#1 v1.5 — устаревший режим дополнения для RSA.
- HMAC — хеш-код аутентификации сообщения.
- KDF — функции вывода ключа (PBKDF2, bcrypt — в форках).
Пример использования
Ниже приведён пример шифрования и дешифрования с использованием AES в режиме CBC:
```python from Crypto.Cipher import AES from Crypto.Random import get_random_bytes
key = get_random_bytes(16) # 128-битный ключ iv = get_random_bytes(16) # вектор инициализации
cipher = AES.new(key, AES.MODE_CBC, iv) plaintext = b"Hello, World! Это тестовое сообщение."
Дополнение до кратности 16 байт
padded = plaintext + b" " * (16 - len(plaintext) % 16) ciphertext = cipher.encrypt(padded)
Дешифрование
decipher = AES.new(key, AES.MODE_CBC, iv) decrypted = decipher.decrypt(ciphertext).strip() ```
Критика и ограничения
PyCrypto подвергается критике по нескольким причинам:
- Отсутствие активной поддержки — последний релиз вышел в 2013 году, многие уязвимости не исправлены.
- Низкая производительность — по сравнению с современными библиотеками (
cryptography,PyCryptodome) PyCrypto работает медленнее. - Отсутствие современных алгоритмов — нет поддержки ChaCha20, Poly1305, Ed25519, X25519.
- Проблемы с безопасностью — некоторые реализации (например, RSA с PKCS#1 v1.5) уязвимы для атак.
- Неудобный API — требует ручного дополнения данных, что часто приводит к ошибкам.
Наследие и влияние
Несмотря на устаревание, PyCrypto сыграл важную роль в популяризации криптографии среди Python-разработчиков. Многие современные библиотеки, такие как PyCryptodome и cryptography, заимствовали идеи и архитектуру PyCrypto. Библиотека до сих пор используется в старых проектах и образовательных курсах как пример реализации криптографических алгоритмов «с нуля».
Альтернативы
Для новых проектов рекомендуется использовать:
- PyCryptodome — форк PyCrypto с исправлениями и новыми алгоритмами.
- cryptography — современная библиотека с высокоуровневым и низкоуровневым API.
- hashlib — встроенный модуль Python для хеш-функций.
- hmac — встроенный модуль для HMAC.
Источники
- Официальная документация PyCrypto (архивная версия 2.6.1)
- Репозиторий PyCrypto на GitHub (последний коммит 2019 года)
- Документация библиотеки PyCryptodome (форк PyCrypto)
- Руководство по криптографии на Python (OWASP)
- Статья «PyCrypto vs cryptography vs PyCryptodome» на Habr
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →