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?我总结三点:
- 存储效率:BootROM里要固化公钥,SM2公钥只有64字节(压缩格式32字节),RSA-3072公钥要384字节。BootROM空间寸土寸金,省下来的空间可以放更多安全逻辑。
- 签名验证速度:安全启动时,每次上电都要验签。SM2验签大约在毫秒级,RSA-3072在几十毫秒级。对于要求快速启动的设备(比如汽车ECU),这个差距很关键。
- 合规性:现在等保2.0、密评都要求使用国密算法。你做一个金融POS机或者政务终端,不用SM2根本过不了检测。
下面这张图,是我自己总结的SM2在安全启动中的定位:
从这张图能看出来,SM2在安全启动中扮演的是签名验证角色。它和SM3摘要、公钥信任链一起,构成了安全启动的三大支柱。缺了任何一个,攻击者都能找到漏洞。
最后说一句,SM2虽然好,但不是万能的。它解决的是公钥密码学层面的安全问题。实际部署时,还要考虑密钥存储(比如用eFuse或OTP)、防侧信道攻击(比如时序攻击、功耗分析)、以及BootROM本身的代码安全。这些内容,咱们后面的章节会逐一展开。