Дешифрование DES падает с ошибкой "bad decrypt" или ошибкой паддинга — что проверить?
Для дешифрования все параметры должны совпадать с шифрующей стороной: байты ключа, длина ключа (8/16/24), режим (ECB/CBC), IV, паддинг и формат шифротекста — hex или Base64. Две самые частые ловушки: несовпадение длины ключа ("DES-ключ" из 32 hex-символов — это 16 байт, то есть 2-ключевой 3DES, а не одиночный DES) и путаница в названиях паддинга (Java PKCS5Padding — это PKCS#7 для DES — не выбирайте None). Раскрывающаяся панель справа показывает эквивалентную команду OpenSSL для текущих настроек; отправьте её другой стороне — это самый быстрый способ найти расхождение.
Какой длины ключ DES? А 3DES?
Одиночный DES: номинально 64 бита (8 байт, 56 эффективных — один бит в каждом байте является битом чётности). 3DES существует в двух вариантах: 2-ключевой (16 байт, K1‖K2, где K3=K1) и 3-ключевой (24 байта, K1‖K2‖K3). Номинальный материал ключа — 112/168 бит, но эффективная стойкость по NIST (SP 800-57 Part 1 Rev.5, таблица 2) составляет лишь около 80 и 112 бит — и 3-ключевой вариант к тому же не рекомендуется к применению. Инструмент определяет вариант по количеству байт; любая иная длина вызывает ошибку — CryptoJS и openssl enc -K вместо этого молча усекают или дополняют нулями, и это главная причина проблем совместимости.
Что такое IV и какой у него размер для DES?
IV — это 8-байтовое значение, которое CBC подмешивает в первый блок; в ECB он не используется. Он должен быть ровно 8 байт (16 hex-цифр или 8 ASCII-символов). Учтите: IV у DES — 8 байт, а у AES — 16, поэтому IV от AES сразу не подойдёт. Никогда не используйте один IV повторно с одним и тем же ключом.
Во что отображается Java DES/ECB/PKCS5Padding в этом инструменте?
Режим ECB + паддинг PKCS#7. В JCE "PKCS5Padding" для DES исполняет универсальный алгоритм PKCS#7 — PKCS#5 когда-то определял паддинг только для 8-байтовых блоков, как раз блока DES. Вывод Java Cipher.getInstance("DES/ECB/PKCS5Padding") здесь расшифровывается с ECB + PKCS#7 и 8-байтовым ключом одиночного DES. ⚠️ 3DES в Java (DESede) принимает только 24-байтовые ключи — для 2-ключевого варианта вам придётся самому развернуть K1‖K2 в K1‖K2‖K1.
Как соотносятся названия алгоритмов des-ede3 в PHP?
PHP заимствует названия OpenSSL: des-ede3-cbc — это 3-ключевой 3DES + CBC, des-ede3-ecb — 3 ключа + ECB; des-ede-cbc — 2-ключевой вариант. Ключ из 24 байт выбирает 3 ключа, из 16 — 2 ключа.
Что такое биты чётности в ключе DES? Они проверяются?
Младший бит каждого байта ключа определён как бит чётности, поэтому настоящий 56-битный ключ «сидит» внутри 64 бит. FIPS 46-3 не требует его проверки — OpenSSL, Java и этот инструмент его игнорируют; подойдут любые 8 байт, а изменение битов чётности не меняет шифротекст. Исключение — .NET: он сначала нормализует чётность, а затем сверяется с таблицей слабых ключей, поэтому нулевые и другие слабые ключи в .NET отклоняются, тогда как все остальные библиотеки шифруют их без вопросов — ловушка, которая срабатывает только при переносе тестовых ключей с Java/OpenSSL на .NET.
Что происходит в 3DES, когда K1 = K2?
В 2-ключевом 3DES всегда K3 = K1; если при этом ещё и K1 = K2, вся цепочка EDE вырождается в одиночный DES: E_K(D_K(E_K(P))) = E_K(P). То же происходит, когда все три 8-байтовые компоненты 24-байтового ключа одинаковы. Этот инструмент всё равно шифрует (совместимость прежде всего), но реальная стойкость при этом — 56 бит одиночного DES, а не 3DES.
DES ещё безопасен?
Нет — он только для совместимости с legacy-системами. NIST отозвал одиночный DES 19.05.2005 (ключ в 56 бит вскрывается полным перебором; EFF Deep Crack сделал это за 56 часов в 1998-м и за 22 часа год спустя с distributed.net). SP 800-131A Rev.2 помечает шифрование 2-ключевым TDEA как запрещённое, а 3-ключевое шифрование — как запрещённое после 31.12.2023 (дешифрование остаётся в статусе "Legacy use" — только для чтения исторических данных); сам SP 800-67 был отозван 01.01.2024. Малый 64-битный блок несёт и границу дня рождения класса Sweet32 (CVE-2016-2183) — NIST ограничивает один набор ключей 2²⁰ блоками (≈8 МБ) открытого текста. Для всего нового используйте AES-256. Этот инструмент существует потому, что банковские клиринги, платёжные шлюзы и старые системы на Java/.NET до сих пор гоняют сообщения эпохи DES — а чинить их начинается с умения их прочитать.
Почему мой результат 3DES отличается от Java/PHP?
Проверяйте в порядке вероятности: ① длину ключа — "DES-ключ из 32 hex-символов" у другой стороны — это 16 байт (2-ключевой 3DES), а вы дешифровали как одиночный DES; ② режим — голый "DES" в Java по умолчанию ECB, имена OpenSSL без суффикса режима, des-ede3/des-ede, — это ECB (псевдоним CBC — -des3); openssl_encrypt в PHP требует явного имени алгоритма — путает то, что по умолчанию он выводит текст Base64, а не сырые байты; ③ паддинг — старый mcrypt в PHP часто использовал нулевой паддинг, JCE — PKCS#5/#7; ④ кодирование — hex против Base64 и регистр; ⑤ ловушка CryptoJS с паролем — передача строки в качестве "ключа" запускает выведение ключа (MD5 + случайная соль, вывод с префиксом Salted__, каждый раз разный), что вообще не является сырым ключом — главная причина ситуации "тот же код, каждый запуск разный результат". Этот инструмент позволяет переключать каждый параметр; эквивалентную команду OpenSSL справа можно отправить другой стороне для воспроизведения.
ECB или CBC — что использовать?
То, что требует система, с которой вы взаимодействуете, — legacy-совместимость не оставляет выбора. Если выбирать всё же вам, всегда CBC со случайным IV: ECB превращает одинаковые блоки открытого текста в одинаковые блоки шифротекста, а малые 8-байтовые блоки DES утекают закономерности ещё заметнее, чем AES-ECB. Банковские протоколы эпохи DES используют оба; сначала сверьтесь с документацией протокола.
Работает ли это офлайн? Загружаются ли мои данные?
Все вычисления происходят в вашем браузере (чистый TypeScript, ноль зависимостей, ноль сетевых запросов); ключи и открытый текст никогда не покидают устройство. После загрузки страницы можно отключиться от сети и продолжать работать. Для инструмента, работающего с ключами, это единственно приемлемая форма.
2-ключевой или 3-ключевой 3DES — какой чаще встречается в legacy-системах?
Чаще — 2-ключевой (16 байт): банки и платёжная индустрия разворачивали 16-байтовое ключевое оборудование ради совместимости, и SP 800-67 назначил ему отдельную (более раннюю) дату вывода из эксплуатации. Так что "3DES-ключ" из 32 hex-символов с высокой вероятностью — 2-ключевой вариант. Этот инструмент определяет вариант по количеству байт автоматически.