1. 国密算法概述

各位同学好,我是老张。做信息安全这行快十五年了,今天咱们聊聊国密算法。说实话,我刚入行那会儿,国内用的全是国际算法——RSA、AES、SHA这些。直到2010年左右,国家开始推自己的算法标准,我才真正开始接触SM2、SM3、SM4。

国密算法,说白了就是国家密码管理局制定的一套商用密码标准。它不是某一个算法,而是一整套体系。我习惯把这套体系分成三块:公钥密码、对称密码、哈希算法。正好对应SM2、SM4、SM3。

核心观点:国密算法不是替代国际算法,而是提供一套自主可控的密码选择。在金融、政务、关键基础设施领域,国密已经是强制要求。

1.1 国密算法体系介绍

先看一张整体架构图,我画了张SVG,把国密算法的家族关系理清楚了。

国密算法体系架构 国密算法体系 公钥密码 对称密码 哈希算法 SM2(椭圆曲线) SM4(分组密码) SM3(密码杂凑) 密钥交换 / 数字签名 公钥加密 数据加密 / 解密 128位分组密码 消息摘要 / 完整性校验 256位输出 SM2 基于椭圆曲线,SM4 是分组密码,SM3 输出 256 位摘要 三者组合构成完整的身份认证密码体系

这张图我建议你存下来。每次做国密方案设计时,先对着这张图想清楚:我要用哪一层、哪个算法、解决什么问题。

1.2 SM2 / SM3 / SM4 详解

SM2 椭圆曲线公钥密码

SM2 是国密体系里的公钥算法,基于椭圆曲线。我记得2012年第一次在项目中用SM2时,最头疼的是曲线参数配置。SM2用的是256位的素域椭圆曲线,具体参数在GMT 0003-2012标准里写得清清楚楚。

SM2 能干三件事:

  • 数字签名——身份认证的核心,我签了名,你不能抵赖
  • 密钥交换——双方协商一个对称密钥,中间人拿不到
  • 公钥加密——用公钥加密,私钥解密

个人经验:SM2 签名速度比 RSA-2048 快不少,但验签速度略慢。做身份认证方案时,我建议把签名放在客户端(比如手机端),验签放在服务端。这样用户体验好,服务端压力也扛得住。

SM4 分组对称密码

SM4 是国标的对称加密算法,分组长度128位,密钥长度也是128位。说白了,它和AES是同一类东西,但轮函数设计不一样。SM4用了32轮非线性迭代,结构上更像AES的变种。

SM4 的加密模式和我们熟悉的AES一样:

  • ECB(电子密码本模式)——不推荐,相同明文得到相同密文
  • CBC(密码分组链接模式)——需要IV,我最常用的模式
  • CTR(计数器模式)——可以并行,适合大数据量
  • GCM(伽罗瓦计数器模式)——带认证,推荐用于身份认证场景

避坑指南:我曾经在一个项目中看到有人用SM4的ECB模式加密用户身份令牌。结果相同用户每次登录生成的令牌都一样,攻击者直接重放攻击就进来了。记住:身份认证场景下,至少用CBC模式,最好用GCM模式。

SM3 密码杂凑算法

SM3 输出256位(32字节)的摘要值。它和SHA-256的输出长度一样,但内部结构不同。SM3采用了Merkle-Damgård结构,消息分组512位,压缩函数64轮。

SM3 在身份认证中的典型用法:

  1. 对用户密码做SM3摘要,存摘要不存明文
  2. 对消息做SM3摘要,验证完整性
  3. 在数字签名中,先对消息做SM3摘要,再对摘要签名

1.3 与国际算法的对比

很多同学问我:国密算法和国际算法到底差在哪?安全性够不够?我直接上表格,一目了然。

对比维度 国密算法 国际算法 我的评价
公钥算法 SM2(256位椭圆曲线) RSA-2048 / ECDSA SM2 安全强度≈RSA-3072,密钥更短
对称算法 SM4(128位分组) AES-128/256 安全强度相当,SM4轮数更多(32轮 vs 10/14轮)
哈希算法 SM3(256位输出) SHA-256 安全强度相当,SM3设计更保守
算法公开 完全公开,国标文档可查 完全公开 两者都是公开算法,不存在黑盒问题
专利风险 无专利问题 部分算法有专利限制 国密在商用上更省心
性能 SM2签名快,验签慢;SM4与AES相当 RSA验签快;AES硬件加速成熟 国密在软件实现上略慢,硬件加速正在追赶

说实话,从密码学强度来看,国密算法和国际算法处于同一安全级别。SM2 256位椭圆曲线的安全强度,相当于RSA 3072位。SM3和SHA-256都是256位输出,抗碰撞能力相当。

但有一个现实问题:国际算法有几十年的硬件加速积累。Intel的AES-NI指令集、ARM的Cryptography扩展,都原生支持AES和SHA。国密算法目前主要靠软件实现,性能上会吃亏一些。不过,现在国产CPU(如飞腾、鲲鹏)已经开始内置国密指令集了,这个差距在缩小。

1.4 国密算法的应用场景

国密算法不是实验室里的东西,它已经在大量真实场景中落地了。我挑几个典型的说说。

场景一:金融支付

银联的IC卡、手机闪付、网上银行,底层用的都是国密算法。你刷银行卡时,SM2在做签名认证,SM4在加密交易数据,SM3在验证完整性。我参与过某银行的手机银行改造项目,把RSA+3DES替换成SM2+SM4,整个过程花了三个月,核心是密钥管理体系的迁移。

场景二:电子政务

政府公文流转、电子证照、数字签章,必须用国密。这是合规要求,没得选。我记得有个省级政务平台,每天处理上百万次SM2签名验签,服务端用了几台国产密码机做硬件加速,扛住了压力。

场景三:物联网身份认证

智能电表、车联网、工业传感器,这些设备资源受限,但需要身份认证。SM2的密钥比RSA短,SM4的软件实现比AES轻量,SM3的代码量比SHA-256小。我在一个智能水表项目中,用SM2做设备身份认证,SM4加密采集数据,SM3做固件完整性校验,整套方案跑在ARM Cortex-M4上,内存占用不到64KB。

场景四:VPN和网络安全

IPSec VPN、SSL VPN现在都支持国密套件。我测试过某厂商的国密VPN网关,SM2密钥交换 + SM4数据加密 + SM3完整性校验,性能比国际算法套件慢约15%,但完全可用。

关键结论:国密算法已经覆盖了身份认证、数据加密、完整性校验、数字签名等所有核心密码学场景。在合规要求严格的行业,国密不是可选项,是必选项。

1.5 本章小结

这一章我们理清了国密算法的全貌。SM2做公钥操作,SM4做对称加密,SM3做哈希摘要。三者组合起来,就能构建一套完整的身份认证方案。和国际算法相比,国密在安全强度上不输,在合规性上更有优势,在性能上正在追赶。