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

各位同学好,我是老周。做嵌入式安全这行十几年了,今天咱们聊聊SM2。说实话,我刚接触国密那会儿,心里也犯嘀咕——这玩意儿跟国际算法比到底行不行?后来在几个固件保护项目里真刀真枪用下来,才摸透了它的脾气。

这一章,咱们把SM2的来龙去脉、数学底子、以及它跟RSA、ECC的恩怨情仇捋清楚。不扯虚的,全是干货。

1.1 国密标准背景:为什么要有自己的密码算法?

先说说大背景。2010年之前,国内很多安全产品用的都是国际算法,比如RSA、DES、AES。但这里有个隐患——你想想看,如果哪天人家不给你授权了,或者算法里留了后门,你怎么办?

我2012年参与过一个政府项目的固件升级方案,当时客户明确要求不能用RSA,必须用国密。为什么?因为涉及关键基础设施,安全自主可控是底线。从那以后,我就开始系统研究SM2了。

国密标准由国家密码管理局发布,主要包括:

  • SM2:椭圆曲线公钥密码算法(签名、加密、密钥交换)
  • SM3:密码杂凑算法(类似SHA-256)
  • SM4:分组密码算法(类似AES)
  • SM9:基于标识的密码算法

其中SM2是核心中的核心。咱们这门课主要讲的就是怎么用SM2保护固件——说白了,就是让固件不被篡改、不被逆向、不被非法加载。

核心要点:国密标准不是闭门造车,它是在国际密码学基础上,结合我国实际需求制定的。SM2的数学安全性与国际主流ECC相当,但曲线参数完全自主可控。

1.2 SM2椭圆曲线密码学基础

椭圆曲线密码学,听着挺吓人,其实核心思想很简单。我尽量用大白话讲。

1.2.1 什么是椭圆曲线?

椭圆曲线不是椭圆,而是一条满足特定方程的曲线。SM2用的是基于素数域Fp的椭圆曲线,方程长这样:

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

其中a、b是系数,p是一个大素数。SM2标准里a、b、p都是固定好的,咱们直接用就行。

为什么用椭圆曲线做密码?因为在这条曲线上,点与点之间可以做“加法”运算。这个加法不是普通的坐标相加,而是有几何意义的——过曲线上两点画一条线,与曲线的第三个交点关于x轴对称的点,就是这两点的和。

嗯,这里要注意:这个“加法”定义很巧妙,它让椭圆曲线上的点构成一个群。有了群,就能做密码了。

1.2.2 椭圆曲线上的离散对数问题

SM2的安全性,说白了就靠一个数学难题:

  • 已知基点G和私钥d,计算公钥Q = dG很容易(点乘运算)
  • 但已知G和Q,反推d非常困难(离散对数问题)

这个“容易”和“困难”的差距,就是SM2安全的根基。我2015年在一个IoT设备上做固件签名时,用的就是这个原理——私钥放在安全芯片里,公钥写在固件头部,验证时只需要做一次点乘,速度很快。

个人经验:SM2的密钥长度是256位,但安全强度相当于RSA 3072位。为什么?因为椭圆曲线离散对数问题目前没有亚指数级求解算法,而RSA的大整数分解问题有。说白了,SM2用更短的密钥,达到更高的安全等级。

1.2.3 SM2的三种功能

SM2不是单一算法,它包含三个子功能:

功能 用途 固件保护中的应用
数字签名 验证数据完整性和来源真实性 固件签名验证,防止篡改
公钥加密 用公钥加密,私钥解密 固件加密传输,防止泄露
密钥交换 双方协商会话密钥 安全通道建立,用于固件升级

咱们这门课主要用签名和加密这两个功能。密钥交换在固件保护中用得少,但了解没坏处。

1.3 SM2与RSA/ECC的对比分析

做固件保护,选算法是个关键决策。我见过不少项目,一开始用RSA,后来发现密钥太长、签名太大,嵌入式设备存不下,又改SM2。也有项目用ECC(比如secp256r1),但客户要求必须过国密认证,最后还是换SM2。

