我想对数据使用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不可用还是有其他原因?请有人帮忙。谢谢你。
答案 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