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 混合方案:非对称+对称
实际项目中,我们很少直接用非对称加密来加密大量数据——太慢了。标准做法是混合加密:
- 用ECC或RSA交换一个临时对称密钥
- 用AES加密实际数据
- 用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开始——这跟没加密有什么区别?
下一章,咱们聊聊密码学基础(下),重点讲密钥管理、随机数生成和侧信道攻击防护。这些东西在实际项目中比算法本身更容易翻车。
记住:选对算法只是第一步,用对算法才是关键。