Открыть сервисСервис

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) — использует счётчик для генерации потока ключей.

Поддерживаемые алгоритмы:

АлгоритмРазмер ключа (бит)Размер блока (бит)Статус
AES128, 192, 256128Актуален
DES5664Устарел
Triple DES112, 16864Устарел
Blowfish32–44864Устарел
CAST540–12864Устарел
ARC28–102464Устарел

Асимметричные шифры

Поддерживаются алгоритмы:

  • 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 подвергается критике по нескольким причинам:

  1. Отсутствие активной поддержки — последний релиз вышел в 2013 году, многие уязвимости не исправлены.
  2. Низкая производительность — по сравнению с современными библиотеками (cryptography, PyCryptodome) PyCrypto работает медленнее.
  3. Отсутствие современных алгоритмов — нет поддержки ChaCha20, Poly1305, Ed25519, X25519.
  4. Проблемы с безопасностью — некоторые реализации (например, RSA с PKCS#1 v1.5) уязвимы для атак.
  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
Заметили ошибку или не согласны с информацией в статье? Напишите нам support@bfometr.ru