当前位置: 首页 > 知识库问答 >
问题:

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

容柏
2023-03-14

我有一个使用C++中的openSSL生成的keypair,我正在使用它在一个严格使用RSACryptoServiceProvider(没有BouncyCastle等)的C#服务器上对验证消息进行签名。我使用PKCS#1 SHA256生成签名,然后以十六进制的形式与公钥一起传输签名。问题是无法在服务器上验证签名。我已经尝试删除了头,上面写着“----开始RSA公钥-----”等等。但是还没有结果。生成keypair和签名的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在字符缓冲区中收集了公钥,并将签名数据转换为十六进制字符串,以便传输到C#。然而,我试图通过编写一个示例表单应用程序和在C++上验证的签名和公钥来复制服务器,我将它们作为输入硬编码传递给了C#示例,但它们也失败了。有没有人能帮我找出谬误的可能原因或范围?

 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”是一个硬编码值,“s”的参数已经使用用于生成“sig”的硬编码公钥创建。将公钥转换为rsParam的代码为:

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

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

共有1个答案

乐正德华
2023-03-14

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

 类似资料:
  • 我传入以下内容(摘要/哈希是SHA1): 到此功能: 但我无法在OpenSSL中验证签名(verify_success为0),即使完全相同的数据在C#中验证成功。 关于我为什么或做错了什么的任何想法? C#中的公钥是: 我假设4543533120000000是。NET特定的东西,所以我只是把04前置到它的其余部分。 这是用于验证签名的C#代码,它成功地做到了(dataBytes的SHA1在两个程序

  • 我们的旧系统使用.NET 3.5(运行在Windows Server 2003 32bits上)来验证来自我们客户的电子收据(都使用SHA1RSA算法作为协议)。我们将他们的证书以Base64字符串存储在数据库中。旧代码如下所示: 除了性能不好外,没有其他问题。这就是为什么我们想要转移到使用Java1.7的新系统(运行在Windows Server 2012 64位上)。我们的新代码如下所示: 我

  • 问题内容: 我正在使用node.js request.js到达api。我收到这个错误 [错误:UNABLE_TO_VERIFY_LEAF_SIGNATURE] 我所有的凭据都是准确有效的,并且服务器还不错。我对邮递员提出了同样的要求。 此代码仅在可执行脚本ex中运行。,那是为什么?是否需要在服务器上运行? 问题答案: 注意 :以下情况很危险,并且将允许在客户端和服务器之间截取和修改API内容。 这

  • 我正在尝试在python中使用ECDSA验证比特币签名,但发现它非常困难,许多尝试已经失败了。 参数: 注意:我已经根据ECDSA的要求将签名从base64转换为hexstring。每当我试图验证它时,它会说: 预期64字节签名(128十六进制字符串),提供了65字节签名(130十六进制字符串) 我查看了许多关于ECDSA的stackoverflow问题,但没有一个答案与我的qs 100%相关。感

  • 我是从IDP接收SAML断言签名的服务提供商。我在Tomcat上使用JOSSO来使用断言。这里的问题是我无法验证断言签名。 IDP证书使用别名“IDP”上传到我的密钥库。 在验证sig时,我得到以下错误: 为什么JOSSO无法检测密钥库中的证书并验证签名?我需要以不同的方式定义别名吗?

  • 我试图使用javascript创建ECDSA算法的密钥对,签名消息,然后在服务器端验证它(使用Java)。 示例javascript代码: 例如: 我做错了什么?