使用AES解密时,前16个字节已损坏

时间:2014-09-01 09:49:27

标签: c++ encryption openssl cryptography aes

我使用openssl编码了一个文本文件,如下所示:

openssl enc -nosalt -aes-128-cbc -k mypass -in "test.txt" -out "test_enc.txt" -p

然后返回键和iv,如下所示:

key=A029D0DF84EB5549C641E04A9EF389E5
iv =A10CE9C4682486F8622F2F18E7291367

这是我用来解密文件的代码:

 int main() {

      streampos size;
      char * indata;

      ifstream file ("test_enc.txt", ios::in|ios::binary|ios::ate);
      ofstream outfile ("test_decoded.txt",std::ofstream::binary);

      if (file.is_open())
      {
        size = file.tellg();

        indata = new char [size];
        file.seekg (0, ios::beg);
        file.read (indata, size);

        file.close();

        unsigned char* outdata=new unsigned char [size];

        unsigned char ckey[] = "\xA0\x29\xD0\xDF\x84\xEB\x55\x49\xC6\x41\xE0\x4A\x9E\xF3\x89\xE5";
        unsigned char ivec[] = "\xA1\x0C\xE9\xC4\x68\x24\x86\xF8\x62\x2F\x2F\x18\xE7\x29\x13\x67";

        AES_KEY key;

        AES_set_decrypt_key(ckey, 256, &key);

        AES_cbc_encrypt((unsigned char*) indata, outdata, size, &key, ivec, AES_DECRYPT);


        outfile.write ((char*) outdata,size);

        delete[] indata;
        delete[] outdata;
      }
      else{
          cout << "Unable to open file";
          cerr << "Error: " << strerror(errno);
      }
      outfile.close();
      file.close();
      return 0;
}

此代码完美无缺。但是,当我在编码时使用salt时,如下面的命令:

openssl enc -aes-128-cbc -k mypass -in "test.txt" -out "test_enc.txt" -p

并在代码中适当地替换密钥和ivec,整个文件被正确解密但前16个字节!我从其他有类似问题的帖子中学到了什么,我知道iv值是错误的,但我不知道什么是正确的iv值。我只使用加密后的密钥和iv值返回,我也没有考虑盐值(实际上我不知道如何)。什么应该是正确的静脉注射值?

2 个答案:

答案 0 :(得分:1)

根据您的问题症状,在我看来,您的以下逻辑可能会释放您的程序中的后续代码正在读取它的内存。这导致了这种情况。通常发生这种情况是因为在释放内存之后,堆管理器通常会为自己的使用写入一些内务处理信息。

关键是我们不应该在释放之后使用内存,因为它正在悬空。

//Allocate the memory
unsigned char* outdata=new unsigned char [size];

// It appears to me that here the outdata is getting freed. I do not see anywhere
// else this memory is getting freed.
AES_cbc_encrypt((unsigned char*) indata, outdata, size, &key, ivec, AES_DECRYPT);
// Due to this, while accessing it we are seeing the 16 bytes corrupted.
outfile.write ((char*) outdata,size);

您可以使用任何动态工具来识别此类问题。

答案 1 :(得分:1)

我有类似的问题。在我的例子中,问题是在执行算法期间修改了传递给 AES_cbc_encrypt 的IV。我之前必须保存一份副本才能保留IV内容。

描述了类似问题的解决方案here