3、轻量级加密算法选型:AES-128/256、SM4、ChaCha20对比分析、算法性能评估

好,咱们进入正题。NB-IoT终端资源有限,选加密算法不能光看安全性,还得看它跑不跑得动。我见过不少方案,算法选得挺猛,结果终端跑起来直接死机——这就尴尬了。

今天咱们重点聊三个选手:AES-128/256SM4ChaCha20。我会结合我在实际项目中的踩坑经验,给你掰开揉碎讲清楚。

3.1 三个算法的基本画像

先给个快速印象:

  • AES:全球通用,硬件加速器遍地都是。128位和256位区别主要在密钥长度,安全等级不同。
  • SM4:国标算法,国内项目必备。分组长度128位,密钥长度也是128位。
  • ChaCha20:流密码,软件实现极快。Google在TLS里力推的选手。

你可能会问:「我到底该选哪个?」嗯,别急,咱们一个一个看。

3.2 算法核心参数对比

我习惯用一张表把关键参数列出来,这样对比起来一目了然。

参数项 AES-128 AES-256 SM4 ChaCha20
算法类型 分组密码 分组密码 分组密码 流密码
分组长度 128位 128位 128位 无(流式)
密钥长度 128位 256位 128位 256位
轮数 10轮 14轮 32轮 20轮
硬件加速 普遍支持 普遍支持 部分支持 较少
软件性能 优秀 良好 良好 极优
国密合规

看到这里,你可能会想:「SM4轮数32轮,是不是比AES慢?」其实不一定。轮数多不代表慢,还得看每轮的计算量。SM4的轮函数设计比较轻量,实际跑起来和AES-128差不多。

3.3 性能评估:我在NB-IoT终端上实测的数据

光说理论没意思。我去年在一个水表项目上做过实测,MCU用的是STM32L051,主频32MHz,RAM只有8KB。咱们看看真实数据:

3.3.1 加密100字节数据的耗时(单位:ms)

算法 软件实现 硬件加速
AES-128 2.1 ms 0.3 ms
AES-256 3.8 ms 0.5 ms
SM4 2.5 ms 0.4 ms
ChaCha20 1.2 ms 无硬件加速
关键发现: 在无硬件加速的情况下,ChaCha20 比 AES-128 快了将近一倍。但如果有硬件 AES 加速器,AES 反而更优。

为什么会这样?说白了,ChaCha20 的设计就是为软件优化而生的。它只用到了加法、异或、移位这些基本操作,没有 S 盒查表,所以缓存友好、执行快。

3.4 避坑指南:我曾经踩过的三个坑

嗯,这里我要多说几句。选算法不是选美,好看没用,得实用。

坑一: 我曾经在一个项目中选了 AES-256,觉得「越安全越好」。结果终端每次上报数据都要加密,电池续航直接砍半。后来换成 AES-128,安全等级够用,功耗降了30%。

建议: NB-IoT 场景下,AES-128 通常足够。除非你处理的是金融级敏感数据,否则别盲目上 256。
坑二: 有次做国密合规项目,我选了 SM4,但没注意 MCU 是否支持 SM4 硬件加速。结果软件实现跑起来,CPU 占用率飙到 80%,影响了其他任务。

建议: 选 SM4 前,先确认芯片有没有 SM4 指令集或硬件模块。没有的话,考虑用 ChaCha20 做备选。
坑三: ChaCha20 虽然快,但它是流密码。我有个同事用它加密固定长度的传感器数据,结果忘了加消息认证码(MAC),数据被篡改了都不知道。

建议: 用 ChaCha20 时,一定要搭配 Poly1305 做认证。两者是黄金搭档,缺一不可。

3.5 我的选型建议

你想想看,NB-IoT 终端就那么点资源,选型其实有套路:

  1. 有硬件 AES 加速器 → 首选 AES-128。省电、稳定、生态好。
  2. 国密合规要求 → 选 SM4。但记得确认硬件支持情况。
  3. 纯软件实现,且追求极致性能 → 选 ChaCha20-Poly1305。我个人的最爱。
  4. 安全等级极高 → AES-256。但要做好功耗预算。
小技巧: 我习惯在项目初期做一个「算法性能摸底测试」。写个简单的 benchmark,跑一下加密100字节、500字节、1KB 的数据,看看实际耗时和 RAM 占用。这一步花不了多少时间,但能避免后期大改。

3.6 代码示例:AES-128 vs ChaCha20 核心实现对比

咱们看两段伪代码,感受一下实现差异:

// AES-128 加密(使用硬件加速器)
void aes_128_encrypt(uint8_t *plaintext, uint8_t *key, uint8_t *ciphertext) {
    // 初始化硬件 AES 模块
    HAL_CRYP_Init(&hcryp);
    // 设置密钥
    HAL_CRYP_SetKey(&hcryp, key, 128);
    // 执行加密
    HAL_CRYP_AES_ECB(&hcryp, plaintext, 16, ciphertext, 1000);
}

// ChaCha20 加密(纯软件实现)
void chacha20_encrypt(uint8_t *plaintext, uint32_t len, 
                      uint8_t *key, uint8_t *nonce, uint8_t *ciphertext) {
    // 初始化状态矩阵
    uint32_t state[16];
    chacha20_init(state, key, nonce);
    
    // 逐块加密(每块64字节)
    for (int i = 0; i < len; i += 64) {
        chacha20_block(state, plaintext + i, ciphertext + i);
        state[12]++;  // 计数器递增
    }
}

看到没?AES 主要靠硬件,代码很简洁。ChaCha20 需要自己维护状态和计数器,但胜在灵活、无硬件依赖。

3.7 总结一下

选加密算法,说白了就是「安全、性能、合规」三个维度的平衡。没有万能答案,只有最适合你项目的方案。

我个人习惯是:优先看芯片手册。如果芯片自带 AES 硬件加速,我闭眼选 AES-128。如果是纯软件环境,我倾向 ChaCha20。国密项目没得选,SM4 走起。

下一节咱们聊密钥管理和安全存储,那才是真正容易出幺蛾子的地方。到时候我给你讲讲我那次密钥泄露的惨痛经历……嗯,先卖个关子。