我正在尝试使用128BIT AES解密来解密某些内容。当我尝试调用CryptDecrypt时,出现错误,指出“指定了无效的算法”。使用此处发布的库时遇到相同的问题:http://www.codeproject.com/KB/security/WinAES.aspx
什么会导致此错误?
我正在Visual Studio 2008的vista64bit上使用CryptoAPI。我检查了注册表,并找到了AES库...
编辑
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];
};
编辑2
重新启动我的计算机后,重新删除CBC块。我现在收到错误数据错误。数据在C#中可以很好地解密。但是我需要使用wincrypt做到这一点。
最佳答案
您是否通过引用cryptoHandle
传递InitWithCrypt
?如果没有,您的代码
if(!CryptAcquireContextW(&cryptoHandle, ...
只会修改
InitWinCrypt
的cryptoHandle
副本。编辑:既然可以,请尝试摆脱设置
CryptSetKeyParam
的CRYPT_MODE_CBC
调用关于c++ - 指定了无效算法的CryptoAPI,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1529208/