2009-10-07 3 views
1

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

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

Я использую 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:

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

EDIT2

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

+0

ум разместить код? – GRB

+0

Там же выложил – UberJumper

+0

Также, если я не хардкор «Microsoft Enhanced RSA и AES Cryptographic Provider», он захватывает тот, который для Windows XP, который работает над действиями – UberJumper

ответ

1

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

if(!CryptAcquireContextW(&cryptoHandle, ... 

бы изменить только копию InitWinCrypt «s из cryptoHandle.


EDIT: Учитывая, что это, попытайтесь избавиться от CryptSetKeyParam вызова, который устанавливает CRYPT_MODE_CBC

+0

__inout ULONG_PTR & cryptoHandle Thats, как его получить. – UberJumper

+0

Произошла такая же ошибка, я пробовал как каждую возможную вещь. – UberJumper

+0

odd, я также получал «недействительный алгоритм, указанный» с вашим кодом, пока я не сделал это изменение (32-разрядная версия, msvc 2008) – GRB

 Смежные вопросы

  • Нет связанных вопросов^_^