【问题标题】:Invalid Algorithm Specified CryptoAPI指定的算法无效 CryptoAPI
【发布时间】:2009-10-07 02:34:30
【问题描述】:

我正在尝试使用 128BIT AES 解密来解密某些内容。当我尝试调用 CryptDecrypt 时,我收到一条错误消息,指出“指定的算法无效”。我在使用这里发布的库时遇到了同样的问题:http://www.codeproject.com/KB/security/WinAES.aspx

什么会导致这个错误?

我在 vista64bit 和 Visual Studio 2008 上使用 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];
};

EDIT2

重新启动计算机并删除 CBC 块后。我现在收到错误数据错误。数据在 C# 中可以很好地解密。但我需要使用 wincrypt 来做到这一点。

【问题讨论】:

  • 另外,如果我不硬核“Microsoft 增强型 RSA 和 AES 加密提供程序”,它会抓取适用于 Windows XP 的那个不起作用

标签: c++ aes cryptoapi


【解决方案1】:

您是否通过引用InitWithCrypt 来传递cryptoHandle?如果没有,你的代码

if(!CryptAcquireContextW(&cryptoHandle, ...

只会修改InitWinCryptcryptoHandle副本。


编辑:既然如此,请尝试摆脱设置 CRYPT_MODE_CBCCryptSetKeyParam 调用

【讨论】:

  • __inout ULONG_PTR& cryptoHandle 这就是它的通过方式。
  • 做了同样的错误,我已经尝试了所有可能的事情。
  • 奇怪,在我做出更改之前,我的代码也出现“指定的算法无效”(32 位 vista,msvc 2008)
  • 这里有个问题,对于您的KP_IV 调用,您如何才能让{ 0xFF, ... } 进行编译?我会用aesKey.Key 替换它
  • 我实际上确实使用了 aesKey.key,因为我只是稍微搞砸了 uip 那个部分。当改变密钥时。
猜你喜欢
  • 1970-01-01
  • 2019-05-29
  • 2020-01-12
  • 1970-01-01
  • 2018-03-13
  • 2012-07-19
  • 2011-11-17
  • 2017-04-07
  • 1970-01-01
相关资源
最近更新 更多