第1章 国密算法概述

说实话,一提到国密算法,不少开发者的第一反应就是“又一套新轮子”。但我这几年带着团队做密码算法迁移,遇到的实际问题远比想象中复杂。我记得2018年有个项目,客户要求将RSA签名全部换成SM2,结果迁移完才发现SM2的密钥格式、签名流程和RSA差别很大,差点延期交付。从那以后,我养成了一个习惯:不管迁移什么算法,先把它跟国际算法的对应关系彻底摸清楚。

1.1 SM系列算法体系

国密算法不是孤立的,而是一整套密码“工具箱”。目前主流的有SM2、SM3、SM4、SM9,覆盖了公钥加密、数字签名、哈希、对称加密、标识密码等多个领域。我个人习惯把它们分成三个层次:

  • 公钥密码层:SM2(椭圆曲线公钥密码)、SM9(标识密码)
  • 对称密码层:SM4(分组密码)
  • 哈希与杂凑层:SM3(密码杂凑算法)

你想想看,一个完整的密码体系需要同时支撑加密、签名、摘要、密钥协商这些功能。国密正好覆盖了所有场景,而且设计上对标了国际主流标准——但绝不是简单拷贝。举个例子,SM2的椭圆曲线参数是重新设计的,安全性比同级别的NIST P-256曲线更保守。

国密算法 类型 国际对应算法 主要用途
SM2 椭圆曲线公钥密码 RSA / ECDSA 加密、数字签名、密钥交换
SM3 哈希算法 SHA-256 数据完整性校验、消息摘要
SM4 分组对称密码 AES (128位) 数据加密、链路加密
SM9 标识密码 IBE / CLC 无证书公钥加密、签名

1.2 发展背景

为什么要有国密?说白了就是“自主可控”。以前大量信息系统依赖国外密码算法,一旦国际标准被禁用或出现后门,风险不可控。2010年以后,国家密码管理局陆续发布了SM系列标准,强制要求金融、政务、关键基础设施等领域逐步替换。

我在做金融系统迁移时深有体会。当时一个支付核心用了AES-128加密交易报文,迁移到SM4后需要修改底层密码库、调整密钥生命周期、还要验证性能是否达标。嗯,这里要注意:SM4的密钥扩展和AES完全不同,不能直接替换算法名就完事。我记得有同事直接换了算法接口,结果密钥长度不匹配导致解密失败,踩了个大坑。

避坑指南:我曾经在迁移SM2签名时,忽略了国际算法中对摘要长度的隐式要求。SM2签名前需要对消息做SM3哈希,但有些原有流程直接用了SHA-256,导致验签失败。后来我写了一个检查清单:算法类型 → 密钥格式 → 签名/加密流程 → 输出编码,每次迁移都对照走一遍。

1.3 与国际算法对应关系

对应关系不是简单的1:1替换。我画了一张结构图,看完你会更清楚:

国密算法体系与国际算法对应关系 国密算法体系 SM2 (ECC) SM3 (Hash) SM4 (对称) SM9 (标识) ECDSA / RSA SHA-256 AES-128 IBE / 无证书体系 说明 • SM2和RSA/ECDSA都是公钥密码,但SM2的曲线参数和密钥格式不同 • SM3与SHA-256输出都是256位,但内部压缩函数和填充规则有差异

从图中你应该能看出来:SM2对应RSA和ECDSA,SM3对应SHA-256,SM4对应AES,SM9对应IBE/无证书体系。但注意,SM2和ECDSA虽然底层都是椭圆曲线,但SM2的签名标准(GM/T 0003-2012)采用了不同的数字签名生成流程。我遇到过一个案例:对方把SM2签名值直接按DER编码解析,结果失败——因为SM2签名用的是自定义格式。

特别提醒:不要以为“算法名换成国密”就完事了。密钥长度、分组模式、填充方式、编码格式都得仔细核对。我见过最典型的错误是SM4用ECB模式直接替换AES-CBC,结果丢失了IV向量,安全性降级。

讲到这里,你应该对SM系列算法有个整体认识了。嗯,其实就是把国际算法换成了中国自己的实现,核心理念没变,但细节处处都是坑。后面几章我会带你逐个击破这些迁移难题。