什么时候使用
适合对接明确要求国密 SM4 的接口、协议或已有系统。新协议如果没有国密合规要求,应优先选择带认证的 AES-GCM 或 ChaCha20-Poly1305。
快速使用
- 保持默认的 CBC + PKCS7 + Hex,点击“生成密钥和 IV”。
- 输入明文并执行加密。
- 保存密钥、IV 和密文;解密时使用完全相同的模式、填充与编码。
工具说明
这个工具使用 128 位 SM4 分组密码加解密 UTF-8 文本,支持:
- 工作模式:CBC、ECB。
- 填充:PKCS7、NoPadding。
- 密文编码:Hex、标准 Base64。
页面默认使用 CBC + PKCS7 + Hex。可以在浏览器中同时生成新的 16 字节随机密钥和 CBC IV;输出是原始密文,不会把模式、填充或 IV 自动封装进去。
密钥、IV、明文和密文只在当前浏览器中处理,不会上传或保存。SM4 实现精确使用 [email protected]。
参数说明
密钥
SM4 密钥始终是 128 位,也就是 16 字节。页面使用 Hex 输入,因此规范化后应包含 32 个十六进制字符。
IV
CBC 模式需要 16 字节 IV。IV 不要求保密,但同一密钥下加密不同消息时应使用新的随机 IV,并与密文一起保存。
ECB 模式不使用 IV。
密钥和 IV 的 Hex 输入接受整体 0x、按字节书写的 0x、空格和冒号;页面生成结果固定为连续小写 Hex。
密文编码
- Hex:每个字节使用两个十六进制字符表示,适合协议字段和标准向量。
- Base64:表示相同密文字节,通常更紧凑。
切换编码不会改变 SM4 算法本身。解密时必须选择与输入一致的编码。
Hex 密文也接受整体或按字节的 0x、空格和冒号;Base64 密文使用标准 Base64。
填充模式
PKCS7
PKCS7 会把明文补齐到 16 字节分组边界。即使明文已经是 16 的倍数,也会额外增加一个完整填充分组。
解密时页面严格检查每个 PKCS7 填充字节。错误密钥、IV、模式或被修改的密文通常会导致填充或 UTF-8 校验失败。
NoPadding
NoPadding 不增加也不移除字节,因此 UTF-8 明文字节数必须是 16 的倍数,密文字节数也必须是 16 的倍数。
NoPadding 不提供错误密钥检测。某些错误参数可能仍产生一段字节结果,因此调用方不能把“成功输出”当作认证通过。
模式选择
| 模式 | IV | 重复分组结构 | 建议 |
|---|---|---|---|
| CBC | 16 字节 | 隐藏 | 默认使用,但需要额外 MAC 检测篡改 |
| ECB | 不使用 | 暴露 | 仅用于标准向量或兼容明确要求的旧系统 |
CBC 和 ECB 都不提供消息认证。生产协议应使用独立 MAC,或者采用已经定义认证机制的安全协议。
常见问题
为什么 SM4 只能使用 16 字节密钥?
SM4 标准固定使用 128 位密钥,不提供类似 AES-192 或 AES-256 的其他密钥长度。
为什么 NoPadding 加密中文容易报长度错误?
页面按 UTF-8 字节数检查分组,不按 JavaScript 字符数检查。中文和 Emoji 通常占多个 UTF-8 字节。
CBC 的 IV 可以复用吗?
同一密钥下不应复用 IV 加密不同消息。本工具生成随机 IV,但不会自动把 IV 封装进密文,需要自行一并保存。
为什么修改密文后有时仍能解密?
CBC 和 ECB 没有认证能力,不能可靠检测篡改。PKCS7 或 UTF-8 校验只能发现部分错误,不能代替 MAC。
密钥和内容会上传吗?
不会。随机参数生成、加密、解密和复制都在当前浏览器中完成。