CryptoAPI RSA Schannel提供程序错误

时间:2017-07-20 10:12:31

标签: c rsa provider cryptoapi schannel

我正在尝试使用“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;
}

感谢。

1 个答案:

答案 0 :(得分:1)

SChannel提供程序不支持AT_SIGNATURE RSA密钥,仅支持AT_EXCHANGE。当使用RSA加密交换密钥而不是使用与RSA签名签署的Diffie-Hellman密钥协议达成协议时,它主要是从早期TLS(当它仍然是SSL)的保留...然后,大概是“好吧,大家都知道如何SChannel提供商的行为,为什么要改变它呢?“ (我最接近记录的是https://msdn.microsoft.com/en-us/library/windows/desktop/aa387690(v=vs.85).aspx,它显示了CALG_RSA_KEYX,并没有谈到CALG_RSA_SIGN。)

在CAPI中,AT_EXCHANGE密钥可以同时执行加密和签名,AT_SIGNATURE密钥只能进行签名。

一般情况下,Windows密码学团队不鼓励用CAPI编写新代码(我没有书面证据,而不是我刚写的东西;主要是因为与他们会面)。 CNG拥有更加开发人员友好的API,功能更强大。 CNG在Windows Vista中重新发布,因此可以在每个受支持的Windows版本中使用。 CAPI不再服务于“好,它有更多的覆盖”,它只是“旧的,狡猾的,遗留的API”(除非你为不支持的操作系统编写代码,比如XP)。

如果您使用的是CAPI,我不知道您为什么要使用SChannel提供程序。通过MS_ENH_RSA_AES_PROV的PROV_RSA_AES是CAPI具有的功能最强的RSA(基于SHA-2的PKCS签名)。但它与CNG中的软件提供商(PSS签名,带有SHA-2的OAEP,并且支持大于2 ^ 32的公共指数值相比已经过时了(好吧,这不是常见的需求,但它是CNG固定的东西)。 / p>