SM4 加密 / 解密

加密 / 解密 明文 → 密文
密钥、向量与明文只在浏览器本地参与运算,不会发送到服务器。 SM4 是我国商用密码标准(GB/T 32907-2016)的分组密码,分组与密钥都是 128 位; 它与 AES-128 分组长度相同但算法完全不同,两者互不兼容,密文不能互相解密。
结果
填好密钥与向量后点「加密」,结果会显示在这里
在线国密 SM4 加解密工具,128 位密钥与分组,支持 ECB、CBC、CFB、OFB、CTR 模式与 PKCS#7 等填充,内置国标测试向量,浏览器本地完成。

工具简介

SM4 是我国商用密码标准中的分组密码算法,标准号为 GB/T 32907-2016*(原名 SMS4,最初作为无线局域网标准 WAPI 的配套算法公布)。它的分组长度与密钥长度都是 **128 位(16 字节)**,与 AES-128 的分组长度相同,但算法结构完全不同,*两者的密文互不兼容。

SM4 采用 32 轮非平衡 Feistel 结构,加解密使用同一套轮函数,只是轮密钥顺序相反,因此硬件实现非常紧凑,广泛用于国密 TLS、金融 IC 卡、政务专网等场景。

使用步骤

  1. 「密钥」填写 16 字节(128 位),可以按文本输入,也可以切成 Hex 粘贴 32 位十六进制字符。
  2. 选择加密模式与填充方式。除 ECB 之外的所有模式都需要 16 字节向量(IV)。
  3. 输入明文点「加密」;切到「解密」粘贴密文再点「解密」即可还原。
  4. 密文支持 Hex* 与 *Base64 两种编码。

参数说明

参数可选值说明
密钥长度16 字节(固定)128 位,与分组等长
分组长度16 字节(固定)128 位
模式ECB / CBC / CFB / OFB / CTR与 AES 的模式语义相同
填充PKCS#7 / ZeroPadding / ANSI X9.23 / NoPadding流式模式不使用填充
向量 IV16 字节ECB 不使用,其余模式必填

标准测试向量

可以用下面这组官方向量验证实现是否正确(GB/T 32907-2016 附录 A.1):

  • 密钥:0123456789abcdeffedcba9876543210
  • 明文:0123456789abcdeffedcba9876543210
  • 模式:ECB + NoPadding
  • 密文:681edf34d206965e86b3e94f536e4246

把密钥与明文切成 Hex 输入、模式选 ECB、填充选 NoPadding,结果应当与上面的密文完全一致。

与 AES 的关系

  • 相同点:分组都是 128 位,都能搭配 ECB / CBC / CFB / OFB / CTR 等模式,填充规则也一样。
  • 不同点:轮函数、S 盒、密钥扩展完全不同,同一把 16 字节密钥在两者下得到的密文毫无关系。
  • 因此如果服务端用的是国密 SM4,前端不能用 AES 顶替;反过来也一样。

与 OpenSSL 命令行的对应关系

OpenSSL 1.1.1 及以上版本内置了 SM4,下面的命令与本工具等价:

  • 加密:openssl enc -sm4-cbc -K 0123456789abcdeffedcba9876543210 -iv 000102030405060708090a0b0c0d0e0f -in plain.txt -out cipher.bin
  • 解密:openssl enc -d -sm4-cbc -K 0123456789abcdeffedcba9876543210 -iv 000102030405060708090a0b0c0d0e0f -in cipher.bin -out plain.txt

-K 与 -iv 都是 32 位十六进制字符(16 字节)。OpenSSL 默认使用 PKCS#7 填充,与本工具的默认值一致。

本工具的实现方式

页面里的 SM4 是按 GB/T 32907-2016 用 JavaScript 实现的 crypto-js 分组密码插件,复用了 crypto-js 的 ECB / CBC / CFB / OFB / CTR 模式与四种填充,因此使用体验与其他对称加密工具完全一致。S 盒与系统参数取自国标,并已用官方测试向量逐字节校验;加密与解密结果也与 PHP OpenSSL 的 sm4-* 系列算法做过逐字节对照。

安全提示

  • SM4 是合规的国产商用密码算法,涉及国密改造的项目应当使用经过认证的密码模块,而不是浏览器脚本。
  • 本工具适合临时加解密、接口联调与教学演示,所有运算都在浏览器本地完成,密钥与数据不会离开你的设备。
  • 生产环境请优先选择带认证的模式(如 GCM)或「SM4 + HMAC」的组合,避免只做加密不做完整性校验。

常见问题 FAQ

这个工具能用于国密改造项目吗?

它适合接口联调、临时加解密与教学演示。正式的国密改造应使用经过国家密码管理局认证的密码模块或密码机,而不是浏览器脚本。

密文用 Hex 还是 Base64?

两者只是同一段字节的不同表示。Hex 便于逐字节比对,Base64 更短、适合放进 JSON 或数据库字段;解密时必须与加密时选择相同。

NoPadding 模式有什么限制?

明文长度必须是 16 字节的整数倍,否则本工具会直接报错;解密时密文长度同样必须是 16 字节的整数倍。

为什么解密后末尾多出了一些字符?

多半是填充方式不匹配。请确认加密端使用的填充(PKCS#7 / ZeroPadding / ANSI X9.23)与解密端一致。

SM4 是加密算法还是哈希算法?

SM4 是对称分组密码,用于加密数据;国密体系中的哈希算法是 SM3,两者用途不同,不能混用。

SM4 与 AES 相比性能如何?

在通用 CPU 上两者同量级,AES 因为有专门的硬件指令(AES-NI)通常更快;SM4 的优势在于算法公开、结构简单、硬件实现面积小,适合嵌入式与国产密码模块。

向量 IV 应该填几位?

16 字节。SM4 的分组是 128 位,因此 IV 与分组等长;ECB 模式不需要向量。

支持哪些加密模式与填充?

模式支持 ECB、CBC、CFB、OFB、CTR;填充支持 PKCS#7、ZeroPadding、ANSI X9.23、NoPadding。CFB / OFB / CTR 是流式模式,不使用填充。

密钥和明文会被上传到服务器吗?

不会。SM4 由页面里的 JavaScript 在浏览器本地实现,密钥、向量、明文、密文都不会离开你的设备。

怎么验证这个工具的实现是正确的?

用国标测试向量:密钥与明文都填 0123456789abcdeffedcba9876543210,模式选 ECB、填充选 NoPadding,密文应当等于 681edf34d206965e86b3e94f536e4246。

SM4 和 AES 能互相解密吗?

不能。两者分组长度相同,但轮函数、S 盒与密钥扩展完全不同,同一把 16 字节密钥得到的密文毫无关系,密文互不兼容。

SM4 的密钥和分组长度是多少?

都是 128 位(16 字节)。SM4 采用 32 轮非平衡 Feistel 结构,标准号为 GB/T 32907-2016。