用OpenSSL解密DES

时间:2011-10-22 21:16:59

标签: c++ qt openssl des

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

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

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中有一个工作实现,附在本文的底部,以进行测试。)我不确定发生了什么;我是否在转换为char或者滥用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()

1 个答案:

答案 0 :(得分:2)

这个问题只是对DES_set_odd_parity(&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);
}