ZHCAFM5 July   2025 CC2642R-Q1

 

  1.   1
  2.   摘要
  3. 1蓝牙配对技术原理剖析
    1. 1.1 LE Legacy配对与LE Secure Connections配对
    2. 1.2 关联模式安全特性分析
    3. 1.3 隐私保护与地址管理
  4. 2配对加密的常见问题
    1. 2.1 完整性校验故障——MIC校验失败(MIC failure)
    2. 2.2 密钥协商异常—— DHKey校验失败(DHKey check fail)
    3. 2.3 密钥管理缺陷——PIN/Key丢失(PIN or Key missing)
      1. 2.3.1 配对阶段密钥缺失
      2. 2.3.2 加密阶段LTK丢失
  5. 3一种加密资源冲突解决方案
    1. 3.1 环境选择与配置
    2. 3.2 使用TinyAES库实现AES-256加密和解密
    3. 3.3 系统级优化探索
      1. 3.3.1 内存分配检查
      2. 3.3.2 填充处理与线程安全
  6. 4总结
  7. 5参考文档

使用TinyAES库实现AES-256加密和解密

  • 添加AES加密任务的实现
 encrypt_task.c 
#include "FreeRTOS.h"
#include "task.h"
#include "aes.h"
#include <stdio.h>
#include <string.h>

#define AES_BLOCK_SIZE 16

// AES-256密钥(必须为32字节)
static uint8_t key[32] = {xx};

// 初始化向量(IV),必须为16字节
static uint8_t iv[AES_BLOCK_SIZE] = {yy};

void EncryptTask(void *pvParameters) {
  uint8_t plaintext_block[AES_BLOCK_SIZE] = {0};  
  memcpy(plaintext_block, plaintext, strlen(plaintext));

  uint8_t ciphertext_block[AES_BLOCK_SIZE] = {0};
  uint8_t decrypted_block[AES_BLOCK_SIZE] = {0};
  
  // AES CBC 加密上下文
  struct AES_ctx ctx;  
  AES_init_ctx_iv(&ctx, key, iv);

  // 加密
  AES_CBC_encrypt_buffer(&ctx, plaintext_block, AES_BLOCK_SIZE);  
  memcpy(ciphertext_block, plaintext_block, AES_BLOCK_SIZE);

  // 解密(重新初始化上下文以确保IV被重置)
  AES_init_ctx_iv(&ctx, key, iv);
  AES_CBC_decrypt_buffer(&ctx, ciphertext_block, AES_BLOCK_SIZE);
  memcpy(decrypted_block, ciphertext_block, AES_BLOCK_SIZE);

  vTaskDelay(pdMS_TO_TICKS(1000)); // 任务延时
  • 在主函数中创建任务
 main.c 
#include "FreeRTOS.h"
#include "task.h"
#include "encrypt_task.h"

int main(void) {
  // 初始化硬件
  // 创建加密任务
  xTaskCreate(EncryptTask,     // 任务函数
             "Encrypt Task",  // 任务名称
              512,           // 堆栈大小(字节)      
              NULL,         // 任务参数
              1,           // 优先级(任务越重要越高)
              NULL);      // 任务句柄
  // 启动RTOS调度器  
  vTaskStartScheduler();
}

该方法的优势在于:

  • 轻量级的软件库提供了几乎不损耗CPU运算和存储能力的加密选择。事实上,TinyAES库占用代码非常轻量,在不含浮点操作的情况下大约需要 ~2-3 KB 的代码空间(包括AES实现和初始化向量支持),这同样取决于选定的加密模式(CBC模式比CTR模式稍多代码)。应用代码若包含关键的打印语句(如printf)和本地数据,大约会占用 ~2-4 KB 的额外Flash和~2.5KB的额外RAM。
  • 软件方法允许开发者根据具体需求优化算法。例如,通过查表法优化混淆、引入混沌映射增强密钥安全性,或动态调整密钥生成策略。硬件实现通常固化算法逻辑,难以修改。采用不同的软件库可以支持更多的加密模式(如ECB、CBC、CTR等),开发者可根据需求灵活选择并扩展AES engine所不支持的加密算法。
  • 软件实现的加密逻辑可通过固件升级(如OTA)快速修复漏洞或更新算法,而硬件加速器需如前文介绍,调整整个应用的设计逻辑以寻求规避。成本更大。