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);
验证步骤
- 取你的MAC地址,按PKCS#7填充成16字节块;
- 使用在线工具,选择AES-128 ECB模式,输入填充后的字节块和正确密钥;
- 对比加密后的Base64结果,确认与代码输出一致。
内容的提问来源于stack exchange,提问作者user20519508
相关产品推荐
相关产品推荐

