用公钥验证数据(用RSA私钥签名)
本文关键字:私钥 公钥 验证 数据 RSA | 更新日期: 2023-09-27 18:02:16
使用BouncyCastle,在stackoverflow问题的帮助下,我得到了这个:
using System.Net.Sockets;
using System.Security.Cryptography;
using Org.BouncyCastle.Crypto.Parameters;
using Org.BouncyCastle.OpenSsl;
…
TcpClient client = new TcpClient("127.0.0.1", 1337);
NetworkStream stream = client.GetStream();
StreamWriter writer= new StreamWriter(stream);
StreamReader reader = new StreamReader(stream);
writer.WriteLine("hello");
writer.AutoFlush = true;
string response = Convert.FromBase64String(reader.ReadToEnd()).ToString();
RSACryptoServiceProvider RCP;
var x = new PemReader(File.OpenText(pubkey));
var y = (RsaKeyParameters)x.ReadObject();
RCP = (RSACryptoServiceProvider)RSACryptoServiceProvider.Create();
var pa = new RSAParameters();
pa.Modulus = y.Modulus.ToByteArray();
pa.Exponent = y.Exponent.ToByteArray();
RCP.ImportParameters(pa);
byte[] test = RCP.Decrypt(response, true);
现在,显然解密将失败,因为我试图解密一些已签名(不是"加密")的东西,并且绝对不是由相同的"密钥"。我很困惑,因为我认为我应该使用像VerifyData()这样的方法,但这返回一个bool并接受参数,我不确定我有。
我想要完成的是相当于openssl rsautl -verify -inkey public.pem -pubin
的c#。也就是说,用公开密钥"解密"以验证所述消息的内容。
我讲对了吗?
- 麦克指标
实际上,除非指定了错误的编码参数,否则签名的解密永远不会失败——签名只是数据的私钥加密散列(通常是SHA1);使用验证例程的唯一好处是它可以解密块并为您进行哈希比较,如果您想要更加小心,您可以使用您的公钥进行解密操作并自己比较哈希字节。
我实际上不确定response
在你的程序上下文中是什么;你应该只有传递RSA数据给它,如果你也给它的数据是在第一个地方你是做错了 -类似地,做检查如果该函数实际上接受字符串,在我的经验BouncyCastle通常期望一个byte[]
我建议使用SignerUtilities.GetSigner()
-它需要一个字符串参数来告诉它你使用的是哪种签名,我认为"SHA1WithRSA"
适合你。