Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 用OpenSSL解密DES_C++_Qt_Openssl_Des - Fatal编程技术网

C++ 用OpenSSL解密DES

C++ 用OpenSSL解密DES,c++,qt,openssl,des,C++,Qt,Openssl,Des,我正在尝试使用OpenSSL从外部源解密DES加密的文件,该文件使用已知密钥和IV(其他库实际上不是一个选项,因为应用程序已经链接到它,我不想引入新的依赖项)。这是一个Qt应用程序,所以数据以QbyteArray的形式进出 下面是我目前拥有的代码(设置为将解密数据写入文件以供检查): 我的测试输入的输出文件是无意义的,并且在多次运行中不一致。(我有一个Python的工作实现,附在这篇文章的底部进行测试。)我不确定到底发生了什么;无论我是在转换成字符的过程中犯了一些简单的错误,还是误用了OpenS

我正在尝试使用OpenSSL从外部源解密DES加密的文件,该文件使用已知密钥和IV(其他库实际上不是一个选项,因为应用程序已经链接到它,我不想引入新的依赖项)。这是一个Qt应用程序,所以数据以QbyteArray的形式进出

下面是我目前拥有的代码(设置为将解密数据写入文件以供检查):

我的测试输入的输出文件是无意义的,并且在多次运行中不一致。(我有一个Python的工作实现,附在这篇文章的底部进行测试。)我不确定到底发生了什么;无论我是在转换成字符的过程中犯了一些简单的错误,还是误用了OpenSSL

编辑:已解决。结果是行
DES\u set\u odd\u奇偶校验(&key)丢失。加上这一点,它就起作用了

下面是Python中的工作代码:

def AmzHandler(encoded):
    encrypted = base64.b64decode(encoded)
    d = pyDes.des(hex_to_str("29AB9D18B2449E31"), mode=pyDes.CBC, IV=hex_to_str("5E72D79A11B34FEE"))
    decrypted = d.decrypt(encrypted)
    f = open("decrypted-py", "w")
    f.write(decrypted)
    f.close()

问题只是缺少对
DES\u set\u odd\u奇偶校验(&key)的调用,这似乎是使用此实现进行正确解码所必需的。工作守则如下:

QByteArray AmzHandler::decrypt(QByteArray encrypted)
{
    DES_cblock key = {0x29, 0xab, 0x9d, 0x18, 0xb2, 0x44, 0x9e, 0x31};
    DES_cblock iv = {0x5e, 0x72, 0xd7, 0x9a, 0x11, 0xb3, 0x4f, 0xee};
    DES_key_schedule schedule;
    unsigned char decrypted[encrypted.size()];

    DES_set_odd_parity(&key);
    DES_set_key_checked(&key, &schedule);

    DES_ncbc_encrypt((unsigned char * )encrypted.constData(), (unsigned char * )decrypted, encrypted.size(), &schedule, &iv, DES_DECRYPT);

    return QByteArray::fromRawData((char * )decrypted, length);
}

这看起来可疑:
unsigned char*已解密[encrypted.size()]。它应该是指针或数组。@vhallac好的。我现在已经尝试了
未签名字符解密[encrypted.size()]和(以下)
未签名字符*已解密;解密=(无符号字符*)malloc(加密的.size())。两者都会产生不同大小的输出,但仍然是数百字节的顺序,而且显然不正确。
QByteArray
可能需要数组的长度。仅仅从缓冲区地址是无法确定的。@vhallac啊,好的。我已将其更改为使用QByteArray::fromRawData(),它接受一个参数,表示它读取的数据的大小。但是,输出仍然是无意义的(无论我使用的是解密声明的哪个变体)。如果我是你,我会仔细检查钥匙。您还可以尝试通过自己加密来对代码进行双重检查,以确保它确实可以在加密之前解密。
QByteArray AmzHandler::decrypt(QByteArray encrypted)
{
    DES_cblock key = {0x29, 0xab, 0x9d, 0x18, 0xb2, 0x44, 0x9e, 0x31};
    DES_cblock iv = {0x5e, 0x72, 0xd7, 0x9a, 0x11, 0xb3, 0x4f, 0xee};
    DES_key_schedule schedule;
    unsigned char decrypted[encrypted.size()];

    DES_set_odd_parity(&key);
    DES_set_key_checked(&key, &schedule);

    DES_ncbc_encrypt((unsigned char * )encrypted.constData(), (unsigned char * )decrypted, encrypted.size(), &schedule, &iv, DES_DECRYPT);

    return QByteArray::fromRawData((char * )decrypted, length);
}