2011-10-22 201 views
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() 
+1

这看起来很可疑:'unsigned char * decrypted [encrypted.size()];'。它应该是一个指针或一个数组。 – vhallac

+0

@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

+0

'QByteArray'可能需要数组的长度。没有办法从缓冲区地址确定。 – vhallac

回答

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); 
}