一、国密算法概述

各位做嵌入式固件的同行,咱们今天聊聊国密算法。说实话,我入行那会儿,嵌入式设备里用的基本都是 AES、RSA 这些国际算法。直到后来做某款金融安全模块,客户硬性要求必须用 SM 系列,我才真正开始啃国密标准。这一啃不要紧,发现咱们自己的算法其实设计得很精巧。

国密算法,全称是国家商用密码算法,由国家密码管理局发布。它不是单个算法,而是一整套密码体系。我习惯把它分成三大块:公钥密码、对称密码和哈希算法。下面这张图能帮你快速建立整体认知。

国密算法体系结构 国密算法体系 公钥密码 对称密码 哈希算法 SM2 SM9 SM4 祖冲之 SM1 SM3 SM2 签名 核心说明 • SM2:椭圆曲线公钥密码,用于加密/签名/密钥交换 • SM3:密码杂凑算法,输出256位摘要,类似SHA-256 • SM4:分组对称密码,密钥长度128位,类似AES • SM9:基于标识的密码算法,无需证书管理

1.1 国密算法体系介绍

国密算法目前公开的主要有 SM2、SM3、SM4、SM9 这几个。SM1 和祖冲之算法(ZUC)虽然也是国标,但 SM1 是硬件实现的,不公开算法细节;ZUC 主要用于移动通信的 4G/5G 加密。

咱们做嵌入式固件的,打交道最多的就是 SM2、SM3、SM4。我一个个说。

SM2 — 椭圆曲线公钥密码

SM2 基于椭圆曲线,跟国际上的 ECDSA、ECDH 是同类。但它用的曲线参数是自己定义的,不是 NIST 那条曲线。为什么?说白了,自己定曲线可以避免一些后门风险。我在做安全芯片固件时,SM2 签名验签是必选项,尤其是固件升级的签名校验环节。

SM2 核心参数:

  • 曲线:256 位素域椭圆曲线
  • 签名长度:64 字节(r + s)
  • 加密:公钥加密,私钥解密
  • 密钥交换:类似 ECDH

SM3 — 密码杂凑算法

SM3 输出 256 位(32 字节)的摘要值。你想想看,SHA-256 也是 256 位,但 SM3 的压缩函数设计更复杂一些,安全性理论上更高。我习惯用它做固件完整性校验——烧录前算一遍 SM3,运行时再算一遍,比对一致才允许启动。

SM4 — 分组对称密码

SM4 是 128 位分组、128 位密钥的对称算法。跟 AES 比,它的轮数是 32 轮,比 AES 的 10/12/14 轮多不少。不过别担心性能,SM4 的轮函数结构简单,在 ARM Cortex-M 上跑起来并不慢。我记得有一次在 STM32F4 上优化 SM4,用查表法做到了不到 10 微秒加密一个块。

SM9 — 基于标识的密码

SM9 比较特殊,它不需要数字证书。用户的公钥就是他的标识,比如邮箱、手机号、设备 ID。这在物联网场景下特别方便——省去了证书管理的开销。不过 SM9 的计算量比 SM2 大,资源受限的 MCU 上跑起来有点吃力。

1.2 国密与国际算法对比

很多工程师问我:国密到底比国际算法强在哪?我一般这么回答:不是谁强谁弱的问题,而是设计理念和适用场景不同。下面这张表是我自己整理的,你对比着看就清楚了。

对比维度 国密算法 国际算法
公钥算法 SM2(256位曲线) RSA(2048位)/ ECDSA(256位)
对称算法 SM4(128位密钥) AES(128/192/256位)
哈希算法 SM3(256位摘要) SHA-256
签名速度 SM2 较快(椭圆曲线) ECDSA 相当,RSA 慢
硬件支持 国内芯片普遍集成 全球通用,生态更成熟
合规要求 国内金融/政务/电力强制 国际通用,无国内合规

这里有个坑我得提醒你。我曾经在一个项目里直接用 OpenSSL 的 ECDSA 代码改成 SM2,以为曲线参数一换就行。结果发现 SM2 的签名流程跟 ECDSA 有细微差别——SM2 的签名输出是 (r, s),但计算过程中多了用户标识 Z 值的参与。嗯,这个坑我踩过,后来老老实实按国标 GM/T 0003 重写了签名函数。

避坑指南: 不要简单地把 SM2 当作 ECDSA 的曲线替换版。SM2 的签名验证流程、密钥派生函数、加密填充方式都有独立规范。直接用国际库改参数,大概率通不过商密检测。

1.3 国密在嵌入式领域的应用场景

国密在嵌入式里到底怎么用?我按实际项目经验,给你列几个最常见的场景。

场景一:固件安全升级

这是我最常做的。固件镜像用 SM3 算摘要,然后用 SM2 签名。设备端验签通过才允许烧录。说白了,就是防止恶意固件被刷进去。我做过一个电力采集终端,升级包就是 SM2 签名 + SM4 加密的双重保护。

场景二:安全通信

设备与服务器之间的数据通道,用 SM4 做对称加密,SM2 做密钥协商。类似 TLS 的国密版本——国密 TLCP(传输层密码协议)。我在物联网网关项目里实现过,握手流程跟 TLS 1.2 差不多,只是把密码套件换成了 SM2-SM4-SM3。

场景三:身份认证

设备接入平台时,用 SM2 签名做身份证明。设备持有私钥,平台用公钥验签。这比简单的 MAC 地址认证安全得多。我记得有个智能门锁项目,就是用 SM2 签名来做开锁指令的合法性校验。

场景四:数据存储加密

嵌入式设备里的敏感数据——密钥、证书、日志——用 SM4 加密后存到 Flash。SM4 的加解密速度在 MCU 上完全可以接受。我习惯用 SM4 的 CBC 模式,配合随机 IV,防止数据模式泄露。

个人建议: 如果你的产品要过国密局检测,或者要进政务/金融/电力采购名单,尽早把国密算法加进去。别等到送检前才临时抱佛脚——我见过太多因为 SM2 签名流程不对被打回重测的案例了。