2011-10-22 178 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); 
}