下面这张表,是我在实际项目中总结的对比:

对比维度 SM2 RSA ECC(secp256r1)
密钥长度 256位 2048~4096位 256位
签名长度 64字节 256~512字节 64字节
签名速度 快 慢 快
验签速度 较快 较快 较快
安全强度 128位 112~128位 128位
标准化程度 国标GM/T 0003 PKCS#1 NIST SP 800-186
国内合规性 强制要求 部分场景受限 部分场景受限

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

  • 密钥长度优势明显:SM2的256位密钥,安全强度跟RSA 3072位差不多。在嵌入式设备里,Flash和RAM都金贵,256位比3072位省太多了。
  • 签名长度短:64字节的签名,放在固件头部不占地方。RSA 2048位的签名是256字节,差了4倍。
  • 签名速度快:SM2签名只需要一次点乘运算,RSA签名需要模幂运算,速度差一个数量级。我在Cortex-M4上实测过,SM2签名大约5ms,RSA 2048签名要50ms以上。

避坑指南:我曾经在一个项目里,为了兼容旧设备,同时支持SM2和RSA两种签名。结果固件头部结构变得很复杂,解析逻辑也容易出bug。后来我学乖了——新项目一律只用SM2,旧设备升级时做一次过渡方案。别给自己找麻烦。

1.3.1 SM2 vs ECC:到底有什么区别?

很多同学问:SM2不就是ECC的一种吗?为什么还要单独拿出来说?

没错,SM2在数学上确实属于ECC,但它有几个独特之处:

  1. 曲线参数不同:SM2用的曲线是国密标准定义的,参数(a、b、p、n、G)都是固定值。而国际ECC(如secp256r1)用的是另一套参数。
  2. 签名算法不同:SM2签名算法是国密自研的,跟ECDSA有差异。比如SM2签名中加入了用户ID的哈希,防止签名被重放。
  3. 密钥格式不同:SM2公钥是64字节(x、y坐标各32字节),而国际ECC公钥通常带一个标识字节(0x04),共65字节。
  4. 合规性要求:在国内做商用密码产品,必须用国密算法。这是硬性规定,不是技术选择。

我2018年做一个金融终端的固件保护方案,客户要求必须过国密认证。当时我试着用OpenSSL的ECC实现,结果被评测机构打回来了——曲线参数不对,签名算法也不对。最后老老实实换成SM2,一次过。

1.4 SM2在固件保护中的定位

说了这么多,SM2在固件保护里到底扮演什么角色?我画了张图,帮大家理清思路:

SM2在固件保护中的核心定位 SM2在固件保护中的核心定位 固件保护三大目标 完整性保护 机密性保护 身份认证 SM2算法 数字签名 + 公钥加密 固件签名验证 固件加密解密 安全启动认证 SM2通过数字签名保证固件完整性和来源真实性 通过公钥加密保证固件在传输和存储中的机密性

从这张图能看出来,SM2在固件保护中主要干两件事:

  • 数字签名:保证固件没被改过,而且是合法发布者签发的。这是防篡改的核心手段。
  • 公钥加密:保证固件内容只有持有私钥的设备能解密。这是防泄露的核心手段。

后面几章,咱们会一步步实现这两个功能。从密钥生成、签名验签、加密解密,到最终集成到固件升级流程里。

我的建议:刚开始学SM2,别急着看数学推导。先理解它能干什么、怎么用。等用熟了,再回头补数学基础,会轻松很多。我当年就是先写代码,后补理论,反而学得更扎实。

1.5 本章小结

这一章咱们聊了:

  • 国密标准的背景——为什么要有自己的算法
  • SM2的数学基础——椭圆曲线和离散对数问题
  • SM2与RSA、ECC的对比——密钥短、签名快、合规性强
  • SM2在固件保护中的定位——签名保完整,加密保机密