Шифрування / розшифрування 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-бітне слово на раунд)мережа підстановки і перестановки (весь стан на кожному раунді)
S-блокодин блок 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-блоком 8×8, але SM4 ітерує 32 легкі раунди Фейстеля, а AES застосовує 10–14 важчих раундів над усім станом. У програмному забезпеченні 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 для кожного повідомлення і надсилайте його разом із шифротекстом.
Часті запитання (FAQ)

Чи сумісний він з 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, перемкніться на Розшифрування і вперед.