1. SM2算法概述:国密标准背景、椭圆曲线密码学基础与对比分析

各位同学好,我是老周。做嵌入式安全这块十几年了,今天咱们开始聊SM2启动校验与安全启动流程。第一节课,先把SM2算法本身讲透。

SM2这个算法,说白了就是咱们国家自己的公钥密码算法标准。2010年发布,2016年正式成为国标GB/T 32918。为什么要有它?你想想看,以前咱们很多安全芯片、金融终端、物联网设备,用的都是RSA或者国外的ECC。万一哪天人家不给你用了呢?这不是杞人忧天,我在2018年做一个政府项目时,就遇到过国外密码模块突然断供的情况。从那以后,我所有涉及国计民生的项目,密码算法一律用国密。

1.1 国密标准背景

国密标准,全称是“国家商用密码算法标准”。SM2属于椭圆曲线公钥密码算法族,对标的是国际上的ECC(椭圆曲线密码学)。但注意,它不是简单照搬,而是做了很多自主设计。

核心要点:SM2是我国自主设计的椭圆曲线公钥密码算法,用于数字签名、密钥交换和公钥加密。它在安全强度上对标256位ECC,但曲线参数、签名流程、密钥派生方式都有差异。

国密标准体系里,除了SM2,还有:

  • SM3:密码杂凑算法,类似SHA-256,输出256位摘要
  • SM4:分组密码算法,类似AES,用于数据加密
  • SM9:基于标识的密码算法,不需要证书

咱们这门课主要用SM2做签名验证,配合SM3做摘要,实现启动过程中的镜像校验。

1.2 SM2椭圆曲线密码学基础

椭圆曲线密码学,名字听着吓人,其实核心就一句话:在椭圆曲线上找一个点,然后做点乘运算,正向容易反向难。

SM2使用的椭圆曲线方程是:

y² = x³ + ax + b  (mod p)

其中参数是固定的国标参数:

  • p:256位素数
  • a = 0xFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFC
  • b = 0x28E9FA9E9D9F5E344D5A9E4BCF6509A7F39789F515AB8F92DDBCBD414D940E93
  • G:基点,也是固定值
  • n:基点的阶,一个素数

这些参数是公开的,你不需要背,但要知道它们为什么固定。我在一个项目中遇到过有人自己改曲线参数,结果签名验签死活对不上。嗯,这里要注意:SM2的曲线参数是标准化的,不能自己随便改。

SM2的密钥对生成很简单:

  • 私钥d:一个随机数,范围[1, n-2]
  • 公钥P:P = d * G,即私钥乘以基点

为什么说它安全?因为从公钥P反推私钥d,需要解椭圆曲线离散对数问题。目前256位的SM2,安全强度相当于3072位的RSA。你想想看,同样安全等级,SM2的密钥长度只有RSA的十分之一,这对嵌入式设备来说太重要了。

个人经验:我在做一款IoT安全芯片时,Flash只有512KB。如果用RSA-2048,光密钥存储就要占256字节,签名长度256字节。换成SM2,私钥32字节,签名64字节,省出来的空间够放一个轻量级RTOS了。

1.3 SM2与RSA/ECC的对比分析

咱们直接上表格,一目了然:

对比项 SM2 RSA ECC(国际标准)
基础数学问题 椭圆曲线离散对数 大整数分解 椭圆曲线离散对数
同等安全强度密钥长度 256位 3072位 256位
签名长度 64字节 256字节 64字节
签名速度 快 慢 快
验签速度 较快 快 较快
密钥生成速度 极快 慢 极快
标准化程度 国标GB/T 32918 PKCS#1 SECG/NIST
国内合规性 强制要求 部分场景受限 部分场景受限

从表里能看出几个关键点:

  • 密钥长度优势明显:SM2用256位达到RSA 3072位的安全等级,这对嵌入式存储和传输带宽都是巨大利好
  • 签名长度固定:SM2签名永远是64字节,不像RSA签名长度随密钥增长
  • 性能各有千秋:SM2签名快,RSA验签快。但在安全启动场景中,验签是高频操作,SM2的验签速度完全够用

避坑指南:我曾经在一个项目中,把SM2和RSA混用——用SM2签名,用RSA验签。结果发现验签库不支持SM2格式的签名数据,折腾了两天才排查出来。切记:签名和验签必须使用同一套算法和参数,不能混搭。

为什么安全启动场景更推荐SM2而不是RSA?我总结三点:

  1. 存储效率:BootROM里要固化公钥,SM2公钥只有64字节(压缩格式32字节),RSA-3072公钥要384字节。BootROM空间寸土寸金,省下来的空间可以放更多安全逻辑。
  2. 签名验证速度:安全启动时,每次上电都要验签。SM2验签大约在毫秒级,RSA-3072在几十毫秒级。对于要求快速启动的设备(比如汽车ECU),这个差距很关键。
  3. 合规性:现在等保2.0、密评都要求使用国密算法。你做一个金融POS机或者政务终端,不用SM2根本过不了检测。

下面这张图,是我自己总结的SM2在安全启动中的定位:

SM2在安全启动中的核心定位 安全启动目标 镜像完整性校验 + 来源真实性验证 SM2签名验证 SM3摘要 公钥信任链 验签通过 → 镜像可信 摘要比对 逐级验证 → 信任传递 SM2签名验证 + SM3摘要 + 公钥信任链 = 安全启动三大支柱 三者缺一不可,任何一环被绕过都会导致启动安全失效

从这张图能看出来,SM2在安全启动中扮演的是签名验证角色。它和SM3摘要、公钥信任链一起,构成了安全启动的三大支柱。缺了任何一个,攻击者都能找到漏洞。

最后说一句,SM2虽然好,但不是万能的。它解决的是公钥密码学层面的安全问题。实际部署时,还要考虑密钥存储(比如用eFuse或OTP)、防侧信道攻击(比如时序攻击、功耗分析)、以及BootROM本身的代码安全。这些内容,咱们后面的章节会逐一展开。