Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/129.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 无法使用RSA-Sha256进行签名。WatchData CSP不是CNG(加密API:下一代)提供商吗?_C++_C_Windows_Cryptography_Cryptoapi - Fatal编程技术网

C++ 无法使用RSA-Sha256进行签名。WatchData CSP不是CNG(加密API:下一代)提供商吗?

C++ 无法使用RSA-Sha256进行签名。WatchData CSP不是CNG(加密API:下一代)提供商吗?,c++,c,windows,cryptography,cryptoapi,C++,C,Windows,Cryptography,Cryptoapi,我正在尝试使用WatchData USB令牌中的证书进行签名。我使用Microsoft CryptoAPI函数。如果我指定sha1作为签名的哈希算法,那么它会成功。但是,如果我尝试使用sha256,就会出现“内部错误” 驱动程序从下载。 其中包含PKCS#11提供程序 这是因为WatchData提供程序不是CNG提供程序-(加密API:下一代) 调用以下程序失败-这似乎表明它不是CNG提供商 #include <windows.h> #include <stdio.h>

我正在尝试使用WatchData USB令牌中的证书进行签名。我使用Microsoft CryptoAPI函数。如果我指定sha1作为签名的哈希算法,那么它会成功。但是,如果我尝试使用sha256,就会出现“内部错误”

驱动程序从下载。 其中包含PKCS#11提供程序

这是因为WatchData提供程序不是CNG提供程序-(加密API:下一代)

调用以下程序失败-这似乎表明它不是CNG提供商

#include <windows.h>
#include <stdio.h>
#include <ncrypt.h>

int main()
{
    NCRYPT_PROV_HANDLE hProv;
    SECURITY_STATUS ret = NCryptOpenStorageProvider(&hProv, 
        L"Watchdata Brazil CSP v1.0", 0);
    if( ret != ERROR_SUCCESS)
        printf("Failed\n");
    else
        printf("worked\n");
}   
#包括
#包括
#包括
int main()
{
NCRYPT_PROV_HANDLE hProv;
安全状态ret=NCryptOpenStorageProvider(&hProv,
L“Watchdata巴西CSP v1.0”,0);
if(ret!=错误\u成功)
printf(“失败的\n”);
其他的
printf(“已工作”\n);
}   
我通过调用API找到了提供程序的名称


是否有其他方法可以使用WatchData令牌上的证书对RSA-Sha256进行签名?我认为CryptoAPI不需要依赖CSP来实现哈希函数。哈希是一个标准函数&CryptoAPI确实有SHA-2的实现

在这种情况下,您可以使用OpenSSL对数据进行签名。看

因为您使用的是USB令牌,所以可以创建一个新的RSA_方法结构,该结构将具有从USB令牌签名的方法

您可以尝试以下操作:

  • 使用OpenSSL计算SHA256
  • 通过使用新方法重载RSA结构来计算签名,以使用您的令牌

  • 不幸的是,在CryptoAPI中,即使您单独进行散列和签名,也必须从同一CSP提供散列对象,而不仅仅是缓冲区中的散列数据。这在CNG中发生了变化,在CNG中,散列不是由密钥存储提供程序完成的,签名发生在散列缓冲区上,而散列是在其他地方完成的,例如在CNG原语提供程序中。如果CNG密钥存储提供程序获得了长度意外的哈希缓冲区,则它仍可能失败,因此它不能使您免于提供程序不知道给定哈希类型的问题

    您确定制造商没有生产可用于您的设备的CNG密钥存储提供商吗?我注意到在上的“WatchKey\u USB\u Token\u Admin\u Tool”下载中有一个CNG密钥存储提供商

    更新:此驱动程序与OP的设备不兼容

    我认为有四种选择:

  • 联系制造商的支持部门,看看他们是否能为您提供此设备的CNG版本(并检查所需的签名机制是否得到实际支持)
  • 使用替代设备
  • 使用设备软件包支持的替代API(如PKCS#11)进行签名
  • (只有当你真的需要的时候),在你自己的CNG供应商中使用软件包支持的API包装你需要的功能

  • 我想使用CryptoAPI而不是任何其他库。你在哪里找到CNG提供商的?哪一个链接?这是我链接的页面上的第一个链接(我不想直接链接到二进制文件),但这里有一个直接链接:-我知道这包含一个CNG密钥存储提供商,通过提取内容和查看DLL和EXE。程序
    WDKSPconfig.exe
    是CNG密钥存储提供程序注册工具,
    SYSDIR\WDKSP.dll
    是CNG密钥存储提供程序。谢谢。它似乎有一个压缩天然气-但有几个问题1。它不像另一款那样具有PKCS#11功能。此外,默认情况下WatchData微型驱动程序不安装此项,因此我不能期望我的用户安装此项:-(是否需要CAPI或CNG,以便您可以与使用这些API的应用程序(如AD证书服务或IIS)进行互操作),或者这只是一种偏好?如果您有PKCS#11,是否可以改用该API?是否可以仅使用PKCS#11 API创建RSA-SHA2 CMS/PKCS#7格式签名?