【发布时间】:2015-03-15 18:57:09
【问题描述】:
我正在尝试使用 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 提供程序不是 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 令牌上的证书对 RSA-Sha256 进行签名吗?我认为 CryptoAPI 没有必要依赖 CSP 的散列函数。散列是一种标准函数,CryptoAPI 确实实现了 SHA-2。
【问题讨论】:
标签: c++ c windows cryptography cryptoapi