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

时间:2015-01-17 05:07:27

标签: c++ c windows cryptography cryptoapi

我正在尝试使用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。

2 个答案:

答案 0 :(得分:1)

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

您确定制造商还没有生产出可以与您的设备一起使用的CNG密钥存储提供商吗?我注意到&#34; WatchKey_USB_Token_Admin_Tool&#34;中有一个CNG密钥存储提供商。下载this page

更新:此驱动程序无法使用OP的设备。

我看到四个选项:

  1. 联系制造商的支持,看看他们是否可以为您提供此设备的CNG版本(并检查是否实际支持所需的签名机制)
  2. 使用替代设备
  3. 使用设备软件包支持的替代API(例如PKCS#11)进行签名
  4. (只有当你真的需要它时),使用引擎盖下的软件包支持的API,在你自己的CNG提供商中包含你需要的功能

答案 1 :(得分:-1)

在这种情况下,您可以使用OpenSSL对数据进行签名。见https://www.openssl.org/docs/crypto/RSA_sign.html

由于您正在使用USB令牌,因此您可以创建一个新的RSA_METHOD结构,该结构将具有从USB令牌进行签名的方法。

您可以尝试以下操作:

  1. 使用OpenSSL计算SHA256。
  2. 通过使用新方法重载RSA结构来计算签名。