无法在 C# 中验证 OpenSSL C++ 签名

Unable to verify OpenSSL C++ Signature in C#

我有一个在 C++ 中使用 openSSL 生成的密钥对,我用它来签署消息以通过严格使用 RSACryptoServiceProvider(无 BouncyCastle 等)的 C# 服务器进行身份验证。我使用 PKCS#1 SHA256 生成 signature.The 签名,然后以十六进制形式与 public 密钥一起传输。问题是签名无法在服务器上验证。 我试过删除 header 上面写着“-----BEGIN RSA PUBLIC KEY-----”等等。但是没有结果 yet.The 用于生成密钥对和签名的 c++ 代码是:

RSA             *keypair = NULL;
bne = BN_new();
int  ret = 0;
ret = BN_set_word(bne, ea);
keypair = RSA_new();    
RSA_generate_key_ex(keypair , 2048, bne, NULL);
SHA256((unsigned char*)msg, strlen(msg) + 1, hash);
RSA_sign(NID_sha256, hash, SHA256_DIGEST_LENGTH, sign,&signLen, keypair);

我已经使用 BIO 在字符缓冲区中收集了 public 密钥,并将签名数据转换为十六进制字符串以传输到 c#。然而,我试图通过编写一个示例表单应用程序以及在 c++ 上验证的签名和 public 密钥来复制服务器,我已经将它们硬编码为输入传递给 c# sample.But 它们也失败了。 谁能帮我看看可能的原因或谬误的地方是什么?

 RSACryptoServiceProvider RSA = new RSACryptoServiceProvider();
 RSA.ImportParameters(rsParam);
 UTF8Encoding encoding = new UTF8Encoding();
 byte[] datax = encoding.GetBytes(data);
 byte[] sigx = encoding.GetBytes(sig);
 SHA256Managed sha256 = new SHA256Managed();
 byte[] hash = sha256.ComputeHash(datax);
 iRes= RSA.VerifyHash(hash, CryptoConfig.MapNameToOID("SHA256"), sigx);

'data' 被传递,'sig' 也是一个 hard-coded 值,'rsParam 是使用 hard-coded public 键创建的,用于生成 'sig'。 public key 到 rsParam 的转换代码为:

pubkey = Convert.FromBase64String(pemString);
RSAParameters rsParam = RSA.ExportParameters(false);
rsParam .Modulus = pubkey;
RSA.ImportParameters(rsParam );

我写这段代码只是为了了解基本的C#密码系统是如何工作的,以便对实际问题的研究有所帮助。

我找到了答案,而不是用 RSA_Sign 签名,我使用 RSA_private_encrypt 和 RSA_PKCS1_PADDING 作为参数来签署 SHA256 哈希,并且签名在服务器端得到验证,我之前提到的服务器代码对我来说不是透明的,所以这只是一种蛮力方法并且有效。我写的示例 C# 代码仍然没有验证它,但现在我不关心它。