我正在尝试使用"Microsoft RSA SChannel Cryptographic Provider“生成数字签名。获取容器的句柄后,我将使用CryptGenKey()生成签名。但是这个函数返回FALSE。
CryptGenKey()的dwError返回80090008。
这同样适用于任何其他提供程序类型。此外,当我尝试为同一提供者创建密钥交换对时,它工作得很好。我做错了什么?
#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;
}谢谢。
发布于 2017-07-21 23:35:49
SChannel提供程序不支持AT_SIGNATURE RSA,仅支持AT_EXCHANGE。它主要是早期TLS (当时还是SSL)的遗留问题,当时使用RSA加密来交换密钥,而不是使用由RSA签名签署的Diffie-Hellman密钥协议……然后,假设“好吧,每个人都知道SChannel提供者的行为,为什么要改变它呢?”(我看到的最接近这一点的是https://msdn.microsoft.com/en-us/library/windows/desktop/aa387690(v=vs.85).aspx
在CAPI中,AT_EXCHANGE密钥可以进行加密和签名,而AT_SIGNATURE密钥只能进行签名。
一般来说,Windows加密团队不鼓励使用CAPI编写新代码(我没有比我刚才写的更多的书面证据;这主要来自与他们的会议)。CNG有一个对开发人员更友好的API,而且功能更强大。CNG在Windows Vista中重新发布,因此它在所有受支持的Windows版本中都可用。CAPI不再服务于“好吧,它有更多的覆盖范围”的目的,它只是“旧的,粗糙的,遗留的应用程序接口”(除非你正在为不受支持的OSes编写代码,比如XP)。
如果您正在使用CAPI,我不知道您为什么要使用SChannel提供程序。通过MS_ENH_RSA_AES_PROV的PROV_RSA_AES是CAPI拥有的功能最强大的MS_ENH_RSA_AES_PROV(基于SHA-2的PKCS签名)。但与CNG中的软件提供商相比,它已经过时了(PSS签名,使用SHA-2的OAEP,并且支持大于2^32的公共指数值(好的,这不是常见的需求,但它是CNG修复的))。
https://stackoverflow.com/questions/45211765
复制相似问题