Шифрование / расшифровка SM4

Шифруйте или расшифровывайте SM4 — GB/T 32907-2016, китайский национальный стандарт 128-битного блочного шифра — в режимах ECB и CBC с дополнением PKCS#7. Вывод побайтно совместим с openssl enc -sm4-ecb / -sm4-cbc. Всё работает в браузере; ничего не загружается.
Дополнение PKCS#7 применяется всегда, точно как в OpenSSL enc.
Читать ввод как:
Записать результат как:
Перекрёстная проверка с OpenSSL — зашифруйте здесь, затем выполните openssl enc -d -sm4-cbc -K <hexkey> -iv <hexiv> -in file.sm4 -out file.txt (или -sm4-ecb без -iv): байты совпадут точно, потому что эта страница применяет то же дополнение PKCS#7, что и OpenSSL.
Самопроверка
Повторяет известный ответ из приложения A.1 GB/T 32907-2016, шесть детерминированных перекрёстных векторов ECB/CBC, созданных независимой эталонной реализацией на Python, все четыре пула образцов и негативные пути (неверный размер ключа, шифртекст не кратный блоку, подделанное дополнение должны отвергаться).
Что такое SM4?
Вкратце: SM4 — китайский национальный стандартный блочный шифр — 128-битный блок, 128-битный ключ, 32-раундовый шифр с несбалансированной структурой Фейстеля, опубликованный как GB/T 32907-2016 (ранее GM/T 0002-2012), и играет в китайском наборе «SM» ту же роль, что AES в мире NIST.
SM4 против AES вкратце
АспектSM4AES
Размер блока128 бит128 бит
Размеры ключейтолько 128 бит128 / 192 / 256 бит
Раунды3210 / 12 / 14
Структуранесбалансированная сеть Фейстеля (за раунд обновляется одно 32-битное слово)сеть подстановок и перестановок (весь state на каждом раунде)
S-boxодин блок 8×8, используется 4× за раундодин блок 8×8, 16× за раунд + MixColumns
Стандартные режимыECB, CBC (эта страница); GCM/CTR в наборах TLS (RFC 8998)ECB, CBC, CTR, GCM, ...
Опубликован2012 (GM/T 0002-2012; GB/T 32907-2016); в ISO/IEC 18033-3:20102001 (FIPS 197)

Одна задача, разный дизайн: оба — 128-битные блочные шифры с открытым S-box 8×8, но SM4 итерирует 32 лёгких раунда Фейстеля, тогда как AES применяет 10–14 более тяжёлых раундов по всему state. Программно AES обычно быстрее благодаря аппаратным инструкциям (AES-NI); SM4 достиг сопоставимого положения благодаря выделенным расширениям ЦП на китайских платформах. Ни у одного нет практической атаки; 128-битный ключ — это 128-битный ключ.

Зачем использовать SM4 вместо AES?

Соответствие и совместимость, а не стойкость: китайские правила коммерческой криптографии (商用密码) требуют набор SM в сертифицируемых секторах, а протоколы вроде TLCP и TLS 1.3 с наборами по RFC 8998 договариваются о SM4. Если вашему контрагенту, регулятору или аппаратуре нужен только SM4, используйте SM4. Если вы свободны в выборе, AES-256 на странице AES этого сайта остаётся мировым умолчанием.

Распространённые ошибки
  • ECB на структурированных данных. Одинаковые блоки открытого текста дают одинаковые блоки шифртекста — классический пингвин. Используйте CBC (умолчание этой страницы) со свежим IV, когда данные длиннее одного блока.
  • Ключ — ровно 16 байт. В отличие от AES, у SM4 нет вариантов на 192/256 бит. Парольная фраза вроде «password» — не ключ: сначала получите ключ через KDF (см. Генератор хешей паролей).
  • Предположение, что дополнение необязательно. Эта страница — как OpenSSL enc — всегда применяет PKCS#7, поэтому 16-байтный открытый текст шифруется в 32 байта. Сырой SM4 без дополнения намеренно не предлагается.
  • Повторное использование IV в CBC. Повторённая пара ключ+IV в CBC выдаёт равенство префиксов сообщений. Генерируйте случайный IV для каждого сообщения и передавайте его вместе с шифртекстом.
Частые вопросы

Совместимо ли это с OpenSSL? Да — байт в байт. openssl enc -sm4-cbc -K 0011... -iv 4455... -in in.txt -out out.sm4 (OpenSSL 1.1.1+) выдаёт ровно тот шифртекст, который печатает эта страница для того же ключа, IV и входа; GmSSL — то же самое.

Почему здесь нет SM4-GCM? Экосистема библиотек, близких к стандартам, предоставляет SM4-GCM в основном внутри стеков TLS; соглашение командной строки для файлов, которому соответствует эта страница (enc), покрывает ECB/CBC. Аутентифицированный SM4 относится к уровню протокола.

Есть ли SM4 в WebCrypto? Нет — ни один браузер его не реализует. Поэтому эта страница запускает реализацию на JavaScript «с нуля», с тестовыми векторами самого стандарта, подключёнными к самопроверке выше.

Можно ли расшифровать что-то, зашифрованное в другом месте? Да, если вы знаете режим, ключ, IV и то, что использовалось PKCS#7 — вставьте шифртекст как hex или Base64, переключитесь на «Расшифровать» и вперёд.