我正在尝试用C ++解密文件。使用以下命令加密此文件:
openssl enc -nosalt -aes-128-cbc -pass pass:test -in "test.txt" -out "test_enc.txt" -p
控制台会显示key=098F6BCD4621D373CADE4E832627B4F6
和iv=0A9172716AE6428409885B8B829CCB05
。
在C ++中,我已经包含了#include openssl/aes.h
行,并尝试使用以下代码进行解密:
const char *indata = string.toAscii().constData();
unsigned char outdata[strlen(indata)];
unsigned char ckey[] = "098F6BCD4621D373CADE4E832627B4F6";
unsigned char ivec[] = "0A9172716AE6428409885B8B829CCB05";
/* data structure that contains the key itself */
AES_KEY key;
/* set the encryption key */
AES_set_decrypt_key(ckey, 256, &key);
AES_cbc_encrypt((unsigned char*) indata, outdata, strlen(indata), &key, ivec, AES_DECRYPT);
QString result = QString((const char*) outdata);
return result;
变量outdata包含的值与OpenSSL加密前的值不同。
答案 0 :(得分:1)
您在OpenSSL上指定-aes-128-cbc
作为选项,因此密钥和初始化向量将 128位长。 openssl
将这些字符串打印为十六进制字符串,因为如果打印二进制文件,它们将在控制台上进行模糊处理。
因此,您应该将ckey[]
和ivec[]
初始化为十六进制字符串的二进制值,如下所示:
unsigned char ckey[] = "\x09\x8F\x6B\xCD\x46\x21\xD3\x73\xCA\xDE\x4E\x83\x26\x27\xB4\xF6";
unsigned char ivec[] = "\x0A\x91\x72\x71\x6A\xE6\x42\x84\x09\x88\x5B\x8B\x82\x9C\xCB\x05";
并使用密钥长度 128 而不是 256 :
AES_set_decrypt_key(ckey, 128, &key);
答案 1 :(得分:0)
OpenSSL使用您提供的密码创建密钥,您指定的矢量也与解密和加密相关。确保在解密文本时使用相同的密钥和向量。