2、密码学基础回顾:对称加密(AES、DES)、非对称加密(RSA、ECC)、哈希函数与MAC,以及它们在嵌入式设备中的实现方式
侧信道分析的本质,是攻击者利用密码算法在物理实现过程中泄露的功耗、电磁辐射、执行时间等侧信道信息,来恢复密钥或敏感数据。因此,在深入功耗分析、电磁分析与时序分析之前,我们必须先建立扎实的密码学基础。本章将系统回顾嵌入式设备中最常遇到的三大类密码原语——对称加密(AES、DES)、非对称加密(RSA、ECC)以及哈希函数与消息认证码(MAC),并重点剖析它们在MCU、SoC、安全芯片等嵌入式环境中的典型实现方式与侧信道攻击面。理解这些算法的数学结构、软件/硬件实现差异以及密钥管理方式,是后续开展功耗采集、相关性分析和模板攻击的前提。
上图展示了嵌入式密码学的基础框架:三大密码原语各自承担不同的安全职责,而它们在嵌入式设备中的实现方式(软件库、硬件加速器、安全芯片)直接决定了侧信道攻击的可行性与难度。下面我们逐一深入剖析。
2.1 对称加密:AES与DES的算法结构与侧信道特征
2.1.1 核心原理:分组密码的迭代结构
对称加密使用相同的密钥进行加密和解密。在嵌入式设备中,AES(高级加密标准)已成为主流,而DES(数据加密标准)及其变体3DES仍存在于老旧系统或兼容性场景中。AES-128的分组长度为128位,密钥长度为128/192/256位,其核心结构是SubBytes(字节代换)→ ShiftRows(行移位)→ MixColumns(列混合)→ AddRoundKey(轮密钥加)的迭代轮函数。每一轮中,SubBytes通过S盒(S-Box)完成非线性代换,这是整个算法中唯一非线性步骤,也是侧信道攻击最关键的切入点。
DES使用64位分组和56位有效密钥,其Feistel网络结构将数据分为左右两半,经过16轮迭代,每轮包含扩展置换、S盒代换、P置换和轮密钥异或。尽管DES已不再安全,但其S盒实现方式与AES类似,在侧信道分析中同样存在功耗泄露风险。
2.1.2 嵌入式实现方式与判断方法
在嵌入式设备中,AES的实现方式主要有三种,每种方式的侧信道攻击难度和防护策略截然不同:
| 实现方式 | 典型平台 | 功耗特征 | 侧信道攻击难度 | 常见防护 |
|---|---|---|---|---|
| 纯软件查表实现 | 低端MCU(Cortex-M0) | S盒查表功耗尖峰明显 | 低(易攻击) | 掩码、随机延时 |
| 硬件AES加速器 | STM32F4/F7、i.MX6 | 功耗曲线较平滑,但仍有相关性 | 中(需高采样率) | 硬件掩码、双轨逻辑 |
| 安全芯片内置AES | ATECC608A、SE050 | 功耗被物理屏蔽 | 高(需探针/去封装) | 主动屏蔽层、噪声注入 |
判断一个嵌入式设备采用哪种AES实现,可以通过功耗轨迹的形态初步判断:软件查表实现会在S盒操作时出现明显的周期性功耗尖峰;硬件加速器则表现为相对均匀的功耗,但轮函数边界仍可辨识;安全芯片则几乎无法从外部功耗中提取有效信息。
2.1.3 案例拆解:对STM32F407软件AES的CPA攻击
我们以一个典型的物联网节点为例,该节点使用STM32F407VGT6,运行mbedTLS软件AES-128加密,用于保护传感器数据。攻击目标是通过功耗分析恢复AES密钥。
背景与约束:设备使用3.3V供电,板载10Ω采样电阻用于功耗测量。攻击者使用示波器以50MS/s采样率采集加密过程中的电压降。设备每次加密固定已知明文(如设备ID+计数器),共采集5000条功耗轨迹。
初始现象:功耗轨迹显示每轮AES有10个明显的功耗尖峰,对应SubBytes操作。但直接观察无法区分密钥。
分析过程:
- 选择第一轮SubBytes的输出作为中间值,即
out = SBox[plaintext[i] XOR key[i]]。 - 对每个可能的密钥字节(0-255),计算所有明文对应的中间值。
- 使用CPA计算中间值汉明重量与功耗轨迹的皮尔逊相关系数。
- 正确密钥字节应产生最高相关系数(通常>0.3),错误密钥则接近0。
实际操作与结果:通过Python脚本(使用NumPy和Matplotlib)处理采集的轨迹,在密钥字节0x2A处获得0.42的峰值相关系数,成功恢复全部16字节密钥。整个过程耗时约2小时(含采集时间)。
风险与代价:攻击需要物理接触设备供电线路,且需要已知明文。若设备采用随机掩码防护,则相关系数会显著下降,需要更多轨迹或更高级的模板攻击。
复盘经验:软件AES查表实现几乎无防护能力,任何暴露的I/O接口都可能成为攻击入口。产品设计时应优先选用硬件AES引擎,并配合功耗平坦化技术。
2.1.4 常见误区与总结
误区2:忽略密钥加载过程的泄露。很多设备在启动时将密钥从Flash拷贝到RAM,这一过程的功耗同样可被分析。
误区3:DES已过时,但3DES仍在金融终端中使用,其Feistel结构的S盒功耗泄露与AES类似,不可掉以轻心。
2.2 非对称加密:RSA与ECC的数学原理及侧信道风险
2.2.1 核心原理:模幂与椭圆曲线点乘
非对称加密使用公钥/私钥对,公钥用于加密或验签,私钥用于解密或签名。RSA基于大整数分解难题,核心运算是模幂运算 c = m^d mod n,其中d为私钥指数。模幂通过平方-乘(Square-and-Multiply)算法实现,每次迭代根据密钥位决定是否执行乘法操作,这种密钥位相关的操作序列直接导致功耗和时序差异。
ECC(椭圆曲线密码)基于椭圆曲线离散对数难题,核心运算是标量乘法 Q = k * P,其中k为私钥标量。标量乘法通过点加(Point Addition)和倍点(Point Doubling)组合实现,同样存在密钥位相关的分支操作。ECC在嵌入式设备中越来越受欢迎,因为其密钥更短(256位ECC约等于3072位RSA的安全性),计算量更小。
2.2.2 嵌入式实现与侧信道攻击面
RSA在嵌入式设备中通常使用中国剩余定理(CRT)加速私钥操作,但CRT实现引入了额外的侧信道风险——如果攻击者能通过故障注入或功耗分析获取其中一个模数相关的中间值,即可分解N。ECC则常使用Jacobian坐标和固定窗口法加速点乘,但窗口表的访问模式可能泄露密钥位。
| 算法 | 关键操作 | 侧信道泄露点 | 典型攻击方法 |
|---|---|---|---|
| RSA-CRT | 模幂 (m^dp mod p) | 乘法/平方功耗差异 | SPA、时序攻击、故障注入 |
| ECC P-256 | 标量乘法 (k*P) | 点加/倍点功耗差异 | SPA、DPA、模板攻击 |
| ECC Ed25519 | 固定基标量乘法 | 窗口表访问模式 | 缓存时序攻击 |
在嵌入式设备中,RSA和ECC的实现通常依赖mbedTLS、OpenSSL或硬件加速器。硬件加速器(如NXP的CAAM、ST的CRYP)虽然提高了运算速度,但如果未做功耗平坦化处理,仍可能泄露密钥信息。
2.2.3 实战场景:对ECC点乘的时序攻击
考虑一个使用ECC P-256进行ECDSA签名的安全门锁控制器,主控为Cortex-M7,软件实现点乘。攻击者通过GPIO触发信号同步采集签名过程的功耗轨迹。
目标与约束:恢复私钥k。设备每次签名使用随机nonce,但点乘操作中倍点和点加的功耗差异明显。攻击者采集1000次签名功耗轨迹。
分析判断:通过简单功耗分析(SPA),观察功耗轨迹中是否存在周期性差异——倍点操作通常比点加操作功耗更高且耗时更长。若密钥位为1,则执行点加;若为0,则跳过。通过识别轨迹中“高功耗段”和“低功耗段”的排列,可直接读出密钥位序列。
实际操作:使用数字示波器以100MS/s采样,通过Python的peak detection算法识别功耗峰值间隔。发现轨迹中每256个点乘周期中,有约128个明显的高功耗段,对应密钥位为1的位置。最终成功恢复完整私钥。
结果与代价:攻击耗时约3小时,无需任何物理修改。该门锁控制器未采用任何掩码或随机延时防护,导致私钥完全泄露。
复盘:ECC软件实现必须采用常数时间算法(如Montgomery Ladder)或随机化标量(如盲化),否则SPA攻击即可轻松破解。
2.2.4 常见误区与防护建议
- 使用常数时间算法(如Montgomery Ladder)确保每次迭代执行相同操作;
- 对私钥进行盲化(如RSA的随机化消息、ECC的随机化标量);
- 在硬件层面增加功耗噪声发生器或使用双轨逻辑。
2.3 哈希函数与MAC:完整性验证与密钥认证
2.3.1 核心原理:压缩函数与HMAC结构
哈希函数(如SHA-256)将任意长度消息压缩为固定长度摘要,具有单向性和抗碰撞性。SHA-256的压缩函数包含64轮迭代,每轮包含逻辑函数(Ch、Maj)、循环移位和模加操作。在嵌入式设备中,哈希函数常用于固件完整性校验、数字签名和密钥派生。
消息认证码(MAC)结合密钥和消息生成认证标签,HMAC是其中最常用的构造:HMAC(K, m) = H((K' XOR opad) || H((K' XOR ipad) || m))。HMAC的安全性依赖于底层哈希函数的抗碰撞性和密钥的保密性。
2.3.2 嵌入式实现与侧信道泄露
哈希函数本身不涉及密钥,因此通常不被视为侧信道攻击的直接目标。但HMAC引入了密钥参与运算,攻击者可以通过分析HMAC计算过程中的功耗来恢复密钥。特别是当HMAC用于固件签名验证或安全启动时,密钥泄露意味着攻击者可以伪造合法固件。
在嵌入式设备中,SHA-256和HMAC-SHA256通常由硬件加速器(如STM32的HASH模块)或软件库实现。硬件实现虽然速度更快,但压缩函数中的模加和逻辑运算仍会产生与中间值相关的功耗。
| 应用场景 | 使用的哈希/MAC | 侧信道风险 | 防护措施 |
|---|---|---|---|
| 固件安全启动 | SHA-256 (摘要校验) | 低(无密钥) | 无需特殊防护 |
| 固件签名验证 | HMAC-SHA256 | 高(密钥参与运算) | 密钥存储在安全元件中 |
| 通信消息认证 | CMAC-AES | 中(AES操作泄露) | 使用硬件AES引擎 |
2.3.3 案例拆解:对HMAC-SHA256的功耗分析
某智能电表使用HMAC-SHA256对远程升级固件进行认证,密钥存储在MCU内部Flash中。攻击者希望恢复HMAC密钥,以伪造固件更新包。
背景与约束:电表使用Cortex-M4 MCU,软件实现HMAC-SHA256。攻击者通过电流探头采集电表在固件升级过程中的功耗轨迹。已知消息(固件头)和对应的MAC值。
初始现象:功耗轨迹显示SHA-256压缩函数的64轮迭代,但无法直接区分密钥相关操作。
分析过程:
- HMAC的ipad和opad与密钥异或后作为压缩函数的初始输入。攻击者选择第一轮压缩函数的模加输出作为中间值。
- 对每个可能的密钥字节(0-255),计算中间值的汉明重量。
- 使用CPA分析功耗轨迹与中间值之间的相关性。
实际操作:采集2000条功耗轨迹,使用Python进行CPA分析。在密钥字节0x7B处获得0.35的峰值相关系数。通过逐字节恢复,最终获得完整的32字节HMAC密钥。
结果与代价:攻击耗时约4小时。由于密钥存储在MCU Flash中且未加密,攻击者成功伪造了固件更新包,导致电表被植入恶意代码。
复盘经验:HMAC密钥不应直接存储在MCU内部,应使用安全元件或至少进行加密存储。同时,软件实现HMAC时应加入随机延时或掩码。
2.3.4 常见误区与总结
2.4 嵌入式设备中的密码实现综合对比与选型建议
在实际嵌入式项目中,选择哪种密码算法和实现方式,需要综合考虑安全等级、性能、功耗和成本。下表给出了典型场景的选型建议:
| 应用场景 | 推荐算法 | 推荐实现方式 | 侧信道防护等级 |
|---|---|---|---|
| 低功耗传感器节点 | AES-128 + CMAC | 硬件AES引擎 | 中(需配合掩码) |
| 安全启动(固件验签) | ECC P-256 + SHA-256 | 硬件加速器 + 安全存储 | 高 |
| 车规级ECU通信 | AES-256 + HMAC-SHA256 | HSM(硬件安全模块) | 极高 |
| 老旧系统兼容 | 3DES | 软件实现 | 低(建议升级) |
在侧信道分析课程中,我们不仅要理解算法原理,更要建立“实现即攻击面”的思维。无论是AES的S盒、RSA的模幂,还是HMAC的压缩函数,只要密钥参与运算且功耗可观测,就存在泄露风险。后续章节将深入探讨如何利用这些泄露点进行实际的功耗采集与分析。