国密算法概述

说起国密算法,我刚开始接触的时候,心里其实挺没底的。总觉得“国产”这俩字,意味着要跟国际标准对着干。后来做了几个实际项目才发现——嗯,这事儿没那么复杂。国密算法(SM系列)在效率、安全性和合规性上都有自己的独到之处。今天咱就从头捋一捋:它从哪来,用在哪儿,跟国际上那些主流算法有啥区别。

1.1 国密标准发展背景

早在2010年之前,咱们国内密码领域基本被国际算法包揽。RSA、ECC、SHA-256、AES,哪哪儿都是。但有个隐忧你想想看——金融、政务、能源这些关键基础设施,密码算法全靠外面,一旦出现后门或者被禁运,后果不敢想。

所以国家密码管理局从2009年开始陆续发布SM系列算法标准。我记得最早是SM3密码杂凑算法(GM/T 0004-2012),紧接着SM2椭圆曲线公钥密码算法(GM/T 0003-2012)和SM4分组密码算法(GM/T 0002-2012)也出来了。说白了,就是要建立一套自己的密码体系,做到可控可靠。

算法标准号发布时间类型
SM2GM/T 0003-20122012年公钥密码(椭圆曲线)
SM3GM/T 0004-20122012年密码杂凑(哈希)
SM4GM/T 0002-20122012年分组密码(对称加密)

后来这些算法被陆续纳入国际标准,比如ISO/IEC、IETF。我参与过一个跨境支付的合规审查项目,对方要求必须使用SM2做数字签名——那时候我才意识到,国密已经不只是“国内玩”,国际上也逐渐被认可了。

关键节点:2018年,SM2/SM3/SM4全部成为国家密码行业标准;2020年,SM3成为ISO/IEC国际标准;2021年,SM2/SM4进入国际标准体系。

1.2 SM2/SM3/SM4的应用场景

搞密码算法,最怕闭门造车。我在银行、政务云、车联网项目里都见过这三兄弟,各有各的用武之地。你想想看,一个典型的安全通信链路里,至少需要密钥协商、身份认证、数据加密、完整性校验——刚好对应SM2、SM3、SM4。

  • SM2:主要用于密钥交换、数字签名、证书签发。常见场景:
    • 电子政务中的身份认证、公文签章
    • 金融交易报文的签名验签(比如银联、网联)
    • SSL/TLS国密套件里的密钥协商
  • SM3:哈希算法,用于数据完整性校验、消息摘要、密码存储。典型应用:
    • 区块链中的区块哈希计算(国内联盟链常用SM3)
    • 数字证书中的证书哈希值
    • 密码安全存储(加盐后做SM3)
  • SM4:对称加密,适合大量数据的高速加解密。常见战场:
    • 数据库加密(比如敏感字段透明加密)
    • 网络传输层加密(IPSec、SSL记录层)
    • 磁盘/文件加密(政务信息系统的存储加密)
个人习惯:我一般把SM4当作“国产AES”用,密钥128位,分组128位,轮数32轮,硬实现起来比AES稍微慢一点点,但在软件实现上差距很小。如果是嵌入式设备,SM4的S盒实现反而更省空间。

1.3 与国际算法的对比

很多人爱问:为什么要用SM2而不用ECC?SM3和SHA-256到底谁强?我起初也纠结过这个问题。后来做了一次性能评测,发现国标算法在安全强度上不仅不输,某些方面还略有优势。聊几个关键对比:

功能国密国际主流我的看法
密钥交换/签名SM2(基于椭圆曲线)ECDSA / ECDHSM2的曲线参数是256位素域,安全性对标P-256;但SM2签名算法是改进的,抗侧信道攻击更强。
哈希SM3(256位输出)SHA-256SM3的结构与SHA-256类似,但消息扩展算法不同,SM3碰撞概率估计略低。我在一次等保测评里,客户要求必须用SM3,SHA-256不行。
对称加密SM4(128位分组)AES-128SM4的轮函数与AES不同,硬件实现面积相仿,软件性能AES稍快。但SM4支持更灵活的实现,比如抗攻击的掩码设计。
密钥长度SM2:256位
SM3:256位
SM4:128位
ECC:256位
SHA-256:256位
AES:128/192/256位
除AES支持更长密钥外,其余长度完全相同。
标准化国密系列标准NIST / ISO标准国密近几年国际认可度上升,但国内商用密码合规系统必须使用国密。
避坑指南:我曾经在一个项目里,直接把AES的密钥算法换成SM4,结果性能掉了一大截。后来才发现,SM4的密钥扩展算法和AES完全不同——不能简单“替换实现”。一定要用标准库,或者严格按照GM/T 0002写自己的加解密模块。

另一个容易被忽略的差异:SM2的签名验证速度比ECDSA略慢,因为SM2在验签时多了一次模逆运算。但实际应用中,验签通常比签名少,影响不大。我建议如果你做高频交易签名系统,可以先用SM2做密钥协商,再用SM4加密后续的大量数据——这样既满足了合规要求,性能也过得去。

国密算法体系结构及应用映射 国密SM系列算法 SM2 公钥密码 SM3 密码杂凑 SM4 分组加密 数字签名 密钥协商 数据完整性 密码存储 批量数据加密 说明: • SM2 同时支持数字签名、密钥协商和公钥加密,是最灵活的国密算法。 • SM3 输出256位摘要,在区块链、证书、密码存储中应用广泛。 • SM4 适合大量数据的对称加密,常与SM2配合使用(如TLS国密套件)。 • 实际项目中,三个算法往往组合使用形成完整密码方案。 国际对标:ECC SHA-256 AES-128

从上图能直观看到,国密三兄弟各管一摊,而且在实际项目里经常组合出现。比如一个典型的国密安全通道:先用SM2完成身份认证和密钥协商,再用协商出的临时密钥做SM4加密业务数据,每条消息附带SM3校验码确保没被篡改。我去年在某个政务云平台项目里就是按这个流程做的,顺利通过了密码应用安全性评估。

关于国密算法到底安不安全,我的看法是:只要实现正确、密钥管理到位,安全性够用。SM2的曲线参数经过精心挑选,没有已知的弱曲线问题。SM3的抗碰撞性经过学术界多年检验,至今没有实际攻击。SM4的线性逼近和差分攻击分析也都比较透彻。相比国际算法,国密在国内合规性上更有优势——毕竟《密码法》和等保2.0都强制要求关键系统使用国密。

一个小建议:刚开始封装这三个接口时,别贪多求快。先把SM4的ECB/CBC模式调通,再搞SM3的HMAC,最后啃SM2的签名验签——因为SM2涉及大数运算、点乘、甚至嵌入式随机数,调试起来稍麻烦。我习惯先用Python的gmssl库做原型跑通,再切换到底层C/Go实现。

好了,以上就是国密算法的全景概览。知道了“为什么有国密”“每个算法干什么用”“跟国际算法比怎么样”,接下来的章节就可以掰开揉碎讲怎么封装、怎么优化、怎么应对各种现实坑了。