Skip to content

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

Шифрование и расшифровка SM4 онлайн. Не расшифровывается — найдёт, что не так: режим, дополнение, IV или кодировка, и предложит исправление. Всё в браузере, без загрузки. ECB, CBC, CTR, CFB, OFB; PKCS#7, нули или без дополнения.

Без отслеживания Работает в браузере Бесплатно
Шифрование выполняется полностью в браузере — введённые ключ и данные не покидают это устройство.
Шифротекст
Эквивалентная команда OpenSSL

Нужен OpenSSL 3. Команда содержит введённый ключ.

Тестовые векторы SM4 из GB/T 32907-2016

Вычислены при сборке тем же движком, на котором работает страница, — сверьте с ними свою реализацию SM4.
Ключ 0123456789abcdeffedcba9876543210
Открытый текст 0123456789abcdeffedcba9876543210
Шифротекст, 1 шифрование 681edf34d206965e86b3e94f536e4246
Шифротекст, 1 000 000 шифрований 595298c7c6fd271f0402f804c33d3f66
Движок SM4 проверен на обоих векторах из приложения A GB/T 32907-2016 и сверен с OpenSSL 3 в режимах ECB, CBC, CTR, CFB и OFB. Настройки библиотек по умолчанию проверены запуском OpenSSL, Node.js, sm-crypto, gm-crypt, gmssl и двух библиотек для Go, а также чтением исходного кода Hutool и BouncyCastle. — Команда безопасности Go Tools · Sep 11, 2026

Написано и проверено разработчиками, которые создают криптографические инструменты. Каждый шифротекст и каждое число байтов на этой странице вычислены движком инструмента и проверены тестами.

Быстрые ответы по SM4

Длина ключа SM4

16 байт Ровно 128 бит: 16 байт, записанные как 32 hex-цифры или 16 ASCII-символов. Ключей SM4 длиной 192 или 256 бит не бывает.

Тестовый вектор GB/T 32907

681edf34d206965e86b3e94f536e4246 При ключе и открытом тексте 0123456789abcdeffedcba9876543210 однократное шифрование даёт 681edf34d206965e86b3e94f536e4246.

Размер блока и число раундов SM4

32 раунда Блоки по 16 байт (128 бит), шифрование в 32 раунда.

Всегда ли неверный IV вызывает ошибку в CBC?

первые 16 байт Нет. Неверно расшифровываются только первые 16 байт, а дополнение в последнем блоке по-прежнему проходит проверку.

Что такое SM4?

SM4 — блочный шифр китайских стандартов коммерческой криптографии. Он был выпущен как GM/T 0002-2012, стал национальным стандартом GB/T 32907-2016 (действует с 1 марта 2017 года) и в 2021 году поправкой был включён в международный стандарт ISO/IEC 18033-3. Это симметричный шифр: один и тот же 128-битный ключ и шифрует, и расшифровывает, а обрабатывает он 128-битные блоки, по 16 байт за раз, — тот же размер блока, что у AES.

Внутри каждый блок делится на четыре 32-битных слова и проходит 32 раунда. В каждом раунде три слова смешиваются с раундовым ключом, результат проходит через 8-битный S-блок и линейное преобразование и объединяется с четвёртым словом через XOR. 32 раундовых ключа выводятся из ключа с помощью двух фиксированных наборов констант, а расшифровка — это то же самое вычисление с раундовыми ключами в обратном порядке.

Сам по себе блочный шифр обрабатывает ровно 16 байт, поэтому реальные данные всегда проходят через режим работы. Этот инструмент предлагает пять классических режимов: ECB и CBC, которые работают целыми блоками и требуют дополнения, и CTR, CFB и OFB, которые превращают SM4 в потоковый шифр вообще без дополнения. Большинство неудачных расшифровок не имеют отношения к самому SM4: стороны расходятся в режиме, дополнении, IV, кодировке текста или в том, как строка ключа превращается в байты, а библиотеки не сходятся даже в том, что означает просто «SM4».

Встроенный в браузеры Web Crypto API не поддерживает SM4, поэтому эта страница несёт собственную реализацию и выполняет её локально. Реализация проверена на двух тестовых векторах GB/T 32907 и сверена с OpenSSL 3 во всех режимах.

