tools / des
des/
Симметричное шифрование и расшифровка DES для работы со старыми системами, которые еще используют DES. Режим, дополнение, форматы ключа и IV и кодировка настраиваются, результаты совпадают с Java и CryptoJS, а ключ не покидает браузер.
Открытый текст
Шифртекст
История
После каждого успешного шифрования или расшифровки запись сохраняется автоматически. Хранятся последние 20 записей, только в браузере этого устройства. Ключи не сохраняются, но IV и расшифрованный открытый текст сохраняются, поэтому на общем компьютере очищайте историю после работы.
Что такое AES, DES и RSA и чем они отличаются
AES и DES — симметричные шифры: шифрование и расшифровка выполняются одним и тем же ключом, как будто один ключ и запирает дверь, и отпирает. Они быстрые и подходят для больших объемов данных; сложность в том, как безопасно передать этот ключ другой стороне.
DES — старый стандарт 1970-х с эффективным ключом всего 56 бит: его уже можно подобрать перебором на специальном оборудовании или в кластере компьютеров, поэтому он нужен только для связи со старыми системами, которые его все еще используют. AES заменил DES как стандарт. Он использует ключи 128, 192 или 256 бит, практических атак на него сегодня нет, и это выбор по умолчанию для шифрования данных.
RSA — асимметричный шифр: используется пара ключей. Открытый ключ можно давать кому угодно, им шифруют; закрытый хранится у вас, им расшифровывают. Это как почтовый ящик, в который может бросить письмо кто угодно, а открыть его можете только вы. Не нужно заранее договариваться об общем ключе, но RSA медленный и за раз шифрует лишь несколько сотен байт. Реальные системы часто сочетают оба подхода: RSA шифрует случайно сгенерированный ключ AES для другой стороны, а AES шифрует сами данные.
Что такое режим шифрования и какой выбрать?
DES шифрует по 8 байт за раз; режим определяет, как длинные данные делятся на блоки и как блоки связаны друг с другом. ECB шифрует каждый блок отдельно, поэтому одинаковые данные дают одинаковый шифртекст и выдают закономерности; его лучше не использовать. CBC перед шифрованием смешивает каждый блок с предыдущим блоком шифртекста, а первый блок — с IV; это самый распространенный выбор. CFB, OFB и CTR превращают DES в поток ключа, который побайтово накладывается на данные через XOR, поэтому дополнение не нужно.
Ключ, IV и дополнение
Ключ DES — 8 байт, но младший бит каждого байта служит битом четности и в вычислениях не участвует, так что эффективная длина ключа всего 56 бит. Если ключ длиннее 8 байт, используются только первые 8, как в DESKeySpec из Java и в CryptoJS; более короткий ключ вызывает ошибку. Во всех режимах, кроме ECB, нужен IV длиной 8 байт. Хранить его в секрете не нужно, но с одним и тем же ключом его нельзя использовать повторно.
ECB и CBC требуют, чтобы длина данных была кратна 8 байтам, поэтому короткие данные добиваются до нужной длины выбранным способом дополнения. PKCS5Padding и PKCS7Padding для DES полностью одинаковы и используются чаще всего. ZeroPadding добавляет нули и при расшифровке отбрасывает все нулевые байты в конце, так что открытый текст, который сам заканчивается нулевыми байтами, их теряет. NoPadding ничего не добавляет, поэтому длину нужно обеспечить самостоятельно.
Как это соответствует Java и CryptoJS
Java: Cipher.getInstance("DES/CBC/PKCS5Padding") означает CBC с PKCS5Padding; если указать просто "DES", по умолчанию берется ECB с PKCS5Padding. В Java режим CTR работает только с NoPadding. В CryptoJS.DES.encrypt режимы и способы дополнения совпадают по названию, а CryptoJS.pad.Pkcs7 — это PKCS7Padding. Для новых систем используйте AES.
Частые вопросы
Можно ли здесь шифровать и расшифровывать 3DES (DESede, TripleDES)?
Нет, здесь реализован только обычный (одинарный) DES. Ключ 3DES имеет длину 16 или 24 байта; если вставить такой ключ сюда, будут использованы только первые 8 байт, поэтому результат будет отличаться от 3DES, а рядом с полем ключа появится пометка «используются только первые 8 байт». Для 3DES возьмите инструмент с поддержкой DESede.
Что делать, если пишет «Длина ключа — N байт, а ключ DES должен быть не короче 8 байт»?
Если байт меньше 8, будет ошибка: нулями ключ здесь не дополняется, поэтому дополните его до 8 байт самостоятельно. Чаще ошибаются с форматом: если hex-ключ из 16 символов введен при формате ключа string, он считается текстом из 16 байт и используются только первые 8 символов. Ошибки при этом нет, только пометка «используются только первые 8 байт» рядом с полем «Ключ» и под результатом, а результат, естественно, не совпадет. В формате string длина считается по выбранной кодировке, поэтому одна кириллическая буква в UTF-8 занимает 2 байта.
Что делать, если пишет «нужен IV длиной ровно 8 байт»?
IV для DES должен быть ровно 8 байт, а не 16, как у AES, и это верно для всех режимов, кроме ECB. Ключ длиннее 8 байт обрезается до первых 8, а IV — нет: и слишком длинный, и слишком короткий IV вызывают ошибку, поэтому 16-байтовый IV из параметров AES нужно заменить 8-байтовым. Снова проверьте формат: 16 hex-символов — это 8 байт, а те же 16 символов в формате string — уже 16 байт. ECB не использует IV, поэтому поле IV скрыто.
Что делать, если при расшифровке пишет «неверное дополнение» или «это не кратно 8»?
Если длина шифртекста не кратна 8, чаще всего он скопирован не полностью или перепутаны hex и base64. Неверное дополнение обычно значит, что ключ, IV, режим или способ дополнения не совпадают с использованными при шифровании. ZeroPadding и NoPadding дополнение не проверяют, поэтому с ними эта ошибка не появится, но при неверных параметрах результат будет мусором.
Начало расшифрованного текста — мусор, или пишет, что результат не является корректным текстом UTF-8
Сначала проверьте IV. Если шифртекст длиннее одного блока, неверный IV в режимах CBC и CFB портит только первый 8-байтовый блок: остальное расшифровывается правильно и ошибки дополнения нет, поэтому в начале виден мусор, а дальше нормальный текст. Если появилось сообщение, что результат не является корректным текстом, возможно, кодировка не совпадает с той, что использовалась при шифровании, например другая сторона применяла GBK. Если выбрать формат вывода hex, можно сначала проверить сами расшифрованные байты.
Результат не совпадает с Java или CryptoJS. Как найти причину?
Проверяйте в таком порядке: режим и дополнение, формат и длина в байтах ключа и IV, кодировка, форматы ввода и вывода. Открытый текст в формате string не обрезается по краям, поэтому один лишний перевод строки в конце — это уже другие данные. Режимы CTR, CFB и OFB здесь тоже дополняются выбранным способом, поэтому с PKCS5Padding шифртекст получается длиннее открытого текста; если бэкенд использует NoPadding, выберите NoPadding и здесь. CFB здесь работает с полным 64-битным блоком, поэтому с бэкендом на CFB8 результат не совпадет.
Результат CryptoJS.DES.encrypt начинается с U2FsdGVkX1. Можно ли расшифровать его здесь?
Нет. Если передать в CryptoJS.DES.encrypt(message, string) строку вместо ключа, CryptoJS считает ее паролем: добавляет случайную соль и получает ключ и IV так же, как OpenSSL, а результат начинается с U2FsdGVkX1. Этот формат здесь не поддерживается. Чтобы результаты совпали, преобразуйте ключ в байты через CryptoJS.enc.Utf8.parse, передайте его и явно задайте iv, mode и padding.
Что хранится в истории и отправляется ли она куда-то?
Она хранится только в localStorage браузера на этом устройстве и никуда не отправляется; в коде страницы нет сетевых запросов. После каждого успешного шифрования или расшифровки добавляется одна запись, хранится не более 20 записей, а если ввод или результат длиннее 20 000 символов, запись не создается. В записи есть параметры, IV, ввод и результат, а также 8-символьный отпечаток, вычисленный по первым 8 байтам ключа (символы после # в каждой записи, по ним можно понять, тот же это ключ или нет), но самого ключа нет, поэтому после нажатия «Загрузить» ключ нужно ввести заново. Каждую запись можно удалить отдельно, а на общем компьютере после работы нажмите «Очистить историю».