gpt4 book ai didi

c# - 在 C# 中创建的数字签名在 C++ 中不验证

转载 作者:太空狗 更新时间:2023-10-29 21:24:29 24 4
gpt4 key购买 nike

我有一个 C# 应用程序,它使用 RSA 对数据进行数字签名。代码如下:

RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
rsa.ImportCspBlob(privateKeyBlob);

SHA1 sha1 = new SHA1CryptoServiceProvider();
sha1.ComputeHash(myData);

byte[] signature = rsa.SignHash(sha1.Hash, CryptoConfig.MapNameToOID("SHA1"));

我无法验证 C++ 中的签名。代码如下:

HCRYPTPROV cryptProvider;
CryptAcquireContext(&cryptProvider, 0, 0, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT);
// PROV_RSA_SIG does not work

HCRYPTKEY publicKey;
CryptImportKey(cryptProvider, publicKeyBlob, publicKeyBlobLength, 0, 0, &publicKey);

HCRYPTHASH hash;
CryptCreateHash(cryptProvider, CALG_SHA1, 0, 0, &hash);
CryptHashData(hash, myData, myDataLength, 0);

BOOL isSigOk = CryptVerifySignature(hash, signature, signatureLength, publicKey, NULL, CRYPT_NOHASHOID);

验证返回0,GetLastError()返回2148073478“Invalid signature”。哈希是相同的。我在使用和不使用 CRYPT_NOHASHOID 标志的情况下进行了尝试。

我尝试用 C++ 对数据进行签名(只是为了比较结果)。我删除了 CRYPT_VERIFYCONTEXT 标志。但是导入私钥 BLOB 失败并显示 1008“试图引用不存在的 token ”。生成新 key 失败并出现相同的错误。

最佳答案

在一个字节一个字节地检查之后,我让它工作了。 C# 应用程序中存在两个问题。

1) 我使用 new RSACryptoServiceProvider(RsaKeySize) 生成 key 对。问题是这会生成一个 key 对用于 key 交换,而不是用于签名。 C#不介意,但在C++程序中却惹来了麻烦。生成 key 对的正确方法是:

CspParameters parameters = new CspParameters();
parameters.KeyNumber = (int)KeyNumber.Signature;

RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(RsaKeySize, parameters);

2) RSACryptoServiceProvider 反转其输出(签名、加密数据)。在 documentation 中提到.因此,您需要在保存之前 Array.Reverse() 计算出的签名。

关于c# - 在 C# 中创建的数字签名在 C++ 中不验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16015408/

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