国密算法简介:SM2/SM3/SM4/SM9介绍、密码学基本概念归纳总结
密码学基础:你需要的核心概念
在接触具体算法前,我觉得有必要把几个基本概念先捋清楚。很多人在项目中犯晕,其实就是这些基础没打牢。
| 概念 | 一句话解释 |
|---|---|
| 哈希函数 | 把任意长度的消息压缩成固定长度的摘要。不可逆、防篡改。 |
| 对称加密 | 加密和解密用同一把钥匙。快,但钥匙怎么安全传递是个问题。 |
| 非对称加密 | 一把公钥、一把私钥。公钥加密,私钥解密。私钥签名,公钥验签。 |
| 数字签名 | 用私钥对消息摘要进行签名,证明身份和防止抵赖。 |
| 密钥交换 | 双方在不安全的通道上协商出一个共享的对称密钥。 |
| 标识密码 | 直接用用户的身份标识(比如邮箱、手机号)作为公钥。这个在SM9里会用到。 |
个人习惯:我一般把哈希函数比作“指纹”——文件内容变一点点,指纹就完全不一样了。你想想看,这样的特性天然适合做完整性校验。
SM3:国密哈希算法
SM3就是我们国家自己的哈希算法。输出长度256位,也就是32字节的摘要。说实话,它的安全性与SHA-256相当,但算法细节上更优。
- 用于消息的完整性校验。
- 用于数字签名的消息摘要生成。
- 通常和SM2搭配使用。
输入消息 → SM3压缩 → 256位摘要。我曾在一个接口安全加固项目里,用SM3对请求参数做签名,完美解决了参数被中间人篡改的问题。
SM3算法的核心:消息分组、迭代压缩、置换函数。这些理论看起来复杂,但实际编码时直接用现成的库就行。
SM4:国密对称加密算法
SM4是对称分组密码算法,分组长度128位,密钥长度也是128位。它的结构类似于AES,但用的是不同的S盒和线性变换。
| 参数项 | SM4 | AES-128 |
|---|---|---|
| 分组长度 | 128位 | 128位 |
| 密钥长度 | 128位 | 128位 |
| 迭代轮数 | 32轮 | 10轮 |
| S盒 | 自定义国密S盒 | AES S盒 |
我曾经踩过坑:SM4有多种工作模式(ECB、CBC、CTR、GCM等),千万别用ECB模式。它相同的明文会输出相同的密文,安全性堪忧。我推荐GCM模式,它不仅加密,还能做认证。
为什么需要对称加密?因为它快!在大量数据传输的场景下,非对称加密几乎不可用。实际项目中,我们通常用SM2交换密钥,然后用这个密钥去加密业务数据。
SM2:国密椭圆曲线公钥密码算法
SM2是基于椭圆曲线密码学(ECC)的,但它的曲线参数是独立设计的,不是标准的NIST曲线。SM2能做的事情很多:
- 加密/解密:公钥加密,私钥解密。
- 数字签名:私钥签名,公钥验签。
- 密钥交换:双方协商出对称密钥。
我记得在一个金融项目中,客户系统之间传输敏感数据,服务端先用SM2公钥加密会话密钥,客户端再用私钥解开。双方随后用这个会话密钥进行SM4对称加密通信。
SM2的私钥长度256位,公钥长度512位。它的安全强度等同于RSA-2048,但计算速度更快、资源占用更小。
SM9:国密标识密码算法
SM9算是个另类。它不需要数字证书,公钥就是用户的标识(比如手机号、邮箱)。这是怎么做到的?双线性对运算。
- 私钥由密钥生成中心(KGC)根据用户的标识生成。
- 加密时直接传入接收方的标识,不需要预先交换公钥。
- 签名时也一样,用私钥签,任何人通过标识就能验签。
说实话,SM9在RESTful接口中应用得不多,但它在物联网或点对点通信的场景下非常方便。你想想看,不需要管理证书,直接拿设备序列号当公钥,多省事。
知识体系结构图
下面这张图能帮你把四者的关系和分工看清楚。我习惯在脑子里先搭好这个框架,再去深入了解每个算法。
对了,这张图里的箭头只是表示“从基础到具体算法再到应用场景”的逻辑关系,不是调用关系。
避坑指南:算法选型建议
我强烈建议:别去手写国密算法的底层实现。市面上有很多成熟的Java/Python/Golang库,比如GmSSL、BC(Bouncy Castle)的国密扩展包,直接调用就好。自己从零实现,出错的概率非常非常高。
我的教训:有一次为了追求“纯国产”,我在一个项目里全部强制使用SM9。但后来发现客户端的SDK根本不支持双线性对运算,适配成本极大。现在我会先评估客户端的实现能力,再决定用SM2还是SM9。