// SM4-CBC with PKCS#7 padding using Node.js and its bundled OpenSSL 3.
// Key and IV are both exactly 16 bytes (32 hex digits).
const crypto = require('node:crypto');

const key = Buffer.from('0123456789abcdeffedcba9876543210', 'hex');
const iv = Buffer.from('fedcba98765432100123456789abcdef', 'hex');

const cipher = crypto.createCipheriv('sm4-cbc', key, iv);
const ciphertext = Buffer.concat([cipher.update('hello', 'utf8'), cipher.final()]);
console.log(ciphertext.toString('base64')); // fUQPRg2HAXHGz5ZslzCpSQ==

const decipher = crypto.createDecipheriv('sm4-cbc', key, iv);
const plaintext = Buffer.concat([decipher.update(ciphertext), decipher.final()]);
console.log(plaintext.toString('utf8')); // hello

Возможности инструмента SM4

Объясняет, почему расшифровка не удалась

Если расшифровка не удалась, страница перебирает кодировку шифротекста, формат ключа, режим, IV, дополнение и кодировку текста и показывает настройки, при которых получается читаемый текст.

Пресеты для главных подозреваемых

Одно нажатие выставляет настройки по умолчанию OpenSSL, Hutool, sm-crypto, gm-crypt или tjfoc/gmsm — библиотек, которые не сходятся даже в том, означает ли просто «SM4» режим ECB или CBC.

Пять режимов, три варианта дополнения, UTF-8 или GBK

ECB, CBC, CTR, CFB и OFB с PKCS#7, дополнением нулями или без дополнения. Открытый текст может быть в UTF-8 или в GBK — кодировке, которую выдаёт старый Java-код в китайской Windows. GCM не поддерживается.

Ключ и IV для SM4: случайные или в hex, тексте или Base64

Сгенерируйте случайный 16-байтовый ключ или IV одним нажатием или введите его так, как он записан в вашем коде. Счётчик байтов в реальном времени подтверждает, что байт ровно 16, ещё до того, как вы начнёте искать другие причины.

Тестовые векторы GB/T 32907 прямо на странице

Оба результата из приложения A приведены в таблице и загружаются одним нажатием, так что любую реализацию SM4 можно сверить со стандартом.

Эквивалентная команда OpenSSL

К каждому результату прилагается команда openssl enc, которая его воспроизводит, — можно проверить результат в терминале или передать команду коллеге.

Работает полностью в браузере

Движок SM4 выполняется локально. Ключи и данные не покидают страницу, а инструмент продолжает работать офлайн.

Настройки SM4 по умолчанию в популярных библиотеках

OpenSSL 3 (openssl enc)

-sm4 = CBC

-sm4 — псевдоним -sm4-cbc. -K и -iv принимают hex, PKCS#7 остаётся включённым, пока не передан -nopad, а на выходе — сырые байты, если не добавить -base64 -A. -K неверной длины обрезается или дополняется нулями лишь с предупреждением.

Java: Hutool SmUtil.sm4(key)

ECB · PKCS#7

Hutool передаёт голое SM4, которое BouncyCastle выполняет как ECB с PKCS#7 (в JCE это называется PKCS5Padding). Строковые методы используют UTF-8, а encryptHex выводит hex в нижнем регистре. Для CBC используйте new SM4(Mode.CBC, Padding.PKCS5Padding, key, iv).

Java: BouncyCastle Cipher.getInstance("SM4")

ECB · PKCS#7

Если режиму нужен IV, а его не передали, шифрование молча генерирует случайный IV, а расшифровка выбрасывает no IV set when one expected, — поэтому шифротекст, при шифровании которого этот IV не сохранили, нельзя расшифровать нигде.

JavaScript: sm-crypto

ECB · hex-ключ

sm4.encrypt(data, key) по умолчанию использует ECB с PKCS#7, ожидает ключ в виде 32-значной hex-строки и возвращает hex в нижнем регистре. Режим меняет только mode: 'cbc'; любое другое значение молча оставляет ECB. sm-crypto-v2 ведёт себя так же, но берёт IV из одних нулей, если в CBC не передан iv.

JavaScript: gm-crypt

CBC · текстовый ключ · Base64

