繁体   English   中英

用C ++解密文件,用openssl -aes-128-cbc加密

[英]Decrypting file in C++, which was encrypted with openssl -aes-128-cbc

我正在尝试用C ++解密文件。 使用以下命令加密此文件:

openssl enc -nosalt -aes-128-cbc -pass pass:test -in "test.txt" -out "test_enc.txt" -p

控制台显示key=098F6BCD4621D373CADE4E832627B4F6iv=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加密之前不同的值。

您在OpenSSL上指定-aes-128-cbc作为选项,因此密钥和初始化向量将为128位长。 openssl这些打印为十六进制字符串 ,因为如果打印二进制文件,它们将在控制台上进行混淆。

因此你应该将你的ivec[] 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);

OpenSSL使用您提供的密码创建密钥,您指定的矢量也与解密和加密相关。 在解密文本时,请确保您具有相同的密钥和向量。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM