c#中生成的数字签名在c++中无法验证
Digital signature made in C# does not verify in C++
我有一个使用RSA对数据进行数字签名的c#应用程序。代码如下:
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"尝试引用不存在的令牌"。生成新密钥失败,并出现相同的错误。
经过一个字节一个字节的检查,我使它工作。c#应用程序中有两个问题:
1)我使用new RSACryptoServiceProvider(RsaKeySize)
生成一个密钥对。问题是,这样生成的密钥对用于密钥交换,而不是用于签名。c#并不介意,但它会给c++程序带来麻烦。生成密钥对的正确方法是:
CspParameters parameters = new CspParameters();
parameters.KeyNumber = (int)KeyNumber.Signature;
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(RsaKeySize, parameters);
2) RSACryptoServiceProvider
反转其输出(签名,加密数据)。文档中有提到。因此,您需要在保存计算签名之前将其Array.Reverse()
。
相关文章:
- 正在尝试了解输入验证循环
- 如何在C++中检查2D数组中负值的输入验证
- LibGit2 SSH身份验证失败
- Vulkan验证层不断在VkQueuePresentKHR()上抛出图像布局错误
- constexpr上下文中std::initializer_list的验证
- 正在验证c++中用户的整数输入
- 加密++验证大文件签名
- C++卡验证问题
- 验证指针链
- 此代码验证公式是什么意思?
- cin 的十进制输入验证?
- 简单的 HTML 验证器
- 密码长度验证 (c++)
- 输入验证以筛选出字符、字符串和一系列整数
- 如何使用 CredUIPromptForWindowsCredentials验证凭据
- 指针验证的最佳实践?
- RSA_PKCS1签名验证
- 验证openssl c++中的签名,这是由JAVA DSA签名的?
- 使用 C++ 验证 NMEA 句子
- 为什么 WinInet 在通过 FQDN 连接时无法通过协商自动进行身份验证,但如果通过 IP 连接则成功?