我正在尝试使用WatchData USB token 中的证书进行签名。我使用Microsoft CryptoAPI函数CryptSignMessage。如果我将sha1指定为用于签名的哈希算法,则它将成功。但是,如果我尝试使用sha256,将失败并显示“发生内部错误”。
该驱动程序是从http://www.watchdata.com/service/usbtoken.jsp下载的。
这包含PKCS#11提供程序。
按照http://blogs.msdn.com/b/alejacma/archive/2010/06/02/quot-an-internal-error-ocurred-quot-when-using-sha-2-algorithms-with-signedcms.aspx,这是因为WatchData提供程序不是CNG提供程序-(加密API:下一代)。
使用以下程序对NCryptOpenStorageProvider的调用失败-似乎表明它不是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");
}
我通过调用CryptEnumProviders API找到了提供程序的名称。
还有其他方法可以使用WatchData token 上的证书对RSA-Sha256进行签名吗?我认为CryptoAPI不需要依赖CSP的哈希功能。哈希是一种标准功能,CryptoAPI确实具有SHA-2的实现。
最佳答案
不幸的是,在CryptoAPI中,即使您将哈希与签名分开进行,也必须提供来自同一CSP的哈希对象,而不仅仅是缓冲区中的哈希数据。在CNG中,情况发生了变化,在这种情况下, key 存储提供程序不进行哈希处理,并且签名发生在哈希缓冲区中,而哈希处理则在其他地方进行,例如在CNG基本提供者中。如果CNG key 存储提供程序获得了意外长度的哈希缓冲区,则它可能仍然会失败,因此,它不能使您免受提供程序不知道给定哈希类型的问题的困扰。
您确定制造商尚未生产可用于设备的CNG key 存储提供程序吗?我注意到在this page上的“WatchKey_USB_Token_Admin_Tool”下载中有一个CNG key 存储提供程序。
更新:该驱动程序不适用于OP的设备。
我看到四个选项:
关于c++ - 无法使用RSA-Sha256签名。 WatchData CSP不是CNG(密码API : Next Generation) Provider?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27996357/