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