1. 国密算法概述
各位同学好,我是老周。做嵌入式安全这行十几年了,今天咱们聊聊国密算法。说实话,我刚入行那会儿,国内基本都在用国际算法——RSA、AES、ECC这些。直到2010年以后,国家密码管理局陆续发布了SM系列标准,情况才开始变化。
我个人习惯把国密算法看作一套「自主可控的密码工具箱」。为什么这么说?你想想看,从底层数学原理到上层接口规范,全部是我们自己定义的。这在某些关键领域——比如金融、政务、电力——是硬性合规要求。
核心观点:国密不是「重新发明轮子」,而是在国际密码学成果基础上,结合国内安全需求和合规要求,形成的一套完整密码标准体系。
1.1 国密标准体系介绍
国密标准目前覆盖了密码学的主要领域。我按功能分类给大家梳理一下:
| 算法 | 类型 | 密钥长度 | 主要用途 | 对标国际算法 |
|---|---|---|---|---|
| SM2 | 椭圆曲线公钥密码 | 256位 | 密钥交换、数字签名、加密 | ECC / RSA |
| SM3 | 密码杂凑(哈希) | 256位输出 | 完整性校验、数字摘要 | SHA-256 |
| SM4 | 分组对称密码 | 128位 | 数据加密/解密 | AES |
| SM9 | 基于标识的密码 | 256位 | 无证书加密、签名 | IBC(Identity-Based Cryptography) |
嗯,这里要注意——SM2和SM9虽然都基于椭圆曲线,但底层数学结构不同。SM2用的是标准椭圆曲线群,SM9用的是双线性对(Weil对/Tate对)。我在项目中遇到过有人把SM2和SM9的密钥混用,结果签名验证死活过不了。所以这两个算法不能互换。
SM2:国密的主力公钥算法
SM2基于椭圆曲线离散对数难题,曲线参数是国密局定义的256位素域曲线。我个人觉得SM2的设计很务实——它同时支持加密、签名和密钥交换三种功能,一套密钥对就能搞定。
举个例子,SM2签名算法中有一个关键步骤:生成随机数k,计算椭圆曲线点(x1, y1) = kG,然后r = (e + x1) mod n。这个流程跟ECDSA类似,但细节上有差异。我曾经在移植SM2到ARM Cortex-M4平台时,发现随机数生成器质量不够,导致签名重复——嗯,这是个坑,后面章节会详细讲。
SM3:国密哈希标准
SM3输出256位摘要,结构上类似SHA-256,但消息扩展和压缩函数不同。SM3的压缩函数有64轮迭代,比SHA-256的64轮更复杂一些。从安全强度看,SM3的256位输出提供128位抗碰撞安全级别,跟SHA-256持平。
个人经验:SM3在嵌入式平台上的性能表现不错。我在STM32F4上做过测试,SM3的吞吐量大约能达到SHA-256的80%~90%。对于大多数固件完整性校验场景,这个性能完全够用。
SM4:国密对称加密
SM4是分组密码,分组长度128位,密钥长度128位。结构上采用32轮非线性迭代,每轮使用一个32位轮密钥。说白了,SM4的设计思路跟AES不同——AES是SPN结构,SM4是Feistel网络结构。
我记得有一次帮客户做物联网网关的加密模块,他们原本用AES-128-CBC,要换成SM4-CBC。算法替换本身不难,但IV管理和填充方式必须对齐。SM4的PKCS7填充跟AES完全一样,这点倒是省了不少事。
SM9:基于标识的密码
SM9是国密体系中比较「年轻」的算法,2016年才发布标准。它的最大特点是不需要数字证书——直接用用户的标识(比如邮箱、手机号、设备ID)作为公钥。这在物联网场景下特别有用,省去了证书管理的开销。
但SM9的代价是计算量大。双线性对运算比普通椭圆曲线点乘慢一个数量级。我在项目中测试过,SM9签名验证在Cortex-A7上大约需要15ms,而SM2只需要2ms。所以SM9适合低频次、高安全要求的场景,不适合高频数据加密。
1.2 国密与国际算法的对比
很多同学问我:「国密比国际算法安全吗?」我的回答是:从数学基础上看,两者处于同一安全级别。256位SM2的安全强度相当于3072位RSA,也相当于256位ECC。但安全不等同于实现安全——算法实现的质量、密钥管理的严谨性,往往比算法本身更重要。
我整理了一个对比表,方便大家理解:
| 对比维度 | 国密算法 | 国际算法 | 我的评价 |
|---|---|---|---|
| 数学基础 | 椭圆曲线、双线性对 | 大整数分解、椭圆曲线 | 同级别 |
| 密钥长度 | SM2: 256位 | RSA: 2048/3072位 | SM2更高效 |
| 性能 | SM4: 约300MB/s (软件) | AES: 约500MB/s (软件) | AES略快,但差距不大 |
| 生态成熟度 | 中等,工具链在完善 | 成熟,OpenSSL等广泛支持 | 国际算法更成熟 |
| 合规性 | 国内强制要求 | 国际通用 | 看应用场景 |
避坑指南:我曾经在一个项目中,客户要求「国密合规」,但他们的硬件加密引擎只支持AES。后来我们不得不在软件层实现SM4,性能损失了约40%。所以选型阶段就要确认硬件是否支持国密算法,否则后面会很被动。
1.3 国密算法的应用场景与合规要求
国密算法的应用场景,说白了就两类:合规驱动和安全驱动。
合规驱动场景:
- 金融IC卡、POS机、ATM
- 政务信息系统、电子政务外网
- 电力调度系统、智能电表
- 社保、医保信息系统
- 网络安全等级保护三级及以上系统
安全驱动场景:
- 物联网设备固件安全更新
- 车联网V2X通信
- 工业控制系统加密传输
- 移动支付安全模块
合规要求这块,我建议大家关注几个关键文件:
- 《中华人民共和国密码法》——2019年发布,明确了商用密码的合规要求
- GM/T 系列标准——国密算法的具体技术规范
- 等保2.0——三级及以上系统要求使用国密算法
- 金融行业标准——JR/T 系列,金融领域必须使用国密
我在做固件保护方案时,经常遇到一个问题:客户说「我们要国密合规」,但具体合规到什么程度?是算法层面合规,还是整个密码系统合规?这里有个关键点——算法合规不等于系统合规。你用了SM4加密,但密钥存储不安全,照样过不了合规审查。
建议:做国密方案时,从一开始就考虑密钥生命周期管理——生成、分发、存储、使用、销毁,每个环节都要有安全措施。我在一个项目中吃过亏,SM2私钥直接明文存在Flash里,审查时直接被打了回来。后来改用安全芯片存储私钥,才通过审查。
1.4 国密算法知识体系总览
下面这张图是我自己整理的国密算法知识体系,涵盖了算法分类、应用场景和合规要求。大家先有个整体印象,后面章节会逐一深入。
这张图把国密算法的知识体系分成了六个层次。从顶层的标准体系,到底层的实施要点,每一层都有对应的课程章节。我个人建议初学者先掌握SM2和SM4,这两个是国密方案中最常用的算法。SM3相对简单,可以穿插着学。SM9比较特殊,建议在理解SM2之后再接触。
好了,第一章的内容就到这里。国密算法不是洪水猛兽,说白了就是一套有中国特色的密码工具箱。后面我们会一步步深入每个算法的实现细节,以及在固件保护中的具体应用。大家先把基础概念理清楚,后面实战才不会懵。