← 返回加密工具箱

SM4 国密加密指南:与 AES 的区别、合规场景与密钥格式

加密工具箱 · 使用教程

SM4 是中国自主设计的对称加密算法。过去它只出现在政务、金融这类“必须合规”的场景里,现在越来越多普通系统也开始用。这篇文章讲清楚它是什么、和 AES 有什么不同、为什么密钥要写成 32 位十六进制。

一、SM4 是什么

SM4 是国家密码管理局在 2012 年发布的商用密码算法,属于**分组密码**,和 AES 是同一类东西:

项目SM4AES
分组长度128 位(16 字节)128 位(16 字节)
密钥长度固定 128 位128 / 192 / 256 位
轮数32 轮10 / 12 / 14 轮
结构非平衡 FeistelSPN(代换-置换网络)
标准来源中国国密标准美国 NIST 标准
安全性128 位强度128/192/256 位强度

两者分组长度和密钥长度相同,**在纯技术层面安全强度相当**。SM4 没有“比 AES 更强”,它的意义在于自主可控和合规。

二、为什么会有国密

核心原因是**供应链安全**。AES 由美国 NIST 制定,如果完全依赖它,就意味着关键基础设施的加密能力建立在别人的标准之上。国密体系(SM2 非对称、SM3 哈希、SM4 对称)是中国给出的替代方案。

哪些场景必须用国密

如果你是给这些客户做系统,SM4 不是“可选优化”,而是**准入条件**。

普通互联网业务(比如一个工具站、一个电商 App)并不强制要求国密,用 AES 完全没问题。国密的必要性来自合规,不是技术优劣。

三、密钥为什么写成 32 位十六进制

这是使用 SM4 时最常见的困惑。原因是:**SM4 的密钥必须是正好 16 字节**。

16 字节 = 32 个十六进制字符
例如:0123456789abcdeffedcba9876543210
       ↑ 每两个字符 = 1 字节,共 32 字符 = 16 字节 ✓

为什么用十六进制而不用普通字符串?因为十六进制**没有字符集歧义**。

如果用字符串当密钥,比如 "1234567890abcdef",它转换成字节时依赖字符集:

十六进制表示则完全确定:"0a" 永远是一个字节 0x0A,跨语言、跨平台都一致。

四、SM4 的模式

和 AES 一样,SM4 只加密 16 字节的块,长数据要靠模式串联。常用的还是那几种:

模式说明
ECB相同明文块产生相同密文块,泄露数据模式,不要用于生产
CBC需要 IV,串行处理,最常用
CTR需要计数器,可并行,适合大文件

ECB 的问题和 AES-ECB 完全一样:加密一张图片,轮廓依然可见。

另外,SM4 本身只定义分组算法,**模式、填充、IV 的处理方式在国标里另有规定**。做合规对接时,不要自己想当然,一定要问清楚对方用的是哪个国标文件、哪种模式、IV 怎么传——不同实现之间不兼容是常态。

五、怎么用本站工具

  1. 打开加密工具箱的 SM4 标签页
  2. 密钥填 32 位十六进制(16 字节)
  3. 输入明文点「加密」,得到十六进制密文
  4. 解密时密钥必须与加密时完全一致

计算在浏览器本地完成,密钥不会离开你的电脑。

六、常见问题

SM4 比 AES 安全吗?
不是。两者都是 128 位分组、128 位密钥,理论安全强度相当。SM4 的价值在于自主可控和合规准入,不在于“更强”。说“国密更安全”是营销话术,说“国密是合规必需”才是准确表述。
密钥填 16 个普通字符行不行?
看具体工具的实现。本站要求 32 位十六进制,因为这样字节数确定、无字符集歧义。如果你对接的系统接受字符串密钥,务必确认它内部用的是 UTF-8 还是 GBK——这是国密对接最常见的坑之一。
SM4 和 SM2、SM3 是什么关系?
它们是国密体系里三个不同用途的算法,不能互相替代:
SM2 — 非对称加密/签名(对应 RSA/ECDSA)
SM3 — 哈希算法(对应 SHA-256)
SM4 — 对称加密(对应 AES)
为什么我的 SM4 密文和对方算出来的不一样?
按概率排序:模式不同(ECB vs CBC);填充方式不同(PKCS#7 vs 无填充 vs 零填充);IV 不同或没传;密钥字节解释方式不同(hex 字符串 vs 原始字符串)。国密对接失败九成出在这四项。
做等保测评一定需要 SM4 吗?
等保 2.0 的密码应用要求是分级的,并非所有系统都要求国密,具体取决于系统等级和行业要求。稳妥做法是看测评机构的意见书。但如果是金融、政务类项目,基本可以默认需要。
SM4 的性能比 AES 差吗?
纯软件实现下 SM4 通常略慢于 AES,因为 AES 在现代 CPU 上有专门指令集加速(AES-NI),而 SM4 的硬件加速支持较少。对绝大多数业务来说这个差异可以忽略;如果是高吞吐场景,选型时要做压测。