我使用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值返回,我也没有考虑盐值(实际上我不知道如何)。什么应该是正确的静脉注射值?
答案 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。