AES加解密

Copyright © Quectel Wireless Solutions Co., Ltd. 2026. All rights reserved.


功能概述

提供系统级的AES数据加解密功能,可对用户数据进行对称加解密,保障固件与网络传输数据的机密性。

主要应用场景

  1. 网络通信数据加密:
    在TLS/SSL握手完成后,底层数据流的传输(如HTTPS、MQTT over TLS)普遍采用AES加密。
    即使在非安全链路(直接使用TCP/UDP)上,应用层也常直接调用AES接口(如 qcm_aes_string_cbc_encryption())加密载荷数据。

  2. 本地数据与存储安全:
    文件系统加密:保护设备本地的敏感文件(如日志、配置、凭据),防止设备被拆解后Flash中的数据被直接读取。
    数据库加密:例如SQLite的加密扩展通常基于AES实现。

  3. 固件升级(FOTA):
    云端下发的升级包经AES加密,设备端下载后使用本地预置的固定密钥或动态协商的密钥解密,防止固件被逆向分析。

常见问题

  1. 避免使用固定IV:每次加密应使用新生成的随机IV。

  2. CBC模式不具备防篡改能力:建议优先使用AES-GCM/CCM等认证加密模式;若使用CBC,须额外附加HMAC完整性校验。

  3. 做好密钥管理:密钥不得硬编码在代码中、不得输出到日志,也不应多台设备共用;同时应支持密钥的安全存储与定期轮换。

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填充;单位:字节

  • 返回值说明

应用逻辑流程图

../../../_images/image_XVTOb4leCo6ktpx3o37cMgvenie.webp

示例代码

完整示例代码请查看https://github.com/UniRTOS/UniRTOS-Doc-Examples/blob/main/network/crypto/aes_demo.c