4、密码学基础(上):对称加密(AES)、非对称加密(RSA/ECC)、哈希函数(SHA-256)在嵌入式中的选型

做嵌入式安全这些年,我最大的感触就是:密码学不是数学题,而是工程选择题。你不需要把RSA的数学证明背下来,但你必须知道——在只有2KB RAM的MCU上,跑一次RSA-2048签名需要多久?会不会把系统卡死?

这一章,咱们就聊聊嵌入式里最常用的三种密码学工具:AES、RSA/ECC、SHA-256。我会结合项目中的实际踩坑经历,帮你理清选型思路。

4.1 对称加密:AES 在嵌入式中的落地

对称加密,说白了就是一把钥匙开一把锁。加密和解密用同一个密钥。在嵌入式里,AES是绝对的主流。

4.1.1 为什么是AES?

DES太老,3DES太慢,SM4虽然国标但生态不如AES成熟。我个人习惯:只要没有强制国密要求,优先选AES-128

为什么是128位而不是256位?

  • 性能差距明显:AES-128比AES-256快约40%。在STM32F4上,AES-128加密1KB数据大约需要0.2ms,而AES-256需要0.35ms。
  • 安全余量足够:128位密钥暴力破解需要2^128次尝试,以目前算力来看,足够用到量子计算普及那天。
  • 硬件加速器支持:绝大多数MCU(如STM32、NXP i.MX RT系列)都内置AES-128硬件加速器,几乎不占CPU。

核心结论:在嵌入式里,AES-128是性价比最高的对称加密方案。除非有合规要求,否则别盲目上256。

4.1.2 工作模式怎么选?

AES本身只是个块密码,一次加密16字节。要处理任意长度的数据,就得搭配工作模式。

模式 特点 嵌入式推荐度
ECB 简单,但相同明文得到相同密文,有模式泄露风险 ❌ 不推荐
CBC 需要IV,密文依赖前一块,安全性好 ✅ 常用
CTR 可并行,支持随机访问,适合流式数据 ✅ 推荐
GCM 同时提供加密和认证,防篡改 ✅ 强烈推荐

我在项目中遇到过一个问题:用CBC模式加密固件包,结果传输过程中丢了一个字节,整个后续数据全部解密失败。后来换成GCM模式,既加密又带认证,丢包能立刻检测出来。

我的建议:如果MCU支持硬件GCM加速(比如STM32L5系列),优先用GCM。否则用CTR模式,自己加个CRC校验。

4.1.3 密钥怎么存?

这是最容易翻车的地方。很多工程师把AES密钥直接写在代码里——嗯,我刚开始也这么干过。

正确的做法:

  • 使用MCU的OTP区域:一次性编程,写入后不可读。
  • 利用安全元件(SE):如ATECC608A,密钥永远不离开芯片。
  • 派生密钥:用设备唯一ID(UID)结合主密钥,通过KDF算法生成会话密钥。

警告:千万不要把密钥明文存在Flash里!用调试器一读就全暴露了。我曾经帮客户排查过这个问题,他们用J-Link直接dump出了整个固件,密钥就在0x0800C000地址上躺着。

4.2 非对称加密:RSA vs ECC 的嵌入式对决

非对称加密,就是公钥加密、私钥解密。在嵌入式里,主要用来做密钥交换数字签名

4.2.1 RSA:老当益壮,但有点重

RSA的优点是算法成熟、生态好。几乎所有加密库都支持。但缺点也很明显:密钥太长,运算太慢

举个例子:

  • RSA-2048签名:在Cortex-M4上大约需要200ms
  • RSA-4096签名:直接奔着1秒去了

你想想看,如果设备每次上报数据都要做一次RSA签名,200ms的延迟对于实时控制来说,简直是灾难。

4.2.2 ECC:轻量级冠军

ECC(椭圆曲线密码学)用更短的密钥提供同等安全强度。比如:

安全等级 RSA密钥长度 ECC密钥长度
80位 1024 160
112位 2048 224
128位 3072 256
256位 15360 512

看到没?ECC-256的安全强度相当于RSA-3072,但密钥长度只有后者的1/12。在嵌入式里,这意味着:

  • 更少的存储空间:密钥、证书都更小
  • 更快的运算速度:ECC签名比RSA快3-5倍
  • 更低的功耗:运算时间短,电池设备更友好

我的选择:新项目一律用ECC。具体曲线选secp256r1(也叫P-256),这是NIST标准,兼容性最好。如果追求极致性能,可以用Curve25519(X25519用于密钥交换,Ed25519用于签名)。

4.2.3 混合方案:非对称+对称

实际项目中,我们很少直接用非对称加密来加密大量数据——太慢了。标准做法是混合加密

  1. 用ECC或RSA交换一个临时对称密钥
  2. 用AES加密实际数据
  3. 用ECC或RSA对数据哈希值签名

这就好比:非对称加密是保险柜的钥匙,对称加密是保险柜本身。钥匙可以随身带,保险柜用来装东西。

4.3 哈希函数:SHA-256 的嵌入式实践

哈希函数,说白了就是数据指纹。不管输入多大,输出固定长度。SHA-256输出32字节,SHA-1输出20字节。

4.3.1 为什么弃用SHA-1?

SHA-1已经被证明存在碰撞攻击。2017年,Google和CWI研究所成功找到了两个不同PDF文件的SHA-1哈希值相同。

在嵌入式里,我见过不少老产品还在用SHA-1做固件校验。嗯,这其实挺危险的。攻击者可以构造一个恶意固件,但哈希值和合法固件一样,设备根本检测不出来。

警告:所有新设计必须用SHA-256或更高。SHA-1应该被彻底淘汰。

4.3.2 SHA-256的性能表现

SHA-256在嵌入式里表现如何?我实测过一些数据:

MCU型号 主频 SHA-256速度(1KB数据)
STM32F103 72MHz 约0.8ms
STM32F407 168MHz 约0.3ms
ESP32 240MHz 约0.15ms
i.MX RT1060 600MHz 约0.05ms

可以看到,即使是低端MCU,SHA-256也能在1ms内搞定1KB数据。对于固件校验、消息认证这些场景,完全够用。

4.3.3 哈希的典型应用场景

  • 固件完整性校验:升级前计算哈希,和服务器下发的哈希对比
  • 密码存储:存哈希值,不存明文密码(记得加盐)
  • 消息认证码(HMAC):用密钥对消息做哈希,防止篡改
  • 数字签名:先对数据做哈希,再对哈希值签名

小技巧:做固件升级时,可以把固件分成多个块,每块单独计算哈希。这样如果传输中断,只需要重传失败的那一块,不用全部重来。我在一个OTA项目中用过这个方案,升级成功率从85%提升到了99%。

4.4 嵌入式密码学选型总结

说了这么多,最后给个选型速查表

场景 推荐算法 注意事项
数据加密 AES-128-GCM 带认证,防篡改
密钥交换 ECDH(P-256) 比RSA快,密钥短
数字签名 ECDSA(P-256)或Ed25519 Ed25519性能更好
哈希校验 SHA-256 别用SHA-1
密码存储 SHA-256 + 随机盐 每次盐不同

最后说一句:密码学算法本身是安全的,但实现方式往往漏洞百出。我曾经见过一个产品,AES密钥用硬编码,IV每次都从0开始——这跟没加密有什么区别?

下一章,咱们聊聊密码学基础(下),重点讲密钥管理、随机数生成和侧信道攻击防护。这些东西在实际项目中比算法本身更容易翻车。

记住:选对算法只是第一步,用对算法才是关键