По умолчанию работает в CBC, принимает ключ и IV как строки UTF-8 из 16 символов и возвращает Base64. Ключ, байты которого не являются корректным UTF-8, передать ему вообще невозможно.

Python: gmssl CryptSM4

PKCS#7 · ключ обрезается до 16 байт

Режим выбирается вызовом crypt_ecb или crypt_cbc. set_key читает только первые 16 байт, поэтому более длинный ключ молча обрезается, а неверный ключ обычно возвращает пустые байты вместо ошибки.

Go: tjfoc/gmsm sm4

нулевой IV по умолчанию

Sm4Cbc использует IV уровня пакета, который остаётся нулевым, пока не вызван SetIV, дополняет по PKCS#7 даже в CFB и OFB и отбрасывает ошибки снятия дополнения — неверный ключ возвращает nil без ошибки.

Примеры шифрования и расшифровки SM4

Тестовый вектор GB/T 32907 (ECB, без дополнения)

Ключ 0123456789abcdeffedcba9876543210, открытый текст (hex) 0123456789abcdeffedcba9876543210
681edf34d206965e86b3e94f536e4246

Это пример 1 из приложения A стандарта GB/T 32907-2016: ключ и открытый текст — одно и то же 128-битное значение, и однократное шифрование даёт 681edf34d206965e86b3e94f536e4246. Если шифровать результат повторно — всего миллион раз, — получится 595298c7c6fd271f0402f804c33d3f66. Оба значения приведены в таблице тестовых векторов на этой странице и вычислены тем же движком, которым вы пользуетесь. Кнопка Тестовый вектор GB/T 32907 загружает первый из них.

CBC с PKCS#7: на входе текст, на выходе Base64

Ключ 0123456789abcdeffedcba9876543210, IV fedcba98765432100123456789abcdef, открытый текст: SM4 interop test: order 20260911-0042
Wi6BuLpov8RndEfedUyLXFvDRnLMoo7T6O04Q83IzKDuDvPQ2S5clq+cEQXMvy/y

Открытый текст занимает 37 байт в UTF-8. PKCS#7 дополняет его до 48 байт — трёх 16-байтовых блоков, которые в Base64 записываются 64 символами. Кнопка Загрузить пример подставляет ровно эти значения, а панель OpenSSL показывает команду, которая воспроизводит ту же строку Base64 в терминале.

Неверный IV в CBC: ломаются только первые 16 байт

Шифротекст из предыдущего примера, расшифрованный с IV 00000000000000000000000000000000
16 байт мусора, затем ": order 20260911-0042"

CBC подмешивает IV только в первый блок, а дополнение PKCS#7 находится в последнем, поэтому проверка дополнения проходит, и OpenSSL не выдаёт никакой ошибки. Эта страница замечает нечитаемый первый блок и сообщает, что ключ и режим верны, а проблема в IV — или что первые 16 байт шифротекста сами являются IV.

Как пользоваться шифрованием и расшифровкой SM4

  1. 1

    Выберите библиотеку или режим и дополнение

    Если известна библиотека на другой стороне, выберите её в списке «Настройки как в библиотеке». Иначе выберите «Шифрование» или «Расшифровка» и подберите режим и дополнение. У потоковых режимов (CTR, CFB, OFB) дополнения нет, поэтому для них переключатель дополнения неактивен.

  2. 2

    Введите ключ и IV

    Оба — ровно 16 байт. Выберите формат, в котором записана строка, — hex, текст или Base64 — и дождитесь, пока счётчик байтов станет зелёным. Кнопки «Случайный» генерируют новые значения.

  3. 3

    Вставьте входные данные

    Для шифрования введите текст (UTF-8 или GBK) или вставьте байты в hex. Для расшифровки вставьте шифротекст и укажите, в Base64 он или в hex. Результат обновляется по мере ввода.

  4. 4

    Скопируйте результат или проверьте обратный путь

    Скопируйте вывод или нажмите «Расшифровать этот шифротекст», чтобы перенести его на вкладку расшифровки с теми же ключом и IV. Панель OpenSSL показывает команду, которая воспроизводит результат.

  5. 5

    Если расшифровка не удалась, прочитайте диагностику

    Диагностика перечисляет настройки, при которых ваши данные расшифровываются в читаемый текст. Примените любую из них одним нажатием или прочитайте пояснение, если не расшифровываются только первые 16 байт, — это указывает на IV.

