微软的cryptoAPI“微软增强型RSA和AES加密提供商”选择不适用于win7

时间:2013-06-29 16:13:32

标签: visual-c++ encryption aes cryptoapi mscapi

我想对数据使用AES 256位加密,它由“MS_ENH_RSA_AES_PROV”提供。当我尝试使用以下代码运行时 pszProviderName = TEXT( “MS_ENH_RSA_AES_PROV”) 作为CryptAcquireContext的第三个参数,我得到类似错误号80090019的输出。这个错误代码意味着“请求的提供者不存在”。

#include <windows.h>
#include <Wincrypt.h>

#pragma comment(lib, "crypt32.lib")

void main(void) 
{ 
    // Handle for the cryptographic provider context.
    HCRYPTPROV hCryptProv;

    // The name of the container.
    LPCTSTR pszContainerName = TEXT("MyFilter_Container");

    // The name of the provider
    LPCTSTR pszProviderName = TEXT("MS_ENH_RSA_AES_PROV");

    // Begin processing. Attempt to acquire a context
    if(CryptAcquireContext(
        &hCryptProv,
        pszContainerName,
        pszProviderName,
        PROV_RSA_FULL,
        0))
    {
        _tprintf(TEXT("A crypto context acquired"));

        // Release the CSP.
        if(hCryptProv)
        {
            if(!(CryptReleaseContext(hCryptProv, 0)))
            {
                 _tprintf(TEXT("Error during CryptReleaseContext."));
            }
        }
    }
    else
    {
        _tprintf(TEXT("An error occurred in the program. \n"));
        _tprintf(TEXT("Error number %x.\n"), GetLastError());
        exit(1); 
    }
}

如果我使用 pszProviderName = TEXT(“Microsoft增强型RSA和AES加密提供程序”), 它给出错误号0x8009001b,这意味着“由dwProvType指定的提供程序类型与找到的提供程序类型不匹配,并且只有在pszProviderName指定实际CSP名称时才会出现此错误”。以下错误号在msdn的CryptAcquireContext文档中指定。我不明白为什么会这样。如果此参数为Null,则表示要使用默认CSP,在这种情况下一切正常。我正在使用windows7。这个CSP不可用还是有其他原因?请有人帮忙。谢谢你。

1 个答案:

答案 0 :(得分:2)

我不确定这是否正是您所需要的,但是通过关注the example on MSDN,您可以通过进行两次更改来使代码成功。

首先,MSDN says MS_ENH_RSA_AES_PROV在Windows XP上的命名方式不同,应该与代码中的PROV_RSA_AES而不是PROV_RSA_FULL一起使用。

其次,捕获初始错误并针对必须创建新密钥容器的情况重复获取操作。

以下是您根据MSDN示例调整的原始代码,可在我的Windows 8系统上正常运行:

int _tmain(int argc, _TCHAR* argv[])
{
    // Handle for the cryptographic provider context.
    HCRYPTPROV hCryptProv;

    // The name of the container.
    LPCTSTR pszContainerName = TEXT("MyFilter_Container");

    // Begin processing. Attempt to acquire a context
    if(CryptAcquireContext(
        &hCryptProv,
        pszContainerName,
        MS_ENH_RSA_AES_PROV,
        PROV_RSA_AES,
        0))
    {
        _tprintf(TEXT("A crypto context acquired"));

        // Release the CSP.
        if(hCryptProv)
        {
            if(!(CryptReleaseContext(hCryptProv, 0)))
            {
                _tprintf(TEXT("Error during CryptReleaseContext."));
            }
        }
    }
    else
    {
        DWORD dwError = GetLastError();
        if (dwError == NTE_BAD_KEYSET)
        {
            if(CryptAcquireContext(
                &hCryptProv,
                pszContainerName,
                MS_ENH_RSA_AES_PROV,
                PROV_RSA_AES,
                CRYPT_NEWKEYSET))
            {
                _tprintf(TEXT("A crypto context acquired"));

                // Release the CSP.
                if(hCryptProv)
                {
                    if(!(CryptReleaseContext(hCryptProv, 0)))
                    {
                        _tprintf(TEXT("Error during CryptReleaseContext."));
                    }
                }
            }
            else
            {
                _tprintf(TEXT("Unable to create a new key container. \n"));
                _tprintf(TEXT("Error number %x.\n"), dwError);
                exit(1); 
            }
        }
        else
        {
            _tprintf(TEXT("An error occurred in the program. \n"));
            _tprintf(TEXT("Error number %x.\n"), dwError);
            exit(1); 
        }
    }

    return 0;
}

一旦取得成功,您可以使用CryptGetProvParam查找所使用的提供商,我的系统会提供

Microsoft Enhanced RSA and AES Cryptographic Provider