使用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);
现在,显然Decrypt会失败,因为我正在尝试解密已签名(不是“加密”)的东西,并且肯定不会通过相同的“密钥”解密。我很困惑,因为我认为我应该使用类似VerifyData()的方法,但这会返回一个bool并接受我不确定的参数。
我希望实现的是openssl rsautl -verify -inkey public.pem -pubin
的C#等价物。也就是说,用pubkey“解密”来验证所述消息的内容。
我在这里走在正确的轨道上吗?
答案 0 :(得分:0)
实际上,除非您指定了错误的编码参数,否则签名的解密永远不会失败 - 签名只是数据的私钥加密哈希(通常是SHA1);使用验证例程的唯一好处是它解密块并为你做哈希比较,如果你想要血腥,你可以用你的公钥做一个解密操作并自己比较哈希字节。
我真的不确定response
在你的程序中是什么;你应该只 将RSA数据传递给它,如果你还要提供首先签署的数据做错了 - 同样,做检查该函数是否实际接受字符串,根据我的经验,BouncyCastle通常需要byte[]
我建议使用SignerUtilities.GetSigner()
- 它需要一个字符串arg来告诉它你正在使用什么类型的签名,我认为"SHA1WithRSA"
适合你。