Почему не удаётся расшифровать SM4

Hex-ключ прочитан как текст

32-символьная hex-строка — это 16 байт, только если декодировать её как hex. Прочитанная как текст, она занимает 32 байта, и SM4 её отклоняет — а в коде, который молча обрезает или дополняет ключи, она превращается в совсем другой ключ.

✗ Неверно
Ключ (текст): 0123456789abcdeffedcba9876543210  -> 32 байта, отклонён
✓ Верно
Ключ (hex):   0123456789abcdeffedcba9876543210  -> 16 байт

Шифротекст CBC расшифровывают как ECB

Обе стороны должны использовать один и тот же режим. Шифротекст CBC, расшифрованный как ECB, даёт мусор в каждом блоке и обычно не проходит проверку дополнения в конце.

✗ Неверно
шифрование:  SM4/CBC/PKCS5Padding
расшифровка: SM4/ECB/PKCS5Padding  -> bad decrypt
✓ Верно
шифрование:  SM4/CBC/PKCS5Padding
расшифровка: SM4/CBC/PKCS5Padding, тот же IV

Используется другой IV

В CBC неверный IV не вызывает ошибки: первые 16 байт получаются искажёнными, а остальное расшифровывается нормально. Если испорчено только начало открытого текста, сравните IV.

✗ Неверно
IV расшифровки 00000000000000000000000000000000
-> 16 байт мусора + ": order 20260911-0042"
✓ Верно
IV расшифровки fedcba98765432100123456789abcdef
-> "SM4 interop test: order 20260911-0042"

Шифротекст в Base64 принят за hex

Base64 и hex — два способа записать одни и те же байты. Если прочитать одно как другое, шифр с самого начала получает неверные входные данные.

✗ Неверно
Wi6BuLpov8RndEfedUyLXFvDRnLMoo7T6O04Q83IzKDuDvPQ2S5clq+cEQXMvy/y  как hex -> некорректно
✓ Верно
Wi6BuLpov8RndEfedUyLXFvDRnLMoo7T6O04Q83IzKDuDvPQ2S5clq+cEQXMvy/y  как Base64 -> 48 байт

Дополнение нулями удаляет настоящие завершающие нули

Дополнение нулями не отличает дополнение от данных, поэтому открытый текст, который действительно заканчивается на 0x00, теряет эти байты. Для всего, что не является простым текстом, используйте PKCS#7.

✗ Неверно
дополнение нулями: 61 62 00  -> расшифруется в 61 62
✓ Верно
PKCS#7:            61 62 00  -> расшифруется в 61 62 00

Уверенность, что «SM4» везде означает один и тот же режим

OpenSSL считает sm4 режимом CBC. BouncyCastle — а значит, и SmUtil.sm4(key) из Hutool — считает SM4 режимом ECB с PKCS#7. Две системы, которые обе «просто используют SM4», могут расходиться в режиме.

✗ Неверно
Java:    Cipher.getInstance("SM4")  -> ECB + PKCS#7
OpenSSL: openssl enc -sm4           -> CBC
✓ Верно
Java:    Cipher.getInstance("SM4/CBC/PKCS5Padding")
OpenSSL: openssl enc -sm4-cbc

Байты GBK на одной стороне и UTF-8 на другой

getBytes() в Java без указания кодировки использует кодировку платформы по умолчанию, а в китайской Windows на JDK 17 и более ранних версиях это GBK. Один и тот же китайский текст тогда шифруется в разный шифротекст, и другая сторона расшифровывает его в кракозябры.

✗ Неверно
"国密SM4 test".getBytes()  // GBK в китайской Windows, JDK <= 17
-> шифротекст ECB 3188d06cf28db70092f8753cbd5ee518
✓ Верно
"国密SM4 test".getBytes(StandardCharsets.UTF_8)
-> шифротекст ECB d830308b0ae4fa7b9a2b5d59f7f65ca5

Когда нужно шифрование SM4 онлайн

Согласовать вывод SM4 между бэкендом и фронтендом
Java-сервис и веб-клиент выдают разный шифротекст для одного и того же текста. Воспроизведите здесь каждую сторону с пресетом её библиотеки и посмотрите, какой параметр отличается.
Разобраться с неудачной расшифровкой данных от партнёра
Партнёр присылает шифротекст SM4, который не расшифровывается. Вставьте его с согласованными ключом и IV — диагностика найдёт режим, дополнение или кодировку, которые на самом деле использовались.
Проверить реализацию SM4
Прогоните свой код по векторам GB/T 32907 на этой странице, затем сравните цикл шифрования и расшифровки в CBC — до того, как реализация хоть близко подойдёт к боевым данным.
Подготовить тестовые данные для перехода на SM4
Когда система переходит с AES на SM4, сгенерируйте здесь известные тройки из ключа, IV и шифротекста, чтобы использовать их как фикстуры в новых тестах.
Посмотреть, как ведут себя режимы блочного шифра
Зашифруйте два одинаковых блока в ECB и в CBC или расшифруйте с неверным IV и посмотрите, что меняется в шифротексте и в выводе.

Как устроены SM4 и его режимы

Размер блока, размер ключа и раунды
SM4 шифрует 128-битные блоки 128-битным ключом за 32 раунда. Каждый раунд применяет 8-битный S-блок к 32-битному слову, а затем линейное преобразование, которое складывает слово по XOR с четырьмя его циклическими сдвигами. Расшифровка выполняет те же 32 раунда с раундовыми ключами в обратном порядке.
ECB: каждый блок сам по себе
ECB шифрует каждый 16-байтовый блок независимо. IV ему не нужен, но одинаковые блоки открытого текста превращаются в одинаковые блоки шифротекста, так что закономерности в данных остаются видны. Дополнение требуется, если длина входа не кратна 16 байтам.
CBC: сцепленные блоки и IV
CBC перед шифрованием складывает каждый блок открытого текста по XOR с предыдущим блоком шифротекста, а для первого блока использует IV. Поскольку IV участвует только в первом блоке, неверный IV портит ровно первые 16 байт открытого текста и не затрагивает дополнение в последнем блоке, так что ошибки часто нет вовсе.
CTR, CFB и OFB: SM4 как потоковый шифр
Эти режимы шифруют счётчик или значение обратной связи и складывают результат с данными по XOR, поэтому шифротекст той же длины, что и открытый текст, и дополнения нет. В CTR весь 16-байтовый IV увеличивается как один 128-битный счётчик в порядке big-endian — так же, как в OpenSSL. Неверный IV искажает всё сообщение в CTR и OFB, но только первый блок в CFB.
Правила дополнения
PKCS#7 добавляет от 1 до 16 байт со значением n, поэтому сообщение, уже состоящее из целого числа блоков, всё равно получает полный блок дополнения. Дополнение нулями добавляет байты 0x00 только при необходимости и при расшифровке удаляет все завершающие нули. Без дополнения данные остаются как есть, а вход, который не заполняет целые блоки, отклоняется.

Лучшие практики шифрования SM4

Не выбирайте ECB для новых систем
ECB выдаёт, какие блоки совпадают. Используйте CBC или CTR, если только вы не подстраиваетесь под существующую систему, которая уже работает на ECB.
Используйте свежий случайный IV для каждого сообщения
IV не секретен, но не должен повторяться при одном и том же ключе. Генерируйте его случайно для каждого сообщения и храните или передавайте рядом с шифротекстом.
Аутентифицируйте шифротекст
GB/T 17964-2021, китайский стандарт режимов работы блочных шифров, указывает, что описанные в нём режимы защищают конфиденциальность, но не целостность. В CBC изменение одного байта IV превращает pay=100.00 в pay=900.00, и расшифровка всё равно проходит успешно. Вычисляйте MAC от IV и шифротекста и проверяйте его перед расшифровкой — например, с помощью генератора HMAC.
Записывайте все параметры в спецификацию интерфейса
«Зашифровано SM4» — это не спецификация. Запишите режим, дополнение, способ кодирования ключа и IV, кодировку открытого текста и то, в hex или в Base64 передаётся шифротекст.
Не держите настоящие ключи на веб-страницах и в исходном коде
Пользуйтесь этой страницей с тестовыми ключами. Боевым ключам место в системе управления ключами или в аппаратном модуле безопасности: они должны загружаться во время выполнения, а не вставляться вручную и не попадать в коммиты.

Частые вопросы о шифровании SM4

Почему расшифровка SM4 завершается ошибкой дополнения или выдаёт мусор?
Расшифровка срабатывает, только когда всё совпадает со стороной шифрования: байты ключа, режим, IV, дополнение и то, как записан шифротекст (hex или Base64). Полученная ошибка — «bad decrypt», исключение о дополнении или экран мусора — не говорит, что именно не так, а некоторые библиотеки вместо ошибки возвращают пустой результат. Всё равно вставьте сюда шифротекст, ключ и IV. Если расшифровка не удалась, страница перебирает все сочетания кодировки шифротекста, формата ключа, режима, IV и дополнения — включая ключи, которые библиотека молча обрезала до 16 байт, и открытый текст в кодировке GBK, — и перечисляет варианты, дающие читаемый текст, отмечая те, у которых сошлось дополнение PKCS#7. Если неверно выходят только первые 16 байт, ключ и режим правильные, а IV — нет.
Какой длины ключ SM4 и может ли он быть 256-битным?
Ключ SM4 — ровно 128 бит, то есть 16 байт, столько же, сколько блок. GB/T 32907 определяет только эту длину ключа; SM4 с 192- или 256-битным ключом не существует. Если от вас требуют 256-битный ключ SM4, проверьте, не посчитали ли 32-значную hex-строку как 32 символа по 8 бит каждый. Шестнадцать байт можно записать как 32 hex-цифры или как 16 ASCII-символов, и путаница между этими записями — самая частая ошибка с ключом: 0123456789abcdeffedcba9876543210, прочитанная как hex, — это 16 байт, а та же строка, прочитанная как текст, — 32 байта, и её отклоняют. Переключатель формата и счётчик байтов рядом с полем ключа нужны именно для того, чтобы это поймать.
Что такое IV в SM4 и какой длины он должен быть?
IV (вектор инициализации) — 16-байтовое значение, которое подмешивается в первый блок в режимах CBC, CTR, CFB и OFB; ECB его не использует. Он должен быть ровно 16 байт — 32 hex-цифры или 16 ASCII-символов, — поэтому при ошибке длины IV проверьте, не прочитана ли 32-значная hex-строка как 32 байта текста. IV не секретен, но не должен повторяться при одном и том же ключе: генерируйте его случайно и передавайте вместе с шифротекстом, часто — перед ним. Неверный IV в CBC обычно не вызывает ошибки и искажает только первые 16 байт. Некоторые библиотеки молча используют IV из одних нулей, если он не задан (sm-crypto-v2, tjfoc/gmsm в Go), а BouncyCastle в Java генерирует случайный — и если этот IV не сохранён вместе с шифротекстом, расшифровать его не сможет никто.
Чем отличаются режимы SM4 ECB и CBC и какой выбрать?
Используйте CBC (или CTR) со свежим случайным IV для каждого сообщения. ECB шифрует одинаковые 16-байтовые блоки в одинаковые блоки шифротекста, поэтому повторяющаяся структура данных проступает в шифротексте. Выбирайте ECB только для обмена с системой, которая уже его использует. Учтите, что ни один из режимов не обнаруживает подмену: если это важно, передавайте также MAC от IV и шифротекста — например, вычисленный генератором HMAC.
Какое дополнение выбрать для SM4: PKCS5Padding, PKCS#7, дополнение нулями или без дополнения?
PKCS#7 всегда добавляет от 1 до 16 байт, каждый из которых содержит число добавленных байтов, поэтому получатель может однозначно его удалить. Для 16-байтового блочного шифра вроде SM4 PKCS5Padding в Java — то же самое дополнение: BouncyCastle пропускает оба названия через один и тот же код. Дополнение нулями добавляет 0x00 только до ближайшей границы блока. При расшифровке Hutool и BouncyCastle удаляют все завершающие 0x00, включая нулевые байты, которые на самом деле были частью данных, а gmssl в Python удаляет только один. Без дополнения вход должен состоять из целого числа 16-байтовых блоков. CTR, CFB и OFB — потоковые режимы и никогда не используют дополнение. Если расшифрованный текст заканчивается лишними пробелами, квадратиками или переводами строк, дополнение не было удалено: данные с PKCS#7, расшифрованные без дополнения, сохраняют в конце n байт со значением n (0x09, 0x0A и 0x0D выглядят как табуляции и переводы строк); переключите вывод на Hex и посмотрите на последний блок.
Какой длины шифротекст SM4 и можно ли по нему определить режим?
Считайте в байтах. С PKCS#7 в ECB или CBC открытый текст округляется вверх до ближайшего кратного 16, а сообщение, длина которого уже кратна 16, получает ещё один полный блок: 5 или 15 байт превращаются в 16, а 16 байт — в 32. Дополнение нулями добивает только до ближайшего кратного 16, без дополнения длина сохраняется, а шифротекст в CTR, CFB и OFB ровно такой же длины, как открытый текст. Hex удваивает число байтов; Base64 занимает 4 × ⌈байты / 3⌉ символов, так что 16 байт — это 24 символа, 32 — 44, а 64 — 88. Если IV передаётся перед шифротекстом, прибавьте 16 байт. Сам по себе шифротекст режим не выдаёт, но помогают две подсказки: длина, не кратная 16, почти исключает ECB или CBC с дополнением, а два одинаковых 16-байтовых блока указывают на ECB. Если сомневаетесь, вставьте его на вкладку расшифровки — автодиагностика переберёт режимы за вас.
Даёт ли SM4 каждый раз один и тот же шифротекст и почему у другого инструмента он другой?
ECB — или любой режим с фиксированным IV — при одинаковых ключе и открытом тексте каждый раз даёт один и тот же шифротекст; со свежим случайным IV результат меняется при каждом запуске, как и должно быть. Помимо этого, сравните режим, дополнение, то, как был прочитан ключ — как hex или как текст, — в какой кодировке был открытый текст (в большинстве кода UTF-8, но GBK, если старый Java-код вызывает getBytes() в китайской Windows) и как выведен результат: Base64, hex в нижнем регистре или hex в верхнем регистре. При одинаковых настройках и фиксированном IV две корректные реализации дают одинаковый результат. Если подозреваете один из инструментов, сначала проверьте оба по тестовому вектору GB/T 32907.
Как проверить, что моя реализация SM4 корректна?
Начните с двух векторов из приложения A стандарта GB/T 32907-2016. Когда и ключ, и открытый текст равны 0123456789abcdeffedcba9876543210, однократное шифрование должно дать 681edf34d206965e86b3e94f536e4246, а миллион шифрований подряд — 595298c7c6fd271f0402f804c33d3f66. Они проверяют только сам блочный шифр, поэтому затем зашифруйте какой-нибудь текст в CBC с фиксированными ключом и IV и сравните результат с этой страницей или с командой OpenSSL, которую она показывает. Движок этой страницы проверен на обоих векторах и сверен с OpenSSL 3 во всех пяти режимах.
Умеет ли OpenSSL шифровать и расшифровывать SM4?
Да. OpenSSL 3 поддерживает SM4 в режимах ECB, CBC, CFB, OFB и CTR. Используйте openssl enc -sm4-cbc -K <32 hex digits> -iv <32 hex digits>: -K принимает необработанный ключ в hex, так что пароль не участвует, -nopad отключает PKCS#7, а -base64 -A читает или пишет Base64 в одну строку. Обратите внимание на две вещи: просто -sm4 означает CBC, а значение -K неверной длины обрезается или дополняется нулями лишь с предупреждением. Панель OpenSSL на этой странице собирает команду из текущих настроек; в openssl enc нет дополнения нулями, поэтому панель так и сообщает, вместо того чтобы печатать команду, которая не совпадёт с результатом.
Как расшифровать шифротекст SM4 из Java (Hutool) или JavaScript (sm-crypto)?
Сначала выясните, какие режим и дополнение на самом деле использует другая сторона, — часто код об этом умалчивает. SmUtil.sm4(key) из Hutool передаёт только имя SM4, а BouncyCastle подставляет ECB с PKCS#7 (PKCS5Padding в Java); CBC означает только полная строка вроде SM4/CBC/PKCS5Padding. В JavaScript sm-crypto тоже по умолчанию использует ECB, принимает ключ как 32-значную hex-строку и выводит hex в нижнем регистре, а gm-crypt по умолчанию работает в CBC, принимает текстовый ключ из 16 символов и выводит Base64. Затем проверьте кодировку открытого текста: строковые методы Hutool всегда используют UTF-8, но голый getBytes() на JDK 17 и более ранних версиях в китайской Windows может означать GBK, а это меняет шифротекст. Выберите библиотеку в списке Настройки как в библиотеке, чтобы выставить всё это одним нажатием, или введите параметры вручную; если в чём-то нет уверенности, всё равно вставьте шифротекст — автодиагностика переберёт сочетания режима, дополнения, IV и кодировки.
Надёжен ли SM4 и загружаются ли мои данные?
Как алгоритм SM4 использует 128-битный ключ и 32 раунда; в RFC 8998 (2021) сказано, что на момент написания для SM4 не было известно ни слабых ключей, ни проблем с безопасностью. Практические риски связаны с тем, как его применяют: ECB раскрывает закономерности в данных, а CBC не обнаруживает подмену. Что касается этой страницы, ничего не загружается. В браузерах нет встроенного SM4, поэтому страница несёт собственную реализацию SM4 и выполняет её локально; можно открыть вкладку «Сеть» и убедиться, что ни один запрос не уходит, или отключиться от интернета и продолжать работать. Поэтому инструмент подходит для тестовых данных, отладки и обучения. Но веб-страница от этого не становится правильным местом для боевых ключей: им место в системе управления ключами или в аппаратном модуле, а не в текстовом поле на каком бы то ни было сайте.
Чем SM4 отличается от AES?
Оба — блочные шифры со 128-битными блоками, и режимы с дополнением работают для них одинаково, — именно поэтому ошибки совместимости SM4 выглядят точно так же, как у AES. SM4 выполняет 32 раунда и имеет единственный размер ключа — 128 бит; AES-128 выполняет 10 раундов, а у AES есть ещё 192- и 256-битные ключи. SM4 — национальный стандарт Китая GB/T 32907-2016, а с 2021 года — часть международного стандарта ISO/IEC 18033-3 наряду с AES; его применяют там, где требуется китайская коммерческая криптография. AES — стандарт NIST FIPS 197. Для AES воспользуйтесь инструментом шифрования AES.

