3、算法标准与规范解读:NIST标准、国密标准(GM/T)、RFC文档的阅读方法
做密码算法移植,第一件事不是写代码,而是读标准。我见过太多人上来就翻开源码开始改,结果改到一半发现算法参数搞错了,或者填充方式不对,又回头重来。说白了,标准就是算法的「宪法」,所有实现都得按它来。
这一章我就聊聊怎么读三类最常见的密码标准:NIST标准、国密GM/T标准、以及RFC文档。嗯,这里要注意,读标准是有方法的,不是从头到尾啃一遍就完事。
3.1 三类标准的定位与差异
先搞清楚这三类标准各自管什么:
| 标准类型 | 发布机构 | 典型编号 | 侧重点 |
|---|---|---|---|
| NIST标准 | 美国国家标准与技术研究院 | FIPS 197, SP 800-38A | 算法规范、安全要求、测试向量 |
| 国密GM/T标准 | 中国国家密码管理局 | GM/T 0002, GM/T 0003 | 算法规范、接口定义、应用模式 |
| RFC文档 | IETF | RFC 1321, RFC 8439 | 协议集成、传输格式、互操作性 |
我个人习惯是:先看NIST或国密标准确定算法本身怎么做,再看RFC确定怎么把算法塞进协议里。举个例子,AES的加解密逻辑看FIPS 197,但AES-GCM怎么组包、nonce放哪、tag怎么算,得看RFC 5288。
核心原则:算法标准管「对不对」,RFC管「通不通」。移植时两个都得看,缺一个就可能踩坑。
3.2 NIST标准阅读方法
NIST标准写得非常规范,但也很啰嗦。一份FIPS文档动辄上百页,你不需要全读。我建议按这个顺序来:
- 先看摘要和范围——确认这个标准是不是你要的算法版本
- 再看符号和定义——搞清楚每个变量名代表什么,比如
K是密钥还是轮密钥 - 核心算法描述——通常有伪代码或流程图,这是移植的直接依据
- 测试向量——附录里一定有,这是验证实现的命根子
我曾经在移植SM4时,就因为没仔细看NIST标准里的字节序定义,把密钥扩展算错了。嗯,那一次debug花了我整整两天。后来我养成了一个习惯:读标准时先把附录里的测试向量跑一遍,确认理解对了再往下走。
小技巧:NIST标准通常有配套的「示例实现」或「参考代码」,虽然不一定高效,但用来对照验证非常有用。我一般会先跑通参考代码,再开始自己的移植。
3.3 国密GM/T标准阅读方法
国密标准跟NIST风格不太一样。GM/T文档更简洁,但有些地方写得不够细。你想想看,国密标准里经常出现「按国家密码管理局相关规定执行」这种话,读起来确实有点头疼。
我总结了几条读国密标准的经验:
- 版本号很重要——GM/T标准有多个版本,比如SM2的签名算法在GM/T 0003-2012和GM/T 0003-2023里就有差异
- 附录是精华——国密标准的附录里经常藏着关键参数和示例数据,别跳过
- 注意「应」和「宜」——标准里「应」是强制要求,「宜」是推荐做法,移植时别搞混
- 接口定义要细读——国密标准对API有明确要求,比如SM3的
SM3_Init、SM3_Update、SM3_Final三件套
避坑指南:我曾经在移植SM2时,发现国密标准里椭圆曲线参数用的是十六进制大数,但RFC里用的是十进制。两个标准对同一个参数的表示方式不一样,移植时一定要做一次转换验证。别问我怎么知道的……
3.4 RFC文档阅读方法
RFC文档跟算法标准最大的区别是:RFC更关注「怎么用」,而不是「怎么做」。比如RFC 8439讲ChaCha20-Poly1305,它不会教你ChaCha20的quarter round怎么实现,而是告诉你数据怎么分组、nonce怎么生成、认证标签怎么计算。
读RFC我一般分三步:
- 看Status of This Memo——确认这个RFC是标准轨还是信息轨,标准轨的才需要严格遵循
- 看Protocol Overview——先理解整体流程,再抠细节
- 看Security Considerations——这里经常藏着实现时容易忽略的安全陷阱
举个例子,RFC 5288里明确写了AES-GCM的nonce长度必须是12字节,如果你用其他长度,虽然算法本身能跑,但安全性会打折扣。这种细节,算法标准里不一定提,但RFC里会强调。
3.5 三类标准的协同阅读策略
实际移植时,你往往需要同时参考多个标准。我画了一张图来说明它们之间的关系:
从这张图能看出来,算法标准(NIST或国密)是基础,RFC是上层应用。移植时先搞定算法本身,再考虑怎么跟协议对接。我一般会先读算法标准里的核心规范部分,然后直接跳到附录看测试向量,确保理解正确。接着读RFC里跟数据格式相关的章节,最后再回头补算法标准里遗漏的细节。
3.6 实战:如何快速定位关键信息
标准文档动辄几百页,你不可能每次都从头读到尾。我分享几个快速定位的技巧:
- 用PDF搜索功能——搜「test vector」「example」「附录」这些关键词
- 关注表格——标准里的表格通常浓缩了最核心的参数,比如S盒、轮常数、密钥长度
- 看变更记录——如果标准有修订版,变更记录里会告诉你哪些地方改了,这往往是坑
- 找参考实现——很多标准会附带参考代码,虽然效率低但正确性有保障
我的习惯:每读一个标准,我会建一个「标准速查表」,把关键参数、测试向量、注意事项整理成表格。移植时直接查表,不用反复翻标准。比如SM4的S盒、密钥扩展轮常数、加解密流程,一张表就搞定。
好了,这一章的内容就这些。记住,读标准不是为了读完,而是为了找到你移植需要的那几个关键信息。学会跳读、精读、对照读,你就能从标准里快速提取出实现所需的全部要素。