国密算法体系全景:SM2/SM3/SM4 标准简介与对比
说实话,很多开发朋友第一次接触国密,心里第一反应就是:“又要学一堆新东西?” 别急。我这些年从 RSA 转向 SM2,从 SHA-1 转向 SM3,从 AES 转向 SM4,最大的感受是——国密并不是重新发明轮子,而是针对现有算法做了更安全的定制。
咱们先快速扫一眼这三个核心算法的定位:
- SM2 —— 非对称加密,对标 RSA 和 ECDSA。基于椭圆曲线,但比 RSA 更轻量。
- SM3 —— 哈希算法,对标 SHA-256。输出 256 位摘要。
- SM4 —— 对称加密,对标 AES。分组密码,密钥长度 128 位。
我个人习惯把这仨记成“公钥加密+哈希+私钥加密”的三件套。项目里一旦要用国密,基本这三样都要上。
SM2:不仅是替换 RSA,更是性能升级
SM2 是国家密码管理局发布的椭圆曲线公钥密码算法。它的核心优势在哪?我记得以前做证书签名,RSA-2048 的签名长度 256 字节,而 SM2 签名长度只有 64 字节。嗯,省了 75% 空间。
与国际算法对比:
| 特性 | SM2 | RSA-2048 | ECDSA(P-256) |
|---|---|---|---|
| 密钥长度 | 256 位 | 2048 位 | 256 位 |
| 签名长度 | 64 字节 | 256 字节 | 64 字节 |
| 签名速度 | 快 | 较慢 | 快 |
| 安全强度 | 128 位 | 112 位 | 128 位 |
注意:SM2 用的曲线是 sm2p256v1,和国际上 NIST P-256 不同。在实际接口改造中,不能互换密钥,必须用国密标准封装。
我在一个政务对接项目里踩过坑:对方接口文档写“SM2 签名”,但我们生成的是 DER 格式,而对方要求原始 RS 字节流。后来发现是标准实现习惯的差异。所以改造前一定确认好编码格式。
SM3:摘要算法,比 SHA-256 更抗碰撞
SM3 输出 256 位,处理消息分组方式与 SHA-256 类似,但压缩函数和消息扩展不一样。实际上,SM3 在设计上对碰撞攻击有更强的抵抗能力。
对比:
| 特性 | SM3 | SHA-256 | SHA-1 |
|---|---|---|---|
| 输出长度 | 256 位 | 256 位 | 160 位 |
| 安全强度 | 128 位 | 128 位 | 80 位(已不安全) |
| NIST 认可 | 否 | 是 | 否 |
| 国内使用 | 必选 | 允许但逐步替换 | 已禁用 |
SHA-1 已经正式被攻破,任何新系统都不该再用。如果你还在用 SHA-1 做完整性校验,赶紧换 SM3 或 SHA-256。
我曾经给一个加密机做适配,发现 SM3 的初始化向量与 SHA-256 不同,如果直接替换哈希函数而不改 Hmac 计算方式,结果全错。所以改造时要逐字段校验,不能盲目改库。
SM4:对称加密,AES 的国产替代
SM4 是分组加密,分组长度 128 位,密钥长度 128 位。结构上是 Feistel 网络,和 AES 的 SPN 结构不同。加解密速度相当,但实现方式不同。
AES 与 SM4 核心参数对比:
| 参数 | SM4 | AES-128 |
|---|---|---|
| 分组大小 | 128 位 | 128 位 |
| 密钥长度 | 128 位 | 128 位 |
| 轮数 | 32 轮 | 10 轮 |
| 结构 | Feistel | SPN |
| 硬件实现 | 较好(国产芯片支持) | 较好(国际芯片支持) |
实际项目中,SM4 加解密性能和 AES-128 相当。但要注意模式:SM4 通常配合 GCM 模式做认证加密,而 AES 也常用 GCM。这点反而让改造相对平滑——只要换底层算法,上层模式不用改。
我记得在做金融数据加密改造时,对方要求用 SM4-CBC 配合 PKCS7 填充,但默认国密库不带 PKCS7,需要手动实现。差点掉坑。
它们各自适合什么场景?
- SM2:适合数字签名、密钥交换、证书签发。替代 RSA 和 ECDSA。在电子政务、金融、CA 系统中是主力。
- SM3:适合消息完整性校验、数字证书摘要、HMAC。替代 SHA-256。在签名验签链中用来计算 hash。
- SM4:适合大量数据的对称加密。替代 AES。例如数据库加密、文件加密、传输层加密。
如果你做一个完整的国密改造项目,通常的链路是:SM2 签名用 SM3 做 hash,SM4 加密通信内容。三者互补,缺一不可。
下面这张图可以帮你一目了然地看清单个算法的定位和它们之间的关系:
我建议新人这样记:SM2 负责“身份”,SM3 负责“验真”,SM4 负责“保密”。联合起来就是一套完整的密码学解决方案。
最后说一句,如果你正要做接口加密改造,先搞清楚你替换的是哪个国际算法。别把 SM2 当成对称加密用,也别让 SM4 去做签名——这是项目里经常看到的笑话。好啦,这一章就到这儿,拿着这个框架去读具体的标准文档,会轻松很多。