Указан неверный алгоритм CryptoAPI - PullRequest
1 голос
/ 07 октября 2009

Я пытаюсь что-то расшифровать, используя 128-битное AES-дешифрование. Когда я пытаюсь вызвать CryptDecrypt, я получаю сообщение об ошибке «Указан неверный алгоритм». Я получаю ту же проблему при использовании библиотеки, размещенной здесь: http://www.codeproject.com/KB/security/WinAES.aspx

Что может вызвать эту ошибку?

Я использую CryptoAPI вместе с vista64bit в Visual Studio 2008. Я проверил в реестре и есть библиотека AES ...

EDIT

BYTE*& encryptedData /*  get data length */
HCRYPTPROV cryptoHandle = NULL;
HCRYPTKEY aesKeyHandle = NULL;

hr = InitWinCrypt(cryptoHandle);
if(FAILED(hr))
{
    return hr;
}

AesKeyOffering aesKey = { {PLAINTEXTKEYBLOB, CUR_BLOB_VERSION, 0, CALG_AES_128}, 16, { 0xFF, 0x00, 0xFF, 0x1C, 0x1D, 0x1E, 0x03, 0x04, 0x05, 0x0F, 0x20, 0x21, 0xAD, 0xAF, 0xA4, 0x04 }};

if(CryptImportKey(cryptoHandle, (CONST BYTE*)&aesKey, sizeof(AesKeyOffering), NULL, 0, &aesKeyHandle) == FALSE)
{
    // DO error

    return HRESULT_FROM_WIN32(GetLastError());
}

if(CryptSetKeyParam(aesKeyHandle, KP_IV, { 0xFF, 0x00, 0xFF, 0x1C, 0x1D, 0x1E, 0x03, 0x04, 0x05, 0x0F, 0x20, 0x21, 0xAD, 0xAF, 0xA4, 0x04 } , 0) == FALSE)
{
    return HRESULT_FROM_WIN32(GetLastError());
}

BYTE blah2 = CRYPT_MODE_CBC;
// set block mode
if(CryptSetKeyParam(aesKeyHandle, KP_MODE, &blah2, 0) == FALSE)
{
    // 

    return HRESULT_FROM_WIN32(GetLastError());
}

DWORD lol = dataLength / 16 + 1;
DWORD lol2 = lol * 16;
if(CryptDecrypt(aesKeyHandle, 0, TRUE, 0, encryptedData, &lol2) == FALSE)
{
    return HRESULT_FROM_WIN32(GetLastError());
}

Функция InitWinCrypt

    if(!CryptAcquireContextW(&cryptoHandle, NULL, L"Microsoft Enhanced RSA and AES Cryptographic Provider", PROV_RSA_AES, CRYPT_VERIFYCONTEXT))
{
    if(!CryptAcquireContextW(&cryptoHandle, NULL, L"Microsoft Enhanced RSA and AES Cryptographic Provider", PROV_RSA_AES, 0))
    {
        return HRESULT_FROM_WIN32(GetLastError());
    }
    else
    {
        return S_OK;
    }
}
return S_OK;

Структура AesOffering:

struct AesKeyOffering
{
    BLOBHEADER m_Header;
    DWORD m_KeyLength;
    BYTE Key[16];
};

EDIT2

После перезагрузки компьютера и удаления фрагмента CBC. Теперь я получаю плохие ошибки данных. Данные прекрасно расшифровываются в C #. Но мне нужно сделать это с помощью wincrypt.

1 Ответ

1 голос
/ 07 октября 2009

Вы передаете cryptoHandle по ссылке InitWithCrypt? Если нет, ваш код

if(!CryptAcquireContextW(&cryptoHandle, ...

только изменит InitWinCrypt копию cryptoHandle.


РЕДАКТИРОВАТЬ: Учитывая это, попробуйте избавиться от вызова CryptSetKeyParam, который устанавливает CRYPT_MODE_CBC

...