我正在尝试使用WatchData USB令牌中的证书进行签名。我使用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 Provider不是CNG提供商 - (Cryptography API:Next Generation)。
对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令牌上的证书对RSA-Sha256进行签名?我认为CryptoAPI不需要依赖CSP来实现散列函数。哈希是一个标准功能&amp; CryptoAPI确实实现了SHA-2。
答案 0 :(得分:1)
不幸的是,在CryptoAPI中,即使您单独执行与签名的哈希,也必须从同一个CSP提供哈希对象,而不仅仅是缓冲区中的哈希数据。这已经在CNG中发生了变化,其中散列不是由密钥存储提供商完成的,并且签名发生在散列缓冲区上,并且在其他地方进行散列,例如,在CNG原始提供者中。如果CNG密钥存储提供程序获得了意外长度的哈希缓冲区,它仍然可能会失败,因此它不会让您免受提供程序不知道给定哈希类型的问题。
您确定制造商还没有生产出可以与您的设备一起使用的CNG密钥存储提供商吗?我注意到&#34; WatchKey_USB_Token_Admin_Tool&#34;中有一个CNG密钥存储提供商。下载this page。
更新:此驱动程序无法使用OP的设备。
我看到四个选项:
答案 1 :(得分:-1)
在这种情况下,您可以使用OpenSSL对数据进行签名。见https://www.openssl.org/docs/crypto/RSA_sign.html
由于您正在使用USB令牌,因此您可以创建一个新的RSA_METHOD结构,该结构将具有从USB令牌进行签名的方法。
您可以尝试以下操作: