Длина ключа SM4
16 байт Ровно 128 бит: 16 байт, записанные как 32 hex-цифры или 16 ASCII-символов. Ключей SM4 длиной 192 или 256 бит не бывает.
Шифрование и расшифровка SM4 онлайн. Не расшифровывается — найдёт, что не так: режим, дополнение, IV или кодировка, и предложит исправление. Всё в браузере, без загрузки. ECB, CBC, CTR, CFB, OFB; PKCS#7, нули или без дополнения.
ECB шифрует одинаковые блоки в одинаковый шифротекст и раскрывает закономерности — используйте его только для обмена с системой, которая этого требует.
CTR, CFB и OFB — потоковые режимы: дополнения нет, а шифротекст той же длины, что и открытый текст.
Автодиагностика
—
Нужен OpenSSL 3. Команда содержит введённый ключ.
| Ключ | 0123456789abcdeffedcba9876543210 |
|---|---|
| Открытый текст | 0123456789abcdeffedcba9876543210 |
| Шифротекст, 1 шифрование | 681edf34d206965e86b3e94f536e4246 |
| Шифротекст, 1 000 000 шифрований | 595298c7c6fd271f0402f804c33d3f66 |
Написано и проверено разработчиками, которые создают криптографические инструменты. Каждый шифротекст и каждое число байтов на этой странице вычислены движком инструмента и проверены тестами.
16 байт Ровно 128 бит: 16 байт, записанные как 32 hex-цифры или 16 ASCII-символов. Ключей SM4 длиной 192 или 256 бит не бывает.
681edf34d206965e86b3e94f536e4246 При ключе и открытом тексте 0123456789abcdeffedcba9876543210 однократное шифрование даёт 681edf34d206965e86b3e94f536e4246.
32 раунда Блоки по 16 байт (128 бит), шифрование в 32 раунда.
первые 16 байт Нет. Неверно расшифровываются только первые 16 байт, а дополнение в последнем блоке по-прежнему проходит проверку.
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 Если расшифровка не удалась, страница перебирает кодировку шифротекста, формат ключа, режим, IV, дополнение и кодировку текста и показывает настройки, при которых получается читаемый текст.
Одно нажатие выставляет настройки по умолчанию OpenSSL, Hutool, sm-crypto, gm-crypt или tjfoc/gmsm — библиотек, которые не сходятся даже в том, означает ли просто «SM4» режим ECB или CBC.
ECB, CBC, CTR, CFB и OFB с PKCS#7, дополнением нулями или без дополнения. Открытый текст может быть в UTF-8 или в GBK — кодировке, которую выдаёт старый Java-код в китайской Windows. GCM не поддерживается.
Сгенерируйте случайный 16-байтовый ключ или IV одним нажатием или введите его так, как он записан в вашем коде. Счётчик байтов в реальном времени подтверждает, что байт ровно 16, ещё до того, как вы начнёте искать другие причины.
Оба результата из приложения A приведены в таблице и загружаются одним нажатием, так что любую реализацию SM4 можно сверить со стандартом.
К каждому результату прилагается команда openssl enc, которая его воспроизводит, — можно проверить результат в терминале или передать команду коллеге.
Движок SM4 выполняется локально. Ключи и данные не покидают страницу, а инструмент продолжает работать офлайн.
openssl enc)-sm4 = CBC -sm4 — псевдоним -sm4-cbc. -K и -iv принимают hex, PKCS#7 остаётся включённым, пока не передан -nopad, а на выходе — сырые байты, если не добавить -base64 -A. -K неверной длины обрезается или дополняется нулями лишь с предупреждением.
SmUtil.sm4(key)Hutool передаёт голое SM4, которое BouncyCastle выполняет как ECB с PKCS#7 (в JCE это называется PKCS5Padding). Строковые методы используют UTF-8, а encryptHex выводит hex в нижнем регистре. Для CBC используйте new SM4(Mode.CBC, Padding.PKCS5Padding, key, iv).
Cipher.getInstance("SM4")Если режиму нужен IV, а его не передали, шифрование молча генерирует случайный IV, а расшифровка выбрасывает no IV set when one expected, — поэтому шифротекст, при шифровании которого этот IV не сохранили, нельзя расшифровать нигде.
sm4.encrypt(data, key) по умолчанию использует ECB с PKCS#7, ожидает ключ в виде 32-значной hex-строки и возвращает hex в нижнем регистре. Режим меняет только mode: 'cbc'; любое другое значение молча оставляет ECB. sm-crypto-v2 ведёт себя так же, но берёт IV из одних нулей, если в CBC не передан iv.
По умолчанию работает в CBC, принимает ключ и IV как строки UTF-8 из 16 символов и возвращает Base64. Ключ, байты которого не являются корректным UTF-8, передать ему вообще невозможно.
CryptSM4Режим выбирается вызовом crypt_ecb или crypt_cbc. set_key читает только первые 16 байт, поэтому более длинный ключ молча обрезается, а неверный ключ обычно возвращает пустые байты вместо ошибки.
sm4Sm4Cbc использует IV уровня пакета, который остаётся нулевым, пока не вызван SetIV, дополняет по PKCS#7 даже в CFB и OFB и отбрасывает ошибки снятия дополнения — неверный ключ возвращает nil без ошибки.
Ключ 0123456789abcdeffedcba9876543210, открытый текст (hex) 0123456789abcdeffedcba9876543210
681edf34d206965e86b3e94f536e4246
Это пример 1 из приложения A стандарта GB/T 32907-2016: ключ и открытый текст — одно и то же 128-битное значение, и однократное шифрование даёт 681edf34d206965e86b3e94f536e4246. Если шифровать результат повторно — всего миллион раз, — получится 595298c7c6fd271f0402f804c33d3f66. Оба значения приведены в таблице тестовых векторов на этой странице и вычислены тем же движком, которым вы пользуетесь. Кнопка Тестовый вектор GB/T 32907 загружает первый из них.
Ключ 0123456789abcdeffedcba9876543210, IV fedcba98765432100123456789abcdef, открытый текст: SM4 interop test: order 20260911-0042
Wi6BuLpov8RndEfedUyLXFvDRnLMoo7T6O04Q83IzKDuDvPQ2S5clq+cEQXMvy/y
Открытый текст занимает 37 байт в UTF-8. PKCS#7 дополняет его до 48 байт — трёх 16-байтовых блоков, которые в Base64 записываются 64 символами. Кнопка Загрузить пример подставляет ровно эти значения, а панель OpenSSL показывает команду, которая воспроизводит ту же строку Base64 в терминале.
Шифротекст из предыдущего примера, расшифрованный с IV 00000000000000000000000000000000
16 байт мусора, затем ": order 20260911-0042"
CBC подмешивает IV только в первый блок, а дополнение PKCS#7 находится в последнем, поэтому проверка дополнения проходит, и OpenSSL не выдаёт никакой ошибки. Эта страница замечает нечитаемый первый блок и сообщает, что ключ и режим верны, а проблема в IV — или что первые 16 байт шифротекста сами являются IV.
Если известна библиотека на другой стороне, выберите её в списке «Настройки как в библиотеке». Иначе выберите «Шифрование» или «Расшифровка» и подберите режим и дополнение. У потоковых режимов (CTR, CFB, OFB) дополнения нет, поэтому для них переключатель дополнения неактивен.
Оба — ровно 16 байт. Выберите формат, в котором записана строка, — hex, текст или Base64 — и дождитесь, пока счётчик байтов станет зелёным. Кнопки «Случайный» генерируют новые значения.
Для шифрования введите текст (UTF-8 или GBK) или вставьте байты в hex. Для расшифровки вставьте шифротекст и укажите, в Base64 он или в hex. Результат обновляется по мере ввода.
Скопируйте вывод или нажмите «Расшифровать этот шифротекст», чтобы перенести его на вкладку расшифровки с теми же ключом и IV. Панель OpenSSL показывает команду, которая воспроизводит результат.
Диагностика перечисляет настройки, при которых ваши данные расшифровываются в читаемый текст. Примените любую из них одним нажатием или прочитайте пояснение, если не расшифровываются только первые 16 байт, — это указывает на IV.
32-символьная hex-строка — это 16 байт, только если декодировать её как hex. Прочитанная как текст, она занимает 32 байта, и SM4 её отклоняет — а в коде, который молча обрезает или дополняет ключи, она превращается в совсем другой ключ.
Ключ (текст): 0123456789abcdeffedcba9876543210 -> 32 байта, отклонён
Ключ (hex): 0123456789abcdeffedcba9876543210 -> 16 байт
Обе стороны должны использовать один и тот же режим. Шифротекст CBC, расшифрованный как ECB, даёт мусор в каждом блоке и обычно не проходит проверку дополнения в конце.
шифрование: SM4/CBC/PKCS5Padding расшифровка: SM4/ECB/PKCS5Padding -> bad decrypt
шифрование: SM4/CBC/PKCS5Padding расшифровка: SM4/CBC/PKCS5Padding, тот же IV
В CBC неверный IV не вызывает ошибки: первые 16 байт получаются искажёнными, а остальное расшифровывается нормально. Если испорчено только начало открытого текста, сравните IV.
IV расшифровки 00000000000000000000000000000000 -> 16 байт мусора + ": order 20260911-0042"
IV расшифровки fedcba98765432100123456789abcdef -> "SM4 interop test: order 20260911-0042"
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
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 getBytes() в Java без указания кодировки использует кодировку платформы по умолчанию, а в китайской Windows на JDK 17 и более ранних версиях это GBK. Один и тот же китайский текст тогда шифруется в разный шифротекст, и другая сторона расшифровывает его в кракозябры.
"国密SM4 test".getBytes() // GBK в китайской Windows, JDK <= 17 -> шифротекст ECB 3188d06cf28db70092f8753cbd5ee518
"国密SM4 test".getBytes(StandardCharsets.UTF_8) -> шифротекст ECB d830308b0ae4fa7b9a2b5d59f7f65ca5
pay=100.00 в pay=900.00, и расшифровка всё равно проходит успешно. Вычисляйте MAC от IV и шифротекста и проверяйте его перед расшифровкой — например, с помощью генератора HMAC.0123456789abcdeffedcba9876543210, прочитанная как hex, — это 16 байт, а та же строка, прочитанная как текст, — 32 байта, и её отклоняют. Переключатель формата и счётчик байтов рядом с полем ключа нужны именно для того, чтобы это поймать. PKCS5Padding в Java — то же самое дополнение: BouncyCastle пропускает оба названия через один и тот же код. Дополнение нулями добавляет 0x00 только до ближайшей границы блока. При расшифровке Hutool и BouncyCastle удаляют все завершающие 0x00, включая нулевые байты, которые на самом деле были частью данных, а gmssl в Python удаляет только один. Без дополнения вход должен состоять из целого числа 16-байтовых блоков. CTR, CFB и OFB — потоковые режимы и никогда не используют дополнение. Если расшифрованный текст заканчивается лишними пробелами, квадратиками или переводами строк, дополнение не было удалено: данные с PKCS#7, расшифрованные без дополнения, сохраняют в конце n байт со значением n (0x09, 0x0A и 0x0D выглядят как табуляции и переводы строк); переключите вывод на Hex и посмотрите на последний блок. getBytes() в китайской Windows) и как выведен результат: Base64, hex в нижнем регистре или hex в верхнем регистре. При одинаковых настройках и фиксированном IV две корректные реализации дают одинаковый результат. Если подозреваете один из инструментов, сначала проверьте оба по тестовому вектору GB/T 32907. 0123456789abcdeffedcba9876543210, однократное шифрование должно дать 681edf34d206965e86b3e94f536e4246, а миллион шифрований подряд — 595298c7c6fd271f0402f804c33d3f66. Они проверяют только сам блочный шифр, поэтому затем зашифруйте какой-нибудь текст в CBC с фиксированными ключом и IV и сравните результат с этой страницей или с командой OpenSSL, которую она показывает. Движок этой страницы проверен на обоих векторах и сверен с OpenSSL 3 во всех пяти режимах. 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 нет дополнения нулями, поэтому панель так и сообщает, вместо того чтобы печатать команду, которая не совпадёт с результатом. 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 и кодировки. Безопасность
Расшифровывайте AES онлайн — GCM/CBC/CTR, парольная фраза или необработанный ключ, автоматическое определение формата OpenSSL и CryptoJS «U2FsdGVkX1». Работает на 100% в браузере, ключи никогда не покидают страницу.
Безопасность
Бесплатное онлайн-шифрование AES — AES-128/192/256, GCM/CBC/CTR, парольная фраза (PBKDF2) или необработанный ключ. Работает на 100% в браузере, ничего не загружается на сервер.
Безопасность
Создавайте и проверяйте bcrypt-хеши паролей онлайн — настраиваемый фактор стоимости, префиксы $2b$/$2a$/$2y$. 100% в браузере; пароль никуда не отправляется.
Безопасность
Вставьте текст или шестнадцатеричные байты и получите все 63 варианта CRC-8, CRC-16 и CRC-32 сразу. Контрольная сумма не сходится? Введите её — инструмент назовёт вариант: MODBUS, CCITT-FALSE, XMODEM, KERMIT. Всё в браузере.
Безопасность
Бесплатный онлайн-генератор и верификатор HMAC. Вычисляйте HMAC-SHA256/SHA1/SHA384/SHA512 с ключами в Text, Hex или Base64 и выводом в Hex/Base64/Base64URL. Всё в браузере — ключи не покидают страницу.
Безопасность
Декодируйте JWT-токены онлайн бесплатно. Просмотр header, payload, signature, срока действия, алгоритма и claims. 100% в браузере — токен не покидает устройство. Без регистрации.