1
我试图使用OpenSSL从外部源解密DES加密文件,并使用OpenSSL(其他库不是真正的选项,因为应用程序已经连接到它并且我不不想引入新的依赖关系)。这是一个Qt应用程序,所以数据以QByteArrays的形式出入。使用OpenSSL解密DES
这里是此刻的代码,我有(设置为解密后的数据写出来以供查阅的文件):
AmzHandler::AmzHandler(QByteArray encoded)
{
QByteArray encrypted = QByteArray::fromBase64(encoded);
QByteArray decrypted = decrypt(encrypted);
QFile fred ("decrypted");
fred.open(QFile::WriteOnly);
fred.write(decrypted);
fred.close();
}
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);
}
为我的测试输入输出文件是废话,是不是在多个一致运行。 (我在Python中有一个工作实现,它附在本文的底部,用于测试)。我不确定发生了什么;无论是在转换为字符还是误用OpenSSL时都做了一些简单的修改。
编辑:解决。原来线路DES_set_odd_parity(&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()
这看起来很可疑:'unsigned char * decrypted [encrypted.size()];'。它应该是一个指针或一个数组。 – vhallac
@vhallac好的。我现在已经尝试了'unsigned char decrypted [encrypted.size()];'(在[this](http://www.codealias.info/technotes/des_encryption_using_openssl_a_simple_example))'unsigned char *解密;解密=(无符号字符*)malloc(encrypted.size());'。两者都产生不同大小的输出,但仍然是数百字节的数量级,并且显然不正确。 – Sam
'QByteArray'可能需要数组的长度。没有办法从缓冲区地址确定。 – vhallac