Похожие инструменты

Все инструменты →

Инструмент расшифровки AES — совместим с OpenSSL и CryptoJS

Безопасность

Расшифровывайте AES онлайн — GCM/CBC/CTR, парольная фраза или необработанный ключ, автоматическое определение формата OpenSSL и CryptoJS «U2FsdGVkX1». Работает на 100% в браузере, ключи никогда не покидают страницу.

Инструмент шифрования AES — GCM, CBC и CTR

Безопасность

Бесплатное онлайн-шифрование AES — AES-128/192/256, GCM/CBC/CTR, парольная фраза (PBKDF2) или необработанный ключ. Работает на 100% в браузере, ничего не загружается на сервер.

Генератор и проверка bcrypt-хешей

Безопасность

Создавайте и проверяйте bcrypt-хеши паролей онлайн — настраиваемый фактор стоимости, префиксы $2b$/$2a$/$2y$. 100% в браузере; пароль никуда не отправляется.

Калькулятор контрольной суммы CRC

Безопасность

Вставьте текст или шестнадцатеричные байты и получите все 63 варианта CRC-8, CRC-16 и CRC-32 сразу. Контрольная сумма не сходится? Введите её — инструмент назовёт вариант: MODBUS, CCITT-FALSE, XMODEM, KERMIT. Всё в браузере.

HMAC генератор и проверка подписи

Безопасность

Бесплатный онлайн-генератор и верификатор HMAC. Вычисляйте HMAC-SHA256/SHA1/SHA384/SHA512 с ключами в Text, Hex или Base64 и выводом в Hex/Base64/Base64URL. Всё в браузере — ключи не покидают страницу.

Декодер JWT

Безопасность

Декодируйте JWT-токены онлайн бесплатно. Просмотр header, payload, signature, срока действия, алгоритма и claims. 100% в браузере — токен не покидает устройство. Без регистрации.