gpt4 book ai didi

windows - Cryptoapi 签名/验证不适用于 Windows 8.1

转载 作者:可可西里 更新时间:2023-11-01 14:24:43 42 4
gpt4 key购买 nike

我们有一个应用程序可以使用 CryptoApi 使用 SHA1 哈希对消息进行签名和验证。它在 WindowsXP 到 Windows 8 下已经完美运行了很多年。它不再适用于 Windows 8.1。 CryptSignHash 失败,错误代码为 87(无效参数)。 CryptVerifySignature 不会失败但会返回 NTE_BAD_SIGNATURE(对于在 Windows 8 上创建的有效签名)。我们已经测试了我们所能做的一切......它适用于 Windows 8 及更低版本,但在 Windows 8.1 上失败。

您对如何进一步调试有任何想法吗?我们再次导出导入的公私钥,验证无误。我们跳过了使用“我们的” key 并生成了新 key -> 签名也失败并出现错误 87我们生成了新 key 并使用 RSA_FULL 和 DES 使用它们加密/解密了一条消息 -> 没问题,按预期工作。我们检查了 RSA_FULL 提供程序的版本。它在 Windows 8 和 Windows 8.1 上都是 2.0。我们尝试明确指定提供程序名称:Microsoft Base Cryptographic Provider v1.0

在 Windows 8.1 上签名对你们中的任何一个都有效吗?

Windows 8.1 是否还有其他新功能。这可能会阻止签名工作?我们应该知道的提供商或算法是否发生了变化?

该应用程序是用Delphi编写的,大致使用以下流程:

//Setup crypto provider 
CryptAcquireContext(@fhCryptProv, nil, nil, cptRSAFull, [ccVerify, ccMachineKeySet]);

//Create a hash structure
CryptCreateHash( fProvider.GetProviderHandle, chtSHA1, 0, 0, @fhHash);

//Import the private key for signing
CryptImportKey( fProvider.GetProviderHandle, @buff[0], len, 0, CRYPT_EXPORTABLE, @fKey);

//Hash the message
CryptHashData(fhHash, @aPlainText[1], length(aPlainText) * 2, 0);

//Sign the message
CryptSignHash(fhHash, AT_SIGNATURE, nil, CRYPT_NOHASHOID OR CRYPT_X931_FORMAT, @buff, @len);

最佳答案

当设置 CRYPT_X931_FORMAT 标志时,CryptSignHash 在 Windows 8.1 上失败。这看起来像 Windows 8.1。漏洞。

可以通过从下面的 url 运行 MSDN 示例代码来重现此错误,使用 CALG_SHA1 而不是 CALG_MD5 进行散列并将 CryptSignHash 中的标志设置为 CRYPT_NOHASHOID | CRYPT_X931_FORMAT;将标志保留为 0 或仅保留为 CRYPT_NOHASHOID 在我测试过的系统上有效。

我在 WindowsXP 到 Windows 8.0 系统上从未遇到过这些标志的任何问题。

MSDN 示例代码网址:http://msdn.microsoft.com/en-us/library/windows/desktop/aa382371%28v=vs.85%29.aspx

关于windows - Cryptoapi 签名/验证不适用于 Windows 8.1,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19861961/

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