AES加解密¶
Copyright © Quectel Wireless Solutions Co., Ltd. 2026. All rights reserved.
功能概述¶
提供系统级的AES数据加解密功能,可对用户数据进行对称加解密,保障固件与网络传输数据的机密性。
主要应用场景¶
网络通信数据加密:
在TLS/SSL握手完成后,底层数据流的传输(如HTTPS、MQTT over TLS)普遍采用AES加密。
即使在非安全链路(直接使用TCP/UDP)上,应用层也常直接调用AES接口(如 qcm_aes_string_cbc_encryption())加密载荷数据。本地数据与存储安全:
文件系统加密:保护设备本地的敏感文件(如日志、配置、凭据),防止设备被拆解后Flash中的数据被直接读取。
数据库加密:例如SQLite的加密扩展通常基于AES实现。固件升级(FOTA):
云端下发的升级包经AES加密,设备端下载后使用本地预置的固定密钥或动态协商的密钥解密,防止固件被逆向分析。
常见问题¶
避免使用固定IV:每次加密应使用新生成的随机IV。
CBC模式不具备防篡改能力:建议优先使用AES-GCM/CCM等认证加密模式;若使用CBC,须额外附加HMAC完整性校验。
做好密钥管理:密钥不得硬编码在代码中、不得输出到日志,也不应多台设备共用;同时应支持密钥的安全存储与定期轮换。
AES加解密API¶
头文件¶
qcm_aes.h
函数概览¶
函数 |
说明 |
|---|---|
qcm_aes_string_encryption() |
对单块16字节明文数据进行AES加密 |
qcm_aes_string_decryption() |
对单块16字节密文数据进行AES解密 |
qcm_aes_string_cbc_encryption() |
使用AES-CBC模式对任意长度数据进行加密,并自动进行PKCS#7填充 |
函数详解¶
qcm_aes_string_encryption¶
功能描述
使用给定密钥对单块16字节明文数据进行AES加密,输出16字节密文。函数原型
void qcm_aes_string_encryption(qosa_uint8_t key[16],
int key_length,
qosa_uint8_t inputdata[16],
qosa_uint8_t outputdata[16]);
参数说明
参数名 |
输入/输出 |
类型 |
说明 |
|---|---|---|---|
key |
输入 |
qosa_uint8_t [16] |
AES加密密钥;长度由 key_length 指定 |
key_length |
输入 |
int |
密钥长度 |
inputdata |
输入 |
qosa_uint8_t [16] |
待加密的16字节明文数据 |
outputdata |
输出 |
qosa_uint8_t [16] |
用于存放16字节密文结果的缓冲区 |
返回值说明
无
qcm_aes_string_decryption¶
功能描述
使用与加密端一致的密钥对单块16字节密文数据进行AES解密,还原出原始明文。函数原型
void qcm_aes_string_decryption(qosa_uint8_t key[16],
int key_length,
qosa_uint8_t inputdata[16],
qosa_uint8_t outputdata[16]);
参数说明
参数名 |
输入/输出 |
类型 |
说明 |
|---|---|---|---|
key |
输入 |
qosa_uint8_t [16] |
AES解密密钥;必须与加密端使用的密钥一致 |
key_length |
输入 |
int |
密钥长度 |
inputdata |
输入 |
qosa_uint8_t [16] |
待解密的16字节密文数据 |
outputdata |
输出 |
qosa_uint8_t [16] |
用于存放16字节明文结果的缓冲区 |
返回值说明
无
qcm_aes_string_cbc_encryption¶
功能描述
使用AES-CBC模式对任意长度的明文数据进行加密,并自动按PKCS#7标准填充至16字节的整数倍,适用于加密变长报文。输出缓冲区须预留足够空间,以容纳填充后的密文数据。函数原型
void qcm_aes_string_cbc_encryption(
qosa_uint8_t *key,
qosa_uint32_t keybits,
qosa_uint8_t iv[16],
qosa_uint8_t *inputdata,
qosa_uint8_t *outputdata,
int inlen,
int *outlen
);
参数说明
参数名 |
输入/输出 |
类型 |
说明 |
|---|---|---|---|
key |
输入 |
qosa_uint8_t * |
指向AES加密密钥的指针;密钥长度由 keybits 指定 |
keybits |
输入 |
qosa_uint32_t |
密钥长度;范围:128、192、256;单位:比特 |
iv |
输入 |
qosa_uint8_t [16] |
16字节初始化向量(IV);每次加密应使用新生成的随机IV |
inputdata |
输入 |
qosa_uint8_t * |
指向待加密明文数据的指针;长度由 inlen 指定 |
outputdata |
输出 |
qosa_uint8_t * |
指向存放密文的输出缓冲区;容量至少为 inlen+16字节,以容纳PKCS#7填充后的数据 |
inlen |
输入 |
int |
明文数据长度;单位:字节 |
outlen |
输出 |
int * |
输出加密后密文的实际总长度,含PKCS#7填充;单位:字节 |
返回值说明
无
应用逻辑流程图¶
示例代码¶
完整示例代码请查看https://github.com/UniRTOS/UniRTOS-Doc-Examples/blob/main/network/crypto/aes_demo.c