CryptoAPI RSA Schannel提供程序错误

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

我正在尝试使用Microsoft RSA SChannel加密提供程序生成数字签名。在获得容器的句柄之后,我将使用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;
}

谢谢。

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修复的