第1章:密码学基础回顾

各位同学,欢迎来到《IoT芯片安全启动与加密引擎开发实战》的第一章。

说实话,做IoT安全这些年,我见过太多「芯片功能没问题,但安全一捅就破」的案例。有一次,一个客户拿着他们新做的物联网模组来找我,说启动流程已经加了签名验证。我拿逻辑分析仪一抓,好家伙,密钥直接硬编码在Flash里,连加密都没做。嗯,这就是典型的「会用算法,但不懂怎么用」。

所以,咱们第一章先把密码学基础夯实。别嫌基础,这些算法在芯片底层怎么跑、有什么坑,才是咱们这门课的核心。

1.1 对称加密:AES

对称加密,说白了就是加密和解密用同一把钥匙。你想想看,就像你家大门,锁门和开门用的是同一把钥匙。

在IoT芯片里,AES(Advanced Encryption Standard)是绝对的主流。我个人习惯把AES分成三块来理解:算法本身、工作模式、以及硬件实现时的坑。

AES算法核心

AES处理的是128位的数据块,密钥长度可以是128、192或256位。咱们做IoT,128位密钥基本够用,除非你搞的是国家级安全项目。

算法流程其实不复杂:

// AES-128 加密伪代码
State = Plaintext
AddRoundKey(State, RoundKey[0])

for round = 1 to 10:
    SubBytes(State)      // S盒替换
    ShiftRows(State)     // 行移位
    MixColumns(State)    // 列混淆(最后一轮没有这步)
    AddRoundKey(State, RoundKey[round])

Ciphertext = State

这里有个关键点:S盒。在硬件实现时,S盒通常用查找表(LUT)实现。我曾经在一个低功耗芯片项目里,为了省面积,把S盒用组合逻辑重新实现了,结果时序跑不过。后来还是老老实实用了LUT,面积大了点,但时序裕量足足的。

AES工作模式

光有AES核心算法还不够,你得选工作模式。在IoT芯片里,常见的有:

模式 特点 IoT场景
ECB 简单,但相同明文得到相同密文 ❌ 别用,有安全风险
CBC 需要IV,密文有扩散性 ✅ 适合固件加密
CTR 可并行,支持随机访问 ✅ 适合Flash加密
GCM 带认证加密,同时保证机密性和完整性 ✅ 安全通信首选
⚠️ 避坑指南: 我曾经在一个NB-IoT模组项目里,工程师用了ECB模式加密固件。结果呢?固件里有大量重复的0xFF填充,攻击者一看密文模式就知道固件结构了。所以,ECB在IoT里基本是禁区。

1.2 非对称加密:RSA与ECC

非对称加密,就是加密和解密用不同的钥匙。公钥加密,私钥解密。这在IoT里主要用来做密钥协商数字签名

RSA:老牌劲旅

RSA基于大整数分解难题。简单说,两个大素数相乘容易,但反过来分解很难。

在IoT芯片里,RSA的主要问题是计算量大。2048位的RSA签名,在低端MCU上可能要跑几百毫秒。我建议:

  • 如果芯片有硬件加速器,用RSA没问题
  • 如果纯软件实现,优先考虑ECC
  • 密钥长度至少2048位,1024位已经不安全了

ECC:后起之秀

ECC(椭圆曲线密码学)用更短的密钥提供同等安全强度。256位的ECC ≈ 3072位的RSA。

为什么ECC在IoT里这么火?说白了,就是省资源。密钥短、计算快、功耗低。我做过一个对比:

算法 密钥长度 签名大小 相对计算量
RSA-2048 2048位 256字节
ECC-256 256位 64字节

嗯,这里要注意:ECC的曲线选择很重要。我个人习惯用NIST P-256Curve25519。Curve25519在硬件实现上更友好,不容易有侧信道攻击的风险。

💡 实战经验: 在做安全启动时,我通常把公钥烧死在芯片的OTP(一次性可编程)存储器里。私钥放在产线安全服务器上,签名完就销毁。这样即使芯片被物理攻击,也拿不到私钥。

1.3 哈希函数:SHA-256

哈希函数,就是把任意长度的数据,压缩成固定长度的摘要。而且,这个操作是单向的——从摘要反推原始数据,理论上不可能。

SHA-256输出256位(32字节)的摘要。在IoT里,它的主要用途:

  • 固件完整性校验:计算固件哈希,和签名里的哈希比对
  • 密钥派生:用HKDF(基于HMAC的密钥派生函数)生成会话密钥
  • 随机数生成:作为熵源的一部分

SHA-256的硬件实现,核心是压缩函数。它把消息分成512位的块,每块经过64轮迭代。我建议在芯片设计时,把SHA-256做成独立的硬件模块,这样CPU可以一边做其他事,一边让硬件算哈希。

🔑 关键点: SHA-256的初始向量(IV)是固定的,但如果你做密钥派生,千万别直接用SHA-256(key || message)。这种构造容易受到长度扩展攻击。正确做法是用HMAC。

1.4 消息认证码:HMAC

HMAC(Hash-based Message Authentication Code),就是带密钥的哈希。它解决了「我怎么知道这个消息是你发的,而且没被篡改过?」这个问题。

HMAC的构造其实很巧妙:

HMAC(K, m) = H((K' ⊕ opad) || H((K' ⊕ ipad) || m))

其中:
K'  = 如果K长度大于块大小,先哈希;否则直接使用
opad = 0x5c重复块大小次
ipad = 0x36重复块大小次

为什么搞这么复杂?说白了,就是为了防止长度扩展攻击。直接H(K || m)的话,攻击者可以在不知道K的情况下,伪造出H(K || m || padding || extra)的合法MAC。

在IoT芯片里,HMAC主要用在:

  • 安全启动:验证固件签名前,先验证MAC
  • 会话密钥生成:作为PRF(伪随机函数)
  • 消息认证:通信协议中的完整性保护
⚠️ 注意: 我曾经在一个项目里看到,工程师把HMAC的密钥直接存在Flash里,而且没加密。结果攻击者用JTAG读出了Flash内容,整个安全体系瞬间崩塌。记住:密钥必须存储在安全区域,比如HSM(硬件安全模块)或OTP。

知识体系总览

下面这张图,是我梳理的本章知识体系。你可以把它当作一个「密码学算法选型地图」:

IoT芯片密码学算法选型地图 密码学基础 对称加密 (AES) 非对称加密 (RSA/ECC) 哈希函数 (SHA-256) 消息认证码 (HMAC) ECB / CBC / CTR / GCM S盒硬件实现 RSA: 大整数分解 ECC: 椭圆曲线 P-256 / Curve25519 压缩函数 64轮迭代 长度扩展攻击 ipad / opad 密钥派生 (HKDF) IoT芯片安全应用 安全启动 | 固件加密 | 安全通信 | 密钥管理

这张图把咱们今天讲的内容串起来了。从底层的密码学算法,到上层的IoT安全应用,每一步都有讲究。

好了,第一章就到这里。这些基础概念,后面每一章都会用到。尤其是AES和SHA-256的硬件实现,咱们在讲安全启动和加密引擎时会反复提到。

记住:算法是死的,但怎么用是活的。同样的AES,用对了地方是铜墙铁壁,用错了就是纸糊的。


公众号:蓝海资料掘金营,微信deep3321