代码之家  ›  专栏  ›  技术社区  ›  pseudomarvin

C中的OpenSSL:在应用程序运行中进行第二次解密后,结果的前16个字节是垃圾

  •  1
  • pseudomarvin  · 技术社区  · 6 年前

    here . 我不需要这是真正的安全

    decryptFileAsBytes 函数返回正确的解密文件作为字节向量。在第二次调用中(在同一个应用程序运行中),结果的前16个字节是垃圾,其余的是正确的。这与我使用的密钥(128位)的大小有关吗?

    static bool decryptFileAsBytes(std::string filename, unsigned char *ckey, unsigned char *ivec, std::vector<unsigned char> &fileBytes)
    {
        std::ifstream ifs(filename, std::ios::binary | std::ios::ate);
        if (ifs.fail())
            return false;
    
        std::ifstream::pos_type pos = ifs.tellg();
        fileBytes.resize(pos);
        ifs.close();
    
        FILE *ifp;
        if (fopen_s(&ifp, filename.c_str(), "rb") != NULL)
            return false;
    
        int bytesRead;
        unsigned char indata[AES_BLOCK_SIZE];
        unsigned char *writePtr = fileBytes.data();
    
        /* data structure that contains the key itself */
        AES_KEY key;
    
        /* set the encryption key */
        AES_set_encrypt_key(ckey, 128, &key);
    
        /* set where on the 128 bit encrypted block to begin encryption*/
        int num = 0;
    
        while (1)
        {
            bytesRead = fread(indata, 1, AES_BLOCK_SIZE, ifp);
    
            AES_cfb128_encrypt(indata, writePtr, bytesRead, &key, ivec, &num, AES_DECRYPT);
            writePtr += bytesRead;
    
            if (bytesRead < AES_BLOCK_SIZE)
                break;
        }
        if (fclose(ifp) != NULL)
            return false;
    
        return true;
    }
    

    1 回复  |  直到 6 年前
        1
  •  1
  •   WhozCraig    6 年前

    问题可能是您没有为后续解密操作保留原始初始化向量。

    随着AES加密/解密操作的进行,该内存被更新以继续后续帧。如果插入代码,您将看到,随着每个加密/解密帧通过API,ivec都会发生更改。

    1. 相反,使用 RAND_bytes 第一
    2. 然后,按正常方式解密文件的其余部分。

    好处是:

    1. 文件的每次加密都将创建不同的字节表示,具体取决于初始随机ivec。如果你对一个文件加密两次,得到的加密字节就不一样了

    只是个建议。不相关,我更喜欢EVP加密接口,建议值得一看。