第四章 加密狗硬件架构:主流芯片选型与安全单元
各位同学,今天我们聊聊加密狗的硬件架构。说白了,加密狗就是一个小型的、专门干安全活儿的嵌入式系统。它得有脑子(主控芯片)、得有保险柜(安全存储)、还得有摇骰子的能力(随机数发生器)。这三样东西选不好,后面的通信安全就是空中楼阁。
我这些年拆过不少加密狗,也自己设计过几款。有些产品看着高大上,结果芯片选型就翻车了。嗯,咱们今天就把这些坑一个个填上。
4.1 主流加密狗芯片选型
加密狗的主控芯片,不是随便找个单片机就能干的。它得满足几个硬指标:
- 硬件安全引擎:支持AES、RSA、ECC等算法加速
- 安全启动:防止固件被篡改
- 防侧信道攻击:比如功耗分析、电磁辐射分析
- 安全存储区:密钥不能直接被CPU读出来
目前市面上用得最多的,我总结下来就两款:LPC55S69和ATECC608A。它们俩定位不同,但都很能打。
4.1.1 LPC55S69 —— 全能型选手
LPC55S69是NXP家的双核Arm Cortex-M33芯片。我个人习惯把它叫做「小钢炮」。为什么?因为它把安全功能几乎堆满了。
核心亮点:
- 双核M33,主频100MHz,性能足够跑复杂的加密运算
- 内置PRINCE加密引擎——这是NXP的独门绝技,可以对Flash实时加解密
- 硬件CASPER加密协处理器,专门加速ECC和RSA
- SRAM PUF(物理不可克隆函数),用来生成芯片唯一的根密钥
- 安全GPIO,可以防止调试接口被恶意访问
我在项目中遇到过一件事。有个客户要求加密狗必须支持国密SM2/SM3/SM4。当时我第一反应就是LPC55S69。它的CASPER引擎虽然官方只支持ECC,但通过软件配合硬件,跑SM2的效率比纯软件高了将近10倍。嗯,这里要注意,CASPER不是万能药,你得仔细看它的数据手册,搞清楚哪些运算能加速。
LPC55S69的典型应用场景:
- 需要运行复杂通信协议的加密狗(比如CANopen + 加密隧道)
- 需要存储多组密钥、证书的场合
- 对功耗不太敏感,但要求功能全面的产品
4.1.2 ATECC608A —— 专精型选手
ATECC608A是Microchip(原Atmel)家的安全协处理器。它不是一个通用MCU,而是一个专门干安全活儿的「小芯片」。说白了,它自己不能跑你的业务逻辑,但它能把密钥管得死死的。
核心亮点:
- 硬件ECC引擎,支持P256曲线
- 密钥永远不出芯片——生成、存储、使用都在内部完成
- 内置硬件随机数发生器(符合NIST SP 800-90A标准)
- 支持安全启动验证
- 超低功耗,适合电池供电设备
我记得有一次做车载诊断加密狗,空间限制特别死,PCB板子只有拇指大小。LPC55S69放不下,最后选了ATECC608A配合一颗普通MCU。MCU负责跑CAN协议,ATECC608A负责所有密钥操作。效果出奇的好。
ATECC608A的典型应用场景:
- 空间和成本敏感的产品
- 只需要做身份认证、密钥协商的场合
- 与主控MCU配合使用,主控负责业务,它负责安全
| 对比项 | LPC55S69 | ATECC608A |
|---|---|---|
| 定位 | 通用安全MCU | 专用安全协处理器 |
| 处理能力 | 100MHz双核M33 | 无通用计算能力 |
| 密钥存储 | Flash加密 + SRAM PUF | 硬件防篡改存储 |
| 算法支持 | AES/ECC/RSA/SM2等 | ECC P256为主 |
| 价格 | 较高(约3-5美元) | 较低(约0.5-1美元) |
| 典型功耗 | 几十mA | 几μA |
4.2 安全存储单元
加密狗的核心资产是什么?密钥。密钥丢了,加密狗就是一块废铁。所以安全存储单元的设计,我建议你花最多心思。
安全存储要解决三个问题:
- 防读取:攻击者不能通过调试接口、内存dump等方式拿到密钥
- 防篡改:密钥不能被修改或替换
- 防物理攻击:比如开盖、探针、激光切割
4.2.1 片上安全存储 vs 外部安全芯片
这里有个选择题:密钥存在主控芯片内部,还是存在外部专用芯片里?
我的经验是:
- 如果选LPC55S69这类安全MCU,密钥可以存在内部。它的Flash是加密的,而且有PRINCE引擎实时解密。攻击者就算把Flash读出来,也是一堆密文。
- 如果选普通MCU+ATECC608A的组合,密钥存在ATECC608A内部。主控MCU根本不知道密钥长什么样,它只能发指令让ATECC608A做签名、解密操作。
避坑指南:
我曾经见过一个产品,把密钥硬编码在普通MCU的Flash里,还觉得「反正没人能读出来」。结果被侧信道攻击一锅端。嗯,永远不要低估攻击者的耐心。普通MCU的Flash保护位,用电压毛刺攻击几分钟就能绕过。
4.2.2 物理不可克隆函数(PUF)
PUF是个好东西。它利用芯片制造过程中产生的微小差异(比如晶体管的阈值电压偏差)来生成一个唯一的、不可克隆的「指纹」。这个指纹可以用来派生密钥。
LPC55S69的SRAM PUF是怎么工作的?
- 芯片上电时,SRAM单元会呈现随机的初始状态(0或1)
- 这个随机状态是芯片独有的,而且每次上电都稳定
- 通过纠错算法,把这个随机状态转换成128位或256位的密钥
好处是什么?密钥不是存在Flash里的,而是每次上电「现算」出来的。攻击者就算把芯片拆了,也找不到密钥的物理存储位置。
4.3 硬件随机数发生器
随机数在安全通信里有多重要?你想想看,密钥协商、签名、加密,哪一步都离不开随机数。如果随机数能被预测,整个加密体系就形同虚设。
硬件随机数发生器(TRNG)和软件伪随机数发生器(PRNG)的区别:
- PRNG:靠算法生成,种子固定的话,序列就固定。攻击者只要知道种子,就能复现所有随机数。
- TRNG:靠物理噪声(比如热噪声、振荡器抖动)生成,真正不可预测。
我建议,加密狗里必须用TRNG。PRNG只能用来做非安全场景,比如LED闪烁频率。
4.3.1 LPC55S69的TRNG
LPC55S69内置的TRNG符合NIST SP 800-90B标准。它内部有一个环形振荡器,利用振荡器的相位抖动来产生熵。输出速率最高可达几十Mbps,足够用了。
使用示例(伪代码):
// 初始化TRNG
TRNG_Init();
// 生成32字节随机数
uint8_t random_bytes[32];
TRNG_GetRandomBytes(random_bytes, 32);
// 用随机数做密钥协商
// ...
这里有个细节:TRNG刚上电时,输出可能不够随机。我习惯的做法是先让TRNG跑一段时间「热身」,丢弃前几百个字节,再取真正的随机数。
4.3.2 ATECC608A的TRNG
ATECC608A也内置了TRNG,符合NIST SP 800-90A标准。它生成的随机数可以直接用于ECC密钥对生成。
ATECC608A的随机数生成命令:
// 通过I2C发送命令
// 命令:Nonce(生成随机数)
// 参数:mode = 0x00(生成随机数并存储到内部寄存器)
// 读取32字节随机数
uint8_t nonce[32];
ATECC608A_ReadNonce(nonce);
个人经验:
我测试过ATECC608A的随机数质量。用NIST的STS工具跑了一遍,所有测试项都通过了。但要注意,它的TRNG输出速率不高,如果你需要大量随机数(比如批量生成密钥对),建议用LPC55S69的TRNG。
4.4 小结
加密狗的硬件架构,说白了就是三个核心模块的选型和搭配:
- 主控芯片:LPC55S69适合全能型产品,ATECC608A适合专精型产品
- 安全存储:密钥必须存在硬件保护区内,PUF是当前最先进的技术
- 随机数发生器:必须用TRNG,别省这个成本
下一章我们会讲加密狗和CAN总线怎么握手,密钥怎么安全地分发到总线上。嗯,那才是真正考验设计功底的地方。
课后思考:
如果你要设计一个车载ECU刷写加密狗,你会选LPC55S69还是ATECC608A?为什么?