avenlee2023 2024-05-15 09:21 采纳率: 3.8%
浏览 33
已结题

esp32 aes-cbc解密错误

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可以随机生成,并且在解密时需要知道它以正确解密数据。以下是一些改进措施:

    1. 随机生成IV:每次加密前,使用随机数生成器生成一个随机的IV。
    2. 传输IV:将生成的IV与加密的数据一起发送,确保接收方可以获取到正确的IV来解密数据。
    3. 使用不同的密钥:如果可能,每次加密时使用不同的密钥,以增加安全性。

    提供代码

    以下是修改后的代码示例,展示了如何生成随机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和密钥进行解密,最终得到原始数据。

    推荐相关链接

    请根据实际情况调整代码以符合您的项目需求。

    评论 编辑记录

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 5月15日
  • 创建了问题 5月15日