CryptoAPI RSA Schannel提供程序错误
我正在尝试使用Microsoft RSA SChannel加密提供程序生成数字签名。在获得容器的句柄之后,我将使用CryptGenKey生成一个签名。但是这个函数返回FALSE CryptGenKey的dwError返回80090008 这同样适用于任何其他提供程序类型。另外,当我尝试为同一个提供者创建密钥交换对时,它工作正常。我做错了什么CryptoAPI RSA Schannel提供程序错误,c,rsa,provider,cryptoapi,schannel,C,Rsa,Provider,Cryptoapi,Schannel,我正在尝试使用Microsoft RSA SChannel加密提供程序生成数字签名。在获得容器的句柄之后,我将使用CryptGenKey生成一个签名。但是这个函数返回FALSE CryptGenKey的dwError返回80090008 这同样适用于任何其他提供程序类型。另外,当我尝试为同一个提供者创建密钥交换对时,它工作正常。我做错了什么 #include <Windows.h> #include <wincrypt.h> int main() { HCRYP
#include <Windows.h>
#include <wincrypt.h>
int main()
{
HCRYPTPROV phProv = 0;
LPTSTR pszContainer = NULL;
DWORD dwFlags = 0;
bool flag;
DWORD_PTR dwError;
HCRYPTKEY phKey;
flag = CryptAcquireContext(&phProv, pszContainer,
MS_DEF_RSA_SCHANNEL_PROV, PROV_RSA_SCHANNEL, dwFlags);
if (!flag)
{
flag = CryptAcquireContext(&phProv, pszContainer,
MS_DEF_RSA_SCHANNEL_PROV, PROV_RSA_SCHANNEL, CRYPT_NEWKEYSET);
}
dwError = GetLastError();
flag = CryptGenKey(phProv, AT_SIGNATURE, CRYPT_EXPORTABLE, &phKey);
dwError = GetLastError();
flag = CryptGetUserKey(phProv, AT_SIGNATURE, &phKey);
dwError = GetLastError();
return 0;
}
谢谢。SChannel提供商不支持AT_签名RSA密钥,只支持AT_EXCHANGE。这主要是早期TLS的遗留问题,当时仍然是SSL,使用RSA加密交换密钥,而不是使用RSA签名签署的Diffie-Hellman密钥协议。。。然后,想必大家都知道SChannel提供者的行为,为什么要改变它?。我看到的最接近于被写下来的是,它显示了CALG_RSA_KEYX,而不是CALG_RSA_符号 在CAPI中,AT_交换密钥可以进行加密和签名,而AT_签名密钥只能进行签名 一般来说,Windows密码团队不鼓励使用CAPI编写新代码。除了我刚刚编写的代码之外,我没有其他书面证据;这主要来自与他们的会面。CNG有一个开发人员友好得多的API,而且功能更强大。CNG在Windows Vista中重新发布,因此它在所有受支持的Windows版本中都可用。CAPI已经不能满足用户的需求了,它的覆盖范围越来越广,它只是旧的、粗糙的、遗留的API,除非您正在为XP等不受支持的操作系统编写代码 如果您正在使用CAPI,我不知道您为什么要使用SChannel提供程序。通过MS_ENH_RSA_AES_PROV_RSA_AES_是CAPI拥有基于SHA-2的PKCS签名的功能最强大的RSA。但与CNG PSS签名中的软件提供商相比,它已经过时了,OAEP带有SHA-2,并且支持大于2^32的公共指数值好吧,这不是一个常见的需求,但它是CNG修复的