3、密码学基础:对称加密(AES)、非对称加密(RSA/ECC)、哈希函数(SHA256)

好,咱们进入正题。密码学,听起来很高大上,对吧?其实在嵌入式世界里,尤其是可穿戴设备里,它就是个「看门狗」——保护你的数据不被别人偷走或篡改。我个人习惯把密码学比作「锁和钥匙」的组合,只不过这里的锁和钥匙都是数学公式。

今天咱们聊三个核心工具:AESRSA/ECCSHA256。你想想看,一个可穿戴设备从采集心率到上传云端,这三样东西基本都会用到。嗯,咱们一个一个来。

3.1 对称加密:AES

对称加密,说白了就是「一把钥匙开一把锁」。加密和解密用的是同一个密钥。速度快,适合在资源受限的MCU上跑。

AES(Advanced Encryption Standard)是目前最主流的对称加密算法。它支持128、192、256位密钥长度。我个人建议,在可穿戴设备里至少用AES-128,如果芯片算力够,直接上AES-256。

核心要点:AES 是分组加密,每次处理16字节(128位)的数据块。如果数据不够16字节,需要做填充(Padding)。

我在项目中遇到过一个问题:某款手环在传输心率数据时,用了AES-ECB模式。结果呢?加密后的数据块之间没有关联,攻击者可以通过重放攻击伪造数据包。后来我改成了AES-CBC模式,加了个随机IV(初始化向量),问题就解决了。

来看一个简单的代码示例,用C语言实现AES-128加密(伪代码风格):

// AES-128 CBC 加密示例
#include "aes.h"

uint8_t key[16] = {0x2b, 0x7e, 0x15, 0x16, 0x28, 0xae, 0xd2, 0xa6, 
                   0xab, 0xf7, 0x15, 0x88, 0x09, 0xcf, 0x4f, 0x3c};
uint8_t iv[16]  = {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
                   0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f};
uint8_t plaintext[32] = "Hello, Wearable!";
uint8_t ciphertext[32];

AES_CBC_encrypt(plaintext, ciphertext, key, iv, sizeof(plaintext));

避坑指南:我曾经在STM32上直接用了软件实现的AES,结果发现加密一次要几十毫秒,严重影响实时性。后来换成了硬件AES加速器(如果芯片支持),速度提升了10倍以上。所以,选型时一定要看芯片有没有硬件加密引擎。

3.2 非对称加密:RSA 与 ECC

非对称加密,就是「两把钥匙」——公钥加密,私钥解密。公钥可以公开,私钥自己藏好。它解决了对称加密中密钥分发的难题。

RSA 是最经典的非对称算法,基于大整数分解的数学难题。但它的密钥长度通常需要2048位以上才安全,这在可穿戴设备上是个负担——计算慢、占用Flash大。

ECC(椭圆曲线密码学) 就友好多了。它基于椭圆曲线离散对数难题,用更短的密钥就能达到同等安全强度。比如,ECC-256 的安全性与 RSA-3072 相当,但密钥长度只有后者的十分之一。

我个人更倾向于在可穿戴设备里用ECC。为什么?你想想看,一个手环的Flash可能只有256KB,你还要放固件、放算法、放数据。RSA的密钥存储和运算开销太大了。

算法 密钥长度(安全等级) 计算开销 适用场景
RSA 2048位(112位安全) 密钥交换、数字签名
ECC 256位(128位安全) 可穿戴设备、IoT

注意:非对称加密速度慢,不适合加密大量数据。实际项目中,我们通常用「混合加密」:用ECC或RSA交换对称密钥,然后用AES加密实际数据。我在做一款智能手表时,就是这么干的——先用ECC握手,再用AES-CBC加密传感器数据。

3.3 哈希函数:SHA256

哈希函数,说白了就是「数字指纹」。它能把任意长度的数据,压缩成一个固定长度的摘要(比如256位)。而且,它是单向的——从摘要反推原始数据,几乎不可能。

SHA256 是SHA-2家族的一员,输出256位(32字节)的哈希值。在可穿戴设备里,它常用于:

  • 数据完整性校验:确保固件或数据在传输过程中没被篡改。
  • 密码存储:不存明文密码,只存哈希值。
  • 数字签名:先对消息做哈希,再对哈希值签名。

我记得有一次,一个客户反馈说手环的固件升级总是失败。排查了半天,发现是固件包的SHA256校验值在传输过程中被截断了。嗯,这里要注意:哈希值必须完整传输,否则校验会失败。

来看一个SHA256的简单用法(伪代码):

// SHA256 哈希计算示例
#include "sha256.h"

uint8_t data[] = "Firmware v2.1";
uint8_t hash[32];

SHA256_calculate(data, sizeof(data), hash);
// hash 数组里就是32字节的摘要值

个人经验:在低功耗场景下,SHA256的计算功耗其实不高。以Cortex-M4内核为例,计算一次SHA256大约消耗几毫秒,电流也就几毫安。所以,别怕用哈希函数,它比非对称加密省电多了。

3.4 三者如何配合?

在实际的可穿戴设备中,这三个算法通常是「打配合」的。我给你画个简单的流程:

  1. 设备注册时:用ECC生成密钥对,公钥上传到服务器,私钥留在设备安全存储区。
  2. 数据传输时:用ECC或RSA交换一个临时AES密钥(会话密钥)。
  3. 数据加密时:用AES-CBC加密传感器数据(如心率、血氧)。
  4. 数据校验时:对加密后的数据包做SHA256哈希,确保完整性。
  5. 固件升级时:先校验固件包的SHA256值,再用ECC签名验证固件来源。

你看,一环扣一环。少了任何一个,都可能被攻击者钻空子。我曾经见过一个产品,只用了AES加密,没做哈希校验,结果攻击者篡改了加密数据包,导致设备死机。嗯,教训深刻。

总结一下:

  • AES:速度快,适合加密大量数据。推荐CBC或GCM模式。
  • ECC:密钥短,适合资源受限设备。推荐用于密钥交换和签名。
  • SHA256:轻量级,适合完整性校验和密码存储。

记住,密码学不是「用了就安全」,而是「用对了才安全」。选型时,一定要结合芯片算力、功耗、Flash大小来权衡。

好,这一章就到这里。下一章咱们聊聊「安全启动与固件签名」,到时候会用到今天讲的哈希和签名知识。有什么问题,欢迎随时交流。