在万物互联的时代,加密算法是保护嵌入式设备数据完整性、确保通信安全、防止未授权访问的基石。对于开发者而言,理解不同算法的特性并在资源受限的环境中实现它们,是一项必备技能。本文将深入探讨嵌入式系统中的关键加密算法,并提供基于C语言的优化实现思路,更多嵌入式安全相关的讨论,欢迎访问云栈社区进行交流。
加密算法
哈希算法:数据的“指纹”识别器
哈希算法就像一个高效的指纹生成器,无论输入的数据有多庞大,它都能输出一个固定长度的“数字指纹”(即哈希值)。这个指纹具有唯一性和不可逆性,是验证数据完整性的核心工具。
哈希算法的三大特性:
- 单向性:只能从原始数据计算出哈希值,而无法从哈希值反推出原始数据。
- 雪崩效应:输入数据即使发生微小的改变(如一个比特位),产生的哈希值也会发生巨大的、不可预测的变化。
- 抗碰撞性:在计算上很难找到两个不同的输入数据,却能产生完全相同的哈希值。
常用哈希算法对比:
| 算法 |
输出长度 |
安全性 |
应用场景 |
| MD5 |
128位 |
低(已被破解) |
非安全场景,如文件校验 |
| SHA-1 |
160位 |
低(存在碰撞) |
兼容性场景 |
| SHA-256 |
256位 |
高 |
推荐使用,广泛支持 |
| SHA-3 |
224/256/384/512位 |
高 |
最新标准,未来趋势 |
计算示例:SHA-256哈希计算
以下代码展示了如何在嵌入式系统中使用mbed TLS库计算数据的SHA-256哈希值,常用于固件或配置文件的完整性验证。
#include “mbedtls/md.h”
#include <stdio.h>
#include <string.h>
// 计算SHA-256哈希值
int calculate_sha256(const unsigned char *input, size_t input_len, unsigned char *output) {
int ret;
mbedtls_md_context_t ctx;
const mbedtls_md_info_t *info;
mbedtls_md_init(&ctx);
// 选择SHA-256算法
info = mbedtls_md_info_from_type(MBEDTLS_MD_SHA256);
if (info == NULL) {
return -1;
}
// 初始化并计算哈希
if ((ret = mbedtls_md_setup(&ctx, info, 0)) != 0 ||
(ret = mbedtls_md_starts(&ctx)) != 0 ||
(ret = mbedtls_md_update(&ctx, input, input_len)) != 0 ||
(ret = mbedtls_md_finish(&ctx, output)) != 0) {
mbedtls_md_free(&ctx);
return ret;
}
mbedtls_md_free(&ctx);
return 0;
}
// 使用示例
void sha256_example() {
const char *message = “Hello, Embedded Security!”;
unsigned char hash[32]; // SHA-256输出为32字节
if (calculate_sha256((const unsigned char *)message, strlen(message), hash) == 0) {
printf(“SHA-256 hash: “);
for (int i = 0; i < 32; i++) {
printf(“%02x”, hash[i]);
}
printf(“\n”);
}
}
在嵌入式系统中的典型应用:
- ✅ 固件完整性验证:设备启动时,计算运行中固件的哈希值,与预置的正确哈希值比对,确保固件未被恶意篡改。
- ✅ 密码存储:绝不存储用户密码明文。只存储其哈希值,验证时对比哈希值即可。
- ✅ 数据完整性检查:验证通过网络传输或存储在Flash中的数据是否完整无损。
- ✅ 数字签名验证:作为签名流程的一部分,验证消息或软件包的来源和完整性。
对称加密算法:高速数据保护盾
想象一下用同一把钥匙锁门和开门,这就是对称加密的核心:加密和解密使用相同的密钥。这种方式的最大优势在于速度快、计算开销相对较小,非常适合嵌入式系统中需要加密大量数据(如传感器流、通信数据包)的场景。掌握这类算法的底层原理,也是深入计算机科学基础的重要一环。
对称加密的优势:
- ⚡ 速度快:算法结构相对简单,加解密效率高,对CPU和内存资源消耗小。
- 🔧 易于实现:代码体积小,适合在资源受限的MCU上运行。
- 💰 成本低:无需建设复杂的公钥基础设施(PKI)。
- 🛡️ 安全性足够:在密钥安全的前提下,加密强度有保障。
主流对称加密算法对比:
| 算法 |
密钥长度 |
安全性 |
性能 |
| AES-128 |
128位 |
高 |
高 |
| AES-256 |
256位 |
极高 |
中高 |
| DES |
56位 |
低 |
高 |
| 3DES |
168位 |
中 |
低 |
| ChaCha20 |
256位 |
高 |
极高 |
计算示例:AES-128 CBC加密解密
AES是当前最常用的对称加密算法。以下示例展示了使用CBC模式进行加密,该模式需要初始化向量(IV)来增强安全性。
#include “mbedtls/aes.h”
#include <stdio.h>
#include <string.h>
// PKCS#7填充/解填充(块加密必需)
void pkcs7_pad(unsigned char *data, size_t data_len, size_t block_size) {
size_t padding_len = block_size - (data_len % block_size);
for (size_t i = 0; i < padding_len; i++) {
data[data_len + i] = (unsigned char)padding_len;
}
}
size_t pkcs7_unpad(unsigned char *data, size_t data_len) {
if (data_len == 0) return 0;
unsigned char padding_len = data[data_len - 1];
return (padding_len > data_len) ? data_len : (data_len - padding_len);
}
// AES-128 CBC加密
int aes128_cbc_encrypt(const unsigned char *key, const unsigned char *iv,
const unsigned char *plaintext, size_t plaintext_len,
unsigned char *ciphertext) {
int ret;
mbedtls_aes_context ctx;
size_t padded_len = ((plaintext_len + 15) / 16) * 16;
mbedtls_aes_init(&ctx);
// 设置加密密钥并执行加密
if ((ret = mbedtls_aes_setkey_enc(&ctx, key, 128)) != 0 ||
(ret = mbedtls_aes_crypt_cbc(&ctx, MBEDTLS_AES_ENCRYPT, padded_len,
(unsigned char *)iv, plaintext, ciphertext)) != 0) {
mbedtls_aes_free(&ctx);
return ret;
}
mbedtls_aes_free(&ctx);
return 0;
}
// 使用示例
void aes_example() {
unsigned char key[16] = “0123456789abcdef”; // 128位密钥
unsigned char iv[16] = “fedcba9876543210”; // 初始化向量
unsigned char plaintext[64] = “Hello, AES Encryption!”;
size_t plaintext_len = strlen((char *)plaintext);
size_t padded_len = ((plaintext_len + 15) / 16) * 16;
unsigned char ciphertext[64];
unsigned char decrypted[64];
// 填充明文(CBC模式要求数据长度为16字节的倍数)
pkcs7_pad(plaintext, plaintext_len, 16);
// 加密
if (aes128_cbc_encrypt(key, iv, plaintext, padded_len, ciphertext) == 0) {
printf(“加密成功!\n”);
// 解密(代码略,类似加密过程)
}
}
嵌入式系统中的典型应用:
- ✅ 本地数据加密:保护存储在Flash或EEPROM中的敏感信息,如Wi-Fi密码、用户配置。
- ✅ 传感器数据保护:对采集到的敏感环境数据(如温湿度、图像)进行加密后再传输。
- ✅ 设备间通信:在设备与网关、或设备与设备之间建立安全的通信通道。
- ✅ 固件更新:对OTA(空中下载)的固件更新包进行加密,防止中间人攻击。
非对称加密算法:安全通信的密钥使者
非对称加密使用一对数学上紧密关联,但功能不同的密钥:公钥和私钥。公钥可以公开给任何人,用于加密数据;私钥必须严格保密,用于解密数据。这种机制完美解决了对称加密中“如何安全地交换密钥”的难题,是现代安全通信(如TLS/SSL)的基石。理解其数学原理,例如大数分解和椭圆曲线,是密码学领域的核心。
非对称加密的独特优势:
- 🔒 无需安全通道交换密钥:公钥可以公开发布,任何人均可用其加密数据,只有持有私钥的一方才能解密。
- 📱 身份认证:私钥持有者可以对一段信息生成“数字签名”,任何人用对应的公钥都可验证该签名,从而确认信息发送者的身份。
- 🔐 不可否认性:由于私钥的唯一性,签名者事后无法否认自己签署过的信息。
- 🌐 适合网络通信:为远程、非可信网络环境下的安全交互提供了解决方案。
主流非对称加密算法对比:
| 算法 |
密钥长度 |
安全性 |
性能 |
内存占用 |
| RSA-2048 |
2048位 |
高 |
低 |
高 |
| RSA-4096 |
4096位 |
极高 |
极低 |
极高 |
| ECC P-256 |
256位 |
高 |
中高 |
低 |
| Ed25519 |
256位 |
高 |
高 |
极低 |
计算示例:RSA密钥生成与签名验证
RSA是最广为人知的非对称算法。在嵌入式系统中,它常用于设备身份认证和固件签名验证。以下是使用mbed TLS生成密钥对和进行签名的示例。
#include “mbedtls/rsa.h”
#include “mbedtls/entropy.h”
#include “mbedtls/ctr_drbg.h”
#include <stdio.h>
#include <string.h>
// 生成RSA密钥对
int rsa_generate_key_pair(mbedtls_rsa_context *rsa, int key_bitlen,
mbedtls_entropy_context *entropy,
mbedtls_ctr_drbg_context *ctr_drbg) {
int ret;
mbedtls_rsa_init(rsa, MBEDTLS_RSA_PKCS_V15, 0);
// 生成密钥对(65537是常用的公钥指数)
if ((ret = mbedtls_rsa_gen_key(rsa, mbedtls_ctr_drbg_random, ctr_drbg,
key_bitlen, 65537)) != 0) {
return ret;
}
return 0;
}
// 使用RSA私钥签名
int rsa_sign(const mbedtls_rsa_context *rsa,
const unsigned char *hash, size_t hash_len,
unsigned char *signature, size_t *signature_len,
mbedtls_ctr_drbg_context *ctr_drbg) {
int ret;
// 执行签名操作
if ((ret = mbedtls_rsa_sign(rsa, mbedtls_ctr_drbg_random, ctr_drbg,
MBEDTLS_RSA_PRIVATE, MBEDTLS_MD_SHA256,
hash_len, hash, signature)) != 0) {
return ret;
}
*signature_len = mbedtls_rsa_get_len(rsa);
return 0;
}
// 使用示例
void rsa_example() {
int ret;
mbedtls_rsa_context rsa;
mbedtls_entropy_context entropy;
mbedtls_ctr_drbg_context ctr_drbg;
const char *pers = “rsa_example”;
unsigned char hash[32] = {0}; // 假设这是固件的SHA-256哈希值
unsigned char signature[256];
size_t signature_len;
// 初始化随机数生成器
mbedtls_entropy_init(&entropy);
mbedtls_ctr_drbg_init(&ctr_drbg);
if ((ret = mbedtls_ctr_drbg_seed(&ctr_drbg, mbedtls_entropy_func, &entropy,
(const unsigned char *)pers, strlen(pers))) != 0) {
printf(“随机数生成失败: %d\n”, ret);
goto cleanup;
}
// 生成2048位RSA密钥对(适合嵌入式系统)
if ((ret = rsa_generate_key_pair(&rsa, 2048, &entropy, &ctr_drbg)) != 0) {
printf(“密钥生成失败: %d\n”, ret);
goto cleanup;
}
printf(“RSA密钥对生成成功!\n”);
// 签名(例如:签名固件哈希值)
if ((ret = rsa_sign(&rsa, hash, sizeof(hash), signature, &signature_len, &ctr_drbg)) != 0) {
printf(“签名失败: %d\n”, ret);
goto cleanup;
}
printf(“签名成功!签名长度: %zu字节\n”, signature_len);
// 验证签名(代码略)
cleanup:
mbedtls_rsa_free(&rsa);
mbedtls_ctr_drbg_free(&ctr_drbg);
mbedtls_entropy_free(&entropy);
}
嵌入式系统中的典型应用:
- ✅ 设备认证:在设备加入网络时,使用内置的私钥进行签名,服务器用预置的公钥验证,证明设备身份合法性。
- ✅ 密钥交换:通信开始时,通过RSA或ECDH等算法安全地协商出一个临时的对称加密会话密钥。
- ✅ 数字签名:对固件、关键配置文件的哈希值进行签名。设备端用公钥验证签名,确保代码未被篡改且来源可信。
- ✅ 远程管理:实现安全的远程配置、指令下发等功能。
国密算法:自主可控的安全保障
国密算法是由中国国家密码管理局制定并发布的商用密码算法标准体系,包括SM2(非对称)、SM3(哈希)、SM4(对称)和SM9(标识密码)等。它们具有完全自主知识产权,在涉及国家安全和国计民生的重要领域已成为合规性要求。
国密算法家族成员:
| 算法 |
类型 |
功能 |
应用场景 |
| SM2 |
非对称加密 |
密钥交换、数字签名 |
设备认证、身份识别 |
| SM3 |
哈希算法 |
数据完整性验证 |
固件验证、数字签名 |
| SM4 |
对称加密 |
数据加密 |
本地数据加密、通信加密 |
| SM9 |
标识密码 |
基于身份的加密 |
物联网轻量级认证 |
国密算法的独特优势:
- 🇨🇳 合规要求:满足国内法律法规和行业标准,是政务、金融等关键领域项目的准入条件。
- 🔒 安全可靠:算法设计经过严格的密码学分析和实践检验。
- 📱 适配国情:针对中国的应用环境和硬件平台进行了优化。
- 🌐 国际认可:SM2/3/4/9均已纳入ISO/IEC国际标准,走向全球。
国密算法在嵌入式系统中的应用:
- ✅ 政府项目:智慧城市、电子政务、公安警务等涉及国家安全的嵌入式终端。
- ✅ 金融科技:银行卡、POS机、密码键盘、金融IC卡等支付终端设备。
- ✅ 智能终端:支持国密算法的安全手机、身份证读卡器、门禁系统等。
- ✅ 工业控制系统:电力、能源、轨道交通等关键基础设施中的工控设备。
加密实现
软件实现
对于没有硬件加密加速功能的MCU,选择一款合适、轻量级的软件加密库至关重要。在C/C++嵌入式开发中,这些库提供了关键的底层支持。
📚 主流加密库对比
| 库名称 |
特点 |
代码大小 |
内存需求 |
推荐使用场景 |
| mbed TLS |
ARM开发,功能全面 |
中等(可裁剪) |
中等 |
大多数嵌入式系统 |
| TinyCrypt |
Intel开发,超轻量 |
极小 |
极小 |
8位/16位MCU |
| LibTomCrypt |
模块化设计,灵活 |
中等 |
中等 |
需要多种算法的场景 |
| BearSSL |
Google开发,高性能 |
小 |
小 |
网络通信加密 |
| WolfSSL |
安全认证,实时系统支持 |
小 |
小 |
安全要求高的场景 |
硬件加速
为了提升性能、降低功耗和增强安全性,现代嵌入式系统越来越多地采用硬件加速方案。
-
片上加密引擎:
- 内置加速器:许多现代MCU(如STM32的CRYP外设、ESP32的AES加速器)都集成了对称加密(AES)、哈希(SHA)甚至非对称加密(ECC/PKA)的硬件协处理器。
- 性能提升:硬件执行速度通常比纯软件实现快10倍到100倍以上。
- 功耗优势:专用电路完成运算,比CPU软件模拟更省电。
- 使用方法:通过芯片厂商提供的专用寄存器或硬件抽象层(HAL)驱动库进行访问。
-
硬件安全模块(HSM):
- 独立芯片:作为主控MCU的协处理器,提供更高等级的安全隔离和更丰富的密码学功能。
- 密钥管理:密钥在HSM内部生成、存储和使用,永远不以明文形式暴露给外部主控,防物理探测和提取。
- 密码操作:所有敏感运算(如签名、解密)均在HSM内部完成。
- 适用场景:金融支付终端、汽车电子、高安全工业控制器。
-
安全元件(SE):
- 增强安全性:采用防篡改设计,具备抗旁路攻击、抗故障注入等物理安全防护能力。
- 隔离环境:提供与主应用完全隔离的安全执行环境(Secure Enclave)。
- 丰富接口:通常通过I2C、SPI等标准接口与主控连接,集成方便。
总结
在物联网和智能设备无处不在的今天,加密算法已不再是可选的高级功能,而是嵌入式系统设计的必需品。它是抵御网络攻击、保护用户隐私、构建可信赖数字世界的坚实盾牌。开发者需要根据项目的安全需求、合规要求、硬件资源以及性能目标,审慎地选择“哈希”、“对称加密”、“非对称加密”或“国密算法”中的一种或多种组合,并合理利用“软件库”或“硬件加速”来实现。理解这些算法的原理与优劣,是设计和实现一个健壮、安全嵌入式系统的关键一步,这其中的权衡与选择,也蕴含着深刻的算法与数据结构思想。