Cryptoapi签名/验证在Windows 8.1上不起作用

Cryptoapi签名/验证在Windows 8.1上不起作用,windows,windows-8.1,cryptoapi,mscapi,Windows,Windows 8.1,Cryptoapi,Mscapi,我们有一个应用程序,它使用CryptoApi使用SHA1哈希对消息进行签名和验证。多年来,它一直在WindowsXP和Windows8之间完美运行。它不再适用于Windows 8.1。CryptSignHash失败,错误代码87(无效参数)。CryptVerifySignature不会失败,但返回NTE_BAD_签名(对于在Windows 8上创建的有效签名)。我们已经尽了最大的努力。。它在Windows 8及以下版本上工作,在Windows 8.1上失败 你对如何进一步调试这个有什么想法吗?

我们有一个应用程序,它使用CryptoApi使用SHA1哈希对消息进行签名和验证。多年来,它一直在WindowsXP和Windows8之间完美运行。它不再适用于Windows 8.1。CryptSignHash失败,错误代码87(无效参数)。CryptVerifySignature不会失败,但返回NTE_BAD_签名(对于在Windows 8上创建的有效签名)。我们已经尽了最大的努力。。它在Windows 8及以下版本上工作,在Windows 8.1上失败

你对如何进一步调试这个有什么想法吗? 我们再次导出导入的公钥和私钥,并验证它们是否正确。 我们跳过了使用“我们的”密钥并生成了新密钥->签名也失败,出现错误87 我们使用RSA_FULL和DES生成了新密钥,并用它们加密/解密了一条消息->没问题,工作正常。 我们检查了RSA_完整提供程序的版本。它在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_格式标志时,CryptSignHash在Windows 8.1上失败。这看起来像Windows8.1。臭虫

通过从下面的url运行MSDN示例代码,使用CALG_SHA1而不是CALG_MD5进行散列,并将CryptSignHash中的标志设置为CRYPT_NOHASHOID | CRYPT_X931_格式,可以复制此错误;将标志保留为0或仅保留在CRYPT_nohashioid可以在我测试的系统上工作

在WindowsXP到Windows8.0系统上,我从来没有遇到过这些标志的问题

MSDN示例代码URL: