首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CryptoAPI RSA频道提供程序错误

CryptoAPI RSA频道提供程序错误
EN

Stack Overflow用户
提问于 2017-07-20 18:12:31
回答 1查看 216关注 0票数 0

我正在尝试使用"Microsoft RSA SChannel Cryptographic Provider“生成数字签名。获取容器的句柄后,我将使用CryptGenKey()生成签名。但是这个函数返回FALSE。

CryptGenKey()的dwError返回80090008。

这同样适用于任何其他提供程序类型。此外,当我尝试为同一提供者创建密钥交换对时,它工作得很好。我做错了什么?

代码语言:javascript
复制
#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;
}

谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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修复的))。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45211765

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档