国密算法简介:SM2/SM3/SM4/SM9介绍、密码学基本概念归纳总结

密码学基础:你需要的核心概念

在接触具体算法前,我觉得有必要把几个基本概念先捋清楚。很多人在项目中犯晕,其实就是这些基础没打牢。

概念一句话解释
哈希函数把任意长度的消息压缩成固定长度的摘要。不可逆、防篡改。
对称加密加密和解密用同一把钥匙。快,但钥匙怎么安全传递是个问题。
非对称加密一把公钥、一把私钥。公钥加密,私钥解密。私钥签名,公钥验签。
数字签名用私钥对消息摘要进行签名,证明身份和防止抵赖。
密钥交换双方在不安全的通道上协商出一个共享的对称密钥。
标识密码直接用用户的身份标识(比如邮箱、手机号)作为公钥。这个在SM9里会用到。
个人习惯:我一般把哈希函数比作“指纹”——文件内容变一点点,指纹就完全不一样了。你想想看,这样的特性天然适合做完整性校验。

SM3:国密哈希算法

SM3就是我们国家自己的哈希算法。输出长度256位,也就是32字节的摘要。说实话,它的安全性与SHA-256相当,但算法细节上更优。

  • 用于消息的完整性校验。
  • 用于数字签名的消息摘要生成。
  • 通常和SM2搭配使用。

输入消息 → SM3压缩 → 256位摘要。我曾在一个接口安全加固项目里,用SM3对请求参数做签名,完美解决了参数被中间人篡改的问题。

SM3算法的核心:消息分组、迭代压缩、置换函数。这些理论看起来复杂,但实际编码时直接用现成的库就行。

SM4:国密对称加密算法

SM4是对称分组密码算法,分组长度128位,密钥长度也是128位。它的结构类似于AES,但用的是不同的S盒和线性变换。

参数项SM4AES-128
分组长度128位128位
密钥长度128位128位
迭代轮数32轮10轮
S盒自定义国密S盒AES S盒
我曾经踩过坑:SM4有多种工作模式(ECB、CBC、CTR、GCM等),千万别用ECB模式。它相同的明文会输出相同的密文,安全性堪忧。我推荐GCM模式,它不仅加密,还能做认证。

为什么需要对称加密?因为它快!在大量数据传输的场景下,非对称加密几乎不可用。实际项目中,我们通常用SM2交换密钥,然后用这个密钥去加密业务数据。

SM2:国密椭圆曲线公钥密码算法

SM2是基于椭圆曲线密码学(ECC)的,但它的曲线参数是独立设计的,不是标准的NIST曲线。SM2能做的事情很多:

  1. 加密/解密:公钥加密,私钥解密。
  2. 数字签名:私钥签名,公钥验签。
  3. 密钥交换:双方协商出对称密钥。

我记得在一个金融项目中,客户系统之间传输敏感数据,服务端先用SM2公钥加密会话密钥,客户端再用私钥解开。双方随后用这个会话密钥进行SM4对称加密通信。

SM2的私钥长度256位,公钥长度512位。它的安全强度等同于RSA-2048,但计算速度更快、资源占用更小。

SM9:国密标识密码算法

SM9算是个另类。它不需要数字证书,公钥就是用户的标识(比如手机号、邮箱)。这是怎么做到的?双线性对运算。

  • 私钥由密钥生成中心(KGC)根据用户的标识生成。
  • 加密时直接传入接收方的标识,不需要预先交换公钥。
  • 签名时也一样,用私钥签,任何人通过标识就能验签。

说实话,SM9在RESTful接口中应用得不多,但它在物联网或点对点通信的场景下非常方便。你想想看,不需要管理证书,直接拿设备序列号当公钥,多省事。

知识体系结构图

下面这张图能帮你把四者的关系和分工看清楚。我习惯在脑子里先搭好这个框架,再去深入了解每个算法。

国密算法知识体系 密码学基础概念 SM3 哈希算法 SM4 对称加密 SM2 非对称密码 SM9 标识密码 完整性校验 数字签名摘要 大数据量加密 混合加密方案 密钥交换 数字签名与认证 标识认证 无证书加密 实际RESTful接口中,SM2+SM3或SM4+SM3的组合使用最多

对了,这张图里的箭头只是表示“从基础到具体算法再到应用场景”的逻辑关系,不是调用关系。

避坑指南:算法选型建议

我强烈建议:别去手写国密算法的底层实现。市面上有很多成熟的Java/Python/Golang库,比如GmSSL、BC(Bouncy Castle)的国密扩展包,直接调用就好。自己从零实现,出错的概率非常非常高。
我的教训:有一次为了追求“纯国产”,我在一个项目里全部强制使用SM9。但后来发现客户端的SDK根本不支持双线性对运算,适配成本极大。现在我会先评估客户端的实现能力,再决定用SM2还是SM9。