CryptDecryptがエラーコード0x80090005(NTE_BAD_DATA)で失敗するのはなぜですか?

私は与えられた鍵とivを使って与えられた暗号を復号するためにこのコードを書きました。 CryptDecryptがfalseを返し、GetLastError()が0x80090005(NTE_BAD_DATA)を返すまでうまく動作します。

#include 
#include 

struct AesKey
{
    BLOBHEADER Header;
    DWORD dwKeyLength;
    BYTE cbKey[16];

        AesKey()
    {
        ZeroMemory(this, sizeof(*this));
        Header.bType = PLAINTEXTKEYBLOB;
        Header.bVersion = CUR_BLOB_VERSION;
        Header.reserved = 0;
        Header.aiKeyAlg = CALG_AES_128;
        dwKeyLength = 16;
    }
};

void AesDecrypt(unsigned char *output, unsigned char *input, int inLen, unsigned char *key, unsigned char *iv, int &plainSize)
{
    HCRYPTPROV provider;
    AesKey rawKey;
    HCRYPTKEY cKey;

    BOOL hr = CryptAcquireContext(&provider, NULL, MS_ENH_RSA_AES_PROV, PROV_RSA_AES, 0);
    if (hr == FALSE)
        throw "Unable to acquire AES Context";

    for (int i = 0; i < 16; i++)
        rawKey.cbKey[i] = key[i];

    hr = CryptImportKey(provider, (BYTE *) &rawKey, sizeof(AesKey), NULL, 0, &cKey);
    if (hr == FALSE)
        throw "Unable to import given key";

    hr = CryptSetKeyParam(cKey, KP_IV, (BYTE *) iv, 0);
    if (hr == FALSE)
        throw "Unable to set IV";

    DWORD dwMode = CRYPT_MODE_CBC;
    hr = CryptSetKeyParam(cKey, KP_MODE, (BYTE*) &dwMode, 0);
    if (hr == FALSE)
        throw "Unable to set mode";

    memcpy(output, input, inLen);

    DWORD d = (DWORD) inLen;
    hr = CryptDecrypt(cKey, NULL, TRUE, 0, output, &d);
    if (hr == FALSE)
    {
        int err = GetLastError();
        throw "Error during Decryption";
    }

    plainSize = d;
}

あなたは何か考えている場合は、共有してください:)

前もって感謝します...

3
これは正確に16バイトの配列です。30 79 13 98 C8 97 97 A5 5C ED F4 79 1F 84 0F 43
追加された 著者 Francesco Boffa,
それはファイルから来た、私はキーが正しいと確信して、IVがクリアされ、アルゴリズムはAESです
追加された 著者 Francesco Boffa,
あなたのデータが実際に悪い可能性はありますか?暗号化されたテキストはどこから来たのですか?
追加された 著者 Chowlett,
はい、どこから来たのですか?暗号化された場所はどこですか?復号化と同じアルゴリズム、鍵、設定を使用して暗号化されていますか?
追加された 著者 Chowlett,
同じOS から来たのですか?
追加された 著者 Chowlett,
あなたの問題とは無関係ですが、 ZeroMemory(this)を習慣にするべきではありません。整数データのみを持つ単純な構造では動作しますが、クラス/構造体の浮動小数点数は、仮想メソッドがある場合は仮想テーブルポインタと同様に乱されます。すべての変数を1つずつクリアします。
追加された 著者 Some programmer dude,

答えはありません

0