ZipCrypto
ZipCrypto — это алгоритм симметричного шифрования, применяемый в архиваторах, использующих формат ZIP, для защиты содержимого архивов паролем. Относится к классу поточных шифров и является одним из двух стандартных методов шифрования, определённых в спецификации формата ZIP (наряду с AES-256). Известен своей уязвимостью к атакам с использованием известного открытого текста (known-plaintext attack), что делает его нерекомендуемым для защиты конфиденциальных данных.
История
Разработка формата ZIP была начата Филом Кацем (Phil Katz) в 1989 году. Первоначально спецификация не предусматривала шифрования. Первая версия механизма защиты паролем появилась в PKZIP 2.0 (1993 год) и использовала простой потоковый шифр на основе псевдослучайного генератора (PRNG). Этот ранний метод, известный как «PKZIP 2.0 encryption», впоследствии был назван ZipCrypto.
В 2006 году, с выходом расширения «Strong Encryption Specification» (SES) для формата ZIP, была добавлена поддержка более надёжного алгоритма AES-256. Однако ZipCrypto остался в спецификации как обязательный для обратной совместимости и до сих пор поддерживается большинством архиваторов (WinRAR, 7-Zip, Info-ZIP, встроенные средства Windows и macOS).
Принцип работы
ZipCrypto является поточным шифром. Он генерирует псевдослучайную последовательность байтов (гамму), которая накладывается на открытый текст с помощью операции XOR (исключающее «ИЛИ»). Генерация гаммы основана на трёх 32-битных регистрах (key0, key1, key2), состояние которых инициализируется от пароля и обновляется после шифрования каждого байта.
Алгоритм инициализации
- Все три регистра обнуляются.
- Пароль преобразуется в последовательность байтов (обычно в кодировке OEM или ANSI, в зависимости от архиватора).
- Каждый байт пароля последовательно подаётся на вход функции обновления ключа (update_keys), которая модифицирует состояние регистров с использованием операций сдвига, сложения и CRC-32 (циклический избыточный код, используемый в ZIP).
Процесс шифрования
- Для каждого байта открытого текста вычисляется псевдослучайный байт гаммы на основе текущего состояния регистров (через функцию decrypt_byte).
- Байт гаммы складывается по модулю 2 (XOR) с байтом открытого текста, получая байт шифротекста.
- Состояние регистров обновляется с помощью функции update_keys, в которую подаётся байт открытого текста.
Проверка пароля
Для проверки правильности пароля при распаковке используется 12-байтовый заголовок шифрования (encryption header). Первые 11 байтов этого заголовка — случайные данные, а 12-й байт — контрольная сумма (младший байт CRC-32) первого файла в архиве, зашифрованная тем же ключом. При расшифровке архиватор проверяет, совпадает ли полученный 12-й байт с ожидаемым значением CRC. Если совпадение есть, пароль считается верным.
Уязвимости и критика
ZipCrypto считается криптографически слабым и не рекомендуется к использованию для защиты важных данных. Основные недостатки:
Атака по известному открытому тексту (Known-Plaintext Attack)
Это наиболее серьёзная уязвимость. Если злоумышленнику известен хотя бы один незашифрованный файл из архива (или его часть) и этот файл был зашифрован тем же паролем, что и остальные, он может восстановить пароль или расшифровать весь архив. Атака основана на том, что, зная открытый текст и соответствующий ему шифротекст, можно восстановить гамму, а затем и состояние генератора. Для успешной атаки достаточно 12–13 байтов известного открытого текста. Существуют программные инструменты (например, утилита bkcrack), автоматизирующие этот процесс и позволяющие восстановить пароль за считанные минуты.
Атака на основе CRC
Поскольку 12-й байт заголовка шифрования содержит CRC-32 файла, а CRC-32 является линейной функцией, это даёт дополнительную информацию о содержимом файла. В сочетании с другими методами это может ускорить атаку.
Отсутствие аутентификации
ZipCrypto не обеспечивает проверку целостности шифротекста. Это означает, что злоумышленник может модифицировать зашифрованные данные, и при расшифровке будет получен искажённый открытый текст, причём факт модификации не будет обнаружен.
Малая длина ключа
Хотя пароль может быть произвольной длины, эффективная длина ключа шифрования ограничена 96 битами (три 32-битных регистра). Современные методы полного перебора (brute-force) для коротких или словарных паролей являются эффективными.
Применение
Несмотря на слабость, ZipCrypto продолжает использоваться в следующих случаях:
- Обратная совместимость: Старые архиваторы (например, PKZIP 2.0) не поддерживают AES. Для обеспечения совместимости с устаревшим программным обеспечением применяется ZipCrypto.
- Быстрое шифрование: Алгоритм очень быстр и не требует значительных вычислительных ресурсов. Для защиты неконфиденциальных данных (например, от случайного просмотра) его производительность может быть преимуществом.
- Встроенные средства ОС: Встроенные средства создания ZIP-архивов в Windows (через контекстное меню «Отправить» → «Сжатая ZIP-папка») и macOS (через «Сжать») по умолчанию используют именно ZipCrypto, если пользователь задаёт пароль. Это связано с тем, что поддержка AES в этих системах была добавлена позже и не является универсальной.
Сравнение с AES-256
| Характеристика | ZipCrypto | AES-256 (в формате ZIP) |
|---|---|---|
| Тип шифра | Потоковый шифр | Блочный шифр (режим CTR) |
| Длина ключа | 96 бит (эффективная) | 256 бит |
| Устойчивость к атакам | Низкая (известен открытый текст) | Высокая (на 2024 год) |
| Аутентификация | Отсутствует | Есть (HMAC-SHA1) |
| Скорость | Очень высокая | Высокая |
| Совместимость | Широкая (с 1993 года) | Ограниченная (с 2006 года) |
| Рекомендация | Не рекомендуется для защиты данных | Рекомендуется для защиты данных |
Интересные факты
- Алгоритм ZipCrypto не был официально опубликован в виде открытой спецификации до 1997 года, когда его обратная разработка была выполнена независимыми исследователями.
- В 2006 году исследователь Донг Хуан (Dong Huang) продемонстрировал атаку, позволяющую восстановить пароль ZipCrypto за несколько секунд при наличии 20 байтов известного открытого текста.
- Некоторые архиваторы (например, 7-Zip) при создании ZIP-архивов с паролем по умолчанию предлагают использовать AES-256, но позволяют переключиться на ZipCrypto для совместимости.
Источники
- Спецификация формата ZIP (APPNOTE.TXT), PKWARE Inc.
- Eli Biham, Paul C. Kocher. «A Known Plaintext Attack on the PKZIP Stream Cipher» (1994).
- Документация утилиты
bkcrack(Kimci86). - Статья «ZipCrypto» в английской Википедии (версия от 2023 года).
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →