esp32 + idf , AES-CBC加解密。数据填充0,uint8_t KEY[16]={0x00,01,02,03,04,05,06,07,08,09,0A,0B,0C,0D,0E,0F},向量IV[16]={0},串口接收加密后的数据然后解密,第一次能正常成功解密,第二次以后就没有办法正确解密了
3条回答 默认 最新
阿里嘎多学长 2024-05-15 09:21关注以下内容由CHATGPT及阿里嘎多学长共同生成、有用望采纳:
您想要解决的问题
您提问的目的是解决在使用ESP32微控制器进行AES-CBC模式加解密时遇到的问题。具体来说,您在使用ESP32和idf开发框架进行数据加密和解密时,发现第一次解密可以成功,但从第二次开始解密失败。
问题出现原因
问题出现的原因是在使用CBC(Cipher Block Chaining)模式进行加密时,每次加密的初始化向量(IV)应该是唯一的。在您的代码中,IV被初始化为全0,并且在多次加密过程中没有改变,这违反了CBC模式的安全要求。如果IV不是唯一的,那么相同的密文块可能会产生相同的加密块,导致解密失败。
问题解决方案
最优解决方案是确保每次加密时使用一个唯一的IV。通常,IV可以随机生成,并且在解密时需要知道它以正确解密数据。以下是一些改进措施:
- 随机生成IV:每次加密前,使用随机数生成器生成一个随机的IV。
- 传输IV:将生成的IV与加密的数据一起发送,确保接收方可以获取到正确的IV来解密数据。
- 使用不同的密钥:如果可能,每次加密时使用不同的密钥,以增加安全性。
提供代码
以下是修改后的代码示例,展示了如何生成随机IV并进行加密解密:
#include <stdio.h> #include <string.h> #include <esp_system.h> #include <mbedtls/aes.h> // 假设这是您的加密和解密函数 void aes_cbc_encrypt_decrypt(bool encrypt, uint8_t *key, uint8_t *iv, uint8_t *data, size_t data_len) { mbedtls_aes_context aes_ctx; uint8_t *output = encrypt ? (uint8_t *)malloc(data_len) : data; mbedtls_aes_init(&aes_ctx); // 设置密钥 mbedtls_aes_setkey_enc(&aes_ctx, key, 128); // 设置IV mbedtls_aes_crypt_cbc(encrypt, data_len, iv, data, output, &aes_ctx); // 清理 mbedtls_aes_free(&aes_ctx); if (!encrypt) { free(output); } } int main() { uint8_t key[16] = {0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F}; uint8_t iv[16]; uint8_t data[64] = { /* 你的数据 */ }; // 生成随机IV for (int i = 0; i < 16; ++i) { iv[i] = esp_random(); } // 加密数据 aes_cbc_encrypt_decrypt(true, key, iv, data, sizeof(data)); // 解密数据(假设接收方已经获取了IV) aes_cbc_encrypt_decrypt(false, key, iv, data, sizeof(data)); return 0; }代码运行方式
- 确保您的开发环境已经安装了ESP-IDF和mbedtls库。
- 将上述代码复制到您的ESP32项目中。
- 使用ESP-IDF编译并上传到ESP32开发板。
- 使用串口工具查看加密和解密的结果。
代码预期运行结果
如果代码正确运行,您将看到原始数据被加密,然后使用相同的IV和密钥进行解密,最终得到原始数据。
推荐相关链接
请根据实际情况调整代码以符合您的项目需求。
解决 无用评论 打赏 举报 编辑记录