第一次接触国密算法时,看到 SM2、SM3、SM4 这一串编号,很容易以为它们是同一个算法的不同版本,或者是按强度递增排列的。实际上三者解决的是三类完全不同的问题——非对称加密与签名、哈希摘要、对称加密。用错场合会直接导致方案不可用。
SM4:对称分组密码
SM4 是分组密码,用于加密数据,标准号 GB/T 32907-2016。
它的分组长度和密钥长度都是 128 位(16 字节),采用 32 轮非平衡 Feistel 结构。使用时需要配合模式(ECB、CBC、CFB、OFB、CTR)和填充方式,与 AES 的使用方式一致。
它解决的问题是机密性:让没有密钥的人无法读懂数据内容。
对称的含义是加密和解密使用同一把密钥。这意味着密钥的传递必须通过安全渠道,或者用非对称算法来协商——这就引出了 SM2。
SM2:椭圆曲线公钥算法
SM2 是基于椭圆曲线密码学的公钥算法,标准号 GB/T 32918,用于数字签名、密钥交换和公钥加密。
它属于非对称算法:有一对密钥,公钥可以公开,私钥自己保存。用公钥加密的数据只能用私钥解密,用私钥签名的数据可以用公钥验证。
椭圆曲线算法的优势是在同等安全强度下密钥更短。SM2 使用 256 位密钥,其安全强度大致相当于 3072 位的 RSA。更短的密钥意味着更快的运算和更小的存储与传输开销。
SM2 在国密体系里承担两类职责。一是数字签名*,用于身份认证和数据完整性验证;二是*密钥交换,用于在通信双方之间协商出一个共享的对称密钥。
后一个用途解释了 SM2 和 SM4 的配合关系:在国密 TLS 连接建立时,双方用 SM2 完成身份认证和密钥协商,得到一把对称密钥;后续的数据传输则用 SM4 加密,因为对称算法速度远快于非对称算法。
SM3:密码杂凑算法
SM3 是哈希(杂凑)算法,标准号 GB/T 32905-2016,输出 256 位摘要。
它的功能与 SHA-256 对应:把任意长度的输入压缩成固定长度的摘要,用于完整性校验、消息认证和数字签名中的消息摘要。
SM3 在国密体系里通常不单独使用,而是作为 SM2 签名的组成部分——签名时先对消息计算 SM3 摘要,再对摘要做签名运算。它也可以用于构造 HMAC-SM3,做带密钥的消息认证。
需要注意的是,SM3 和 SM4 的编号相邻,但用途完全不同。SM3 不可逆,不能用来加密数据;SM4 可逆,不能用来做摘要。混淆这两者会导致方案设计错误。
三者如何配合
把三类算法放在一起,可以看清一个完整的国密安全方案是怎么搭起来的。
假设要在两个系统之间安全地传输一份数据,流程大致是:
先由一方发起连接,双方通过 SM2 做密钥协商,各自验证对方的身份(签名用 SM2 加 SM3 摘要),协商出一把会话密钥。
然后用这把会话密钥配合 SM4 加密实际的数据,完成机密性保护。
最后,如果需要确认数据在传输过程中没有被篡改,可以用 SM3(或 HMAC-SM3)计算摘要并校验。
整个流程里,SM2 解决「和谁通信、密钥怎么安全产生」,SM4 解决「数据怎么加密」,SM3 解决「怎么验证数据没被改动」。三者分工明确,缺一不可。
| 算法 | 类型 | 用途 | 对应国际算法 |
|---|---|---|---|
| SM2 | 椭圆曲线公钥算法 | 签名、密钥交换、公钥加密 | ECDSA / ECDH |
| SM3 | 哈希(杂凑) | 摘要、完整性校验、消息认证 | SHA-256 |
| SM4 | 对称分组密码 | 数据加密 | AES |
实践中的常见误解
第一个误解是「SM4 是 SM2 的升级版」。两者类型不同,不存在版本关系。
第二个误解是「用了 SM4 就算完成了国密改造」。如果密钥分发还在用 RSA 或者还在走明文信道,整个方案仍然不满足国密要求——非对称环节也必须换成 SM2。
第三个误解是「SM3 可以用来加密」。哈希不可逆,它只能校验,不能保护机密性。
第四个误解是「浏览器脚本实现的国密就满足合规」。国密改造要求使用经过国家密码管理局认证的密码模块或密码机,浏览器里的 JavaScript 实现只适合联调和演示,不能用于正式业务。
检查清单
- SM2 是非对称公钥算法,负责签名与密钥交换
- SM3 是哈希算法,输出 256 位摘要,负责完整性与消息认证
- SM4 是对称分组密码,分组与密钥都是 128 位,负责数据加密
- 三者在方案里分工不同,不存在替代关系
- 完整的国密方案需要三者配合,只换对称算法不算完成改造
- 正式业务的国密实现应使用经过认证的密码模块,而非浏览器脚本