gpt4 book ai didi

cryptography - Windows CryptoAPI : CryptSignHash with CALG_SHA_256 and private key from MY keystore

转载 作者:行者123 更新时间:2023-12-01 07:16:17 24 4
gpt4 key购买 nike

我正在尝试使用与以下 openssl 命令兼容的 CryptoAPI 在 Windows 上生成数字签名(来自 XP SP3,但目前正在使用 Windows 7 进行测试):

openssl dgst -sha256 -sign <parameters> (for signing)
openssl dgst -sha256 -verify <parameters> (for validation)

我想使用 Windows“MY” keystore 中的私钥进行签名。

我设法通过使用以下 CryptoAPI 函数(为简洁起见省略参数)使用 SHA1 摘要算法对文件进行签名:
CertOpenStore
CertFindCertificateInStore
CryptAcquireCertificatePrivateKey
CryptCreateHash (with CALG_SHA1)
CryptHashData
CryptSignHash

生成的签名与“openssl dgst -sha1 -verify”兼容(一旦字节顺序颠倒)。

我的问题是:当我尝试将 CALG_SHA_256 与 CryptCreateHash 一起使用时,它失败并显示错误 80090008 (NTE_BAD_ALGID)。通过谷歌搜索 around ,我发现我需要使用特定的提供程序 (PROV_RSA_AES) 而不是默认的提供程序。由于我有一个提供程序句柄,我还需要用 CryptGetUserKey 替换 CryptAcquireCertificatePrivateKey。所以我修改了我的程序,看起来像:
CryptAcquireContext (with PROV_RSA_AES)
CertOpenStore
CertFindCertificateInStore
CryptGetUserKey
CryptCreateHash (with CALG_SHA256)
CryptHashData
CryptSignHash

不幸的是,这没有按预期工作:CryptGetUserKey 失败,错误为 8009000D (NTE_NO_KEY)。如果我删除 CryptGetUserKey 调用,程序将运行直到 CryptSignHash,它失败并显示错误 80090016 (NTE_BAD_KEYSET)。我知道 key 集确实存在并且工作正常,因为我能够使用它来签署 SHA1 摘要。

我尝试使用从 CertFindCertificateInStore 获得的证书上下文中的信息再次获取上下文:我能做的最好的事情是成功调用 CryptGetUserKey,但 CryptSignHash 总是会因相同的错误而失败。

我尝试使用的私钥有 2048 位长,但我认为它不会成为问题,因为它适用于 SHA1 摘要。我不知所措,所以非常欢迎任何建议!

最佳答案

80090008是因为 Base provider 不支持 SHA256、SHA384 和 SHA512,你必须使用 CryptAcquireContext(hProv, NULL, MS_ENH_RSA_AES_PROV, PROV_RSA_AES, 0);

关于cryptography - Windows CryptoAPI : CryptSignHash with CALG_SHA_256 and private key from MY keystore,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4191312/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com