You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

mbedtls AES-128 ECB模式加密结果异常求助(ESP32场景)

ESP32 AES-128 ECB加密MAC地址生成SSID结果与在线工具不一致的问题排查

以下是代码中导致结果不一致的核心问题及修复方案:

1. 输入填充方式不匹配

AES-128 ECB要求输入必须是16字节块,你的代码用零填充(将6字节MAC后补10个0x00),但绝大多数在线加密工具默认使用PKCS#7填充:填充字节的值等于需要填充的字节数,即6字节MAC需要补10个0x0A(因为16-6=10)。两种填充方式的输入块完全不同,加密结果自然无法匹配。

修复:改用PKCS#7填充:

uint8_t mac_padded[16] = {0};
memcpy(mac_padded, mac, sizeof(mac));
size_t pad_len = 16 - sizeof(mac);
for (size_t i = sizeof(mac); i < 16; i++) {
    mac_padded[i] = pad_len;
}

2. AES密钥初始化错误

你的代码中密钥定义为:

const uint8_t aes_key[16] = "1234567891234567";

C语言中字符串字面量会自动在末尾添加\0终止符,因此这个数组的最后一个元素实际是\0(ASCII 0),而非原字符串的第16个字符'7'。这导致你使用的密钥与在线工具输入的"1234567891234567"完全不同。

修复:直接用字节数组初始化,避免字符串终止符干扰:

const uint8_t aes_key[16] = {'1','2','3','4','5','6','7','8','9','1','2','3','4','5','6','7'};

或者将数组长度定义为17,确保完整包含字符串和终止符,但加密时只取前16字节:

const uint8_t aes_key[] = "1234567891234567"; // 长度17,包含'\0'
// 调用时传入前16字节
mbedtls_aes_setkey_enc(&aes, aes_key, 128);

3. Base64编码未添加字符串终止符

mbedtls_base64_encode函数仅输出Base64编码的字节数据,不会自动添加\0字符串终止符。你的代码直接用%s打印encrypted_base64,可能会读取到内存中的垃圾数据,导致看起来和在线工具结果不一致。

修复:在编码后手动添加终止符:

size_t len = 0;
mbedtls_base64_encode((unsigned char *)output_base64, output_size, &len, encrypted, sizeof(encrypted));
output_base64[len] = '\0'; // 添加字符串终止符
ESP_LOGI(TAG, "Encrypted Base64 output: %s", output_base64);

验证步骤

  1. 取你的MAC地址,按PKCS#7填充成16字节块;
  2. 使用在线工具,选择AES-128 ECB模式,输入填充后的字节块和正确密钥;
  3. 对比加密后的Base64结果,确认与代码输出一致。

内容的提问来源于stack exchange,提问作者user20519508

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 12:04:54