1

OpenSSLを使用して既知のキーとIVを使用して外部ソースからDES暗号化ファイルを復号化しようとしています(アプリケーションはすでにリンクしており、新しい依存関係を導入したくないため、他のライブラリは実際にはオプションではありません) )。これはQtアプリケーションであるため、データはQByteArrayとして出入りします。

これが私が現在持っているコードです(復号化されたデータを検査のためにファイルに書き出すように設定されています):

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()
4

1 に答える 1

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);
}
于 2011-10-26T22:23:00.087 に答える