【发布时间】:2011-07-17 20:51:54
【问题描述】:
使用 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() 这样的方法,但这会返回一个布尔值并接受我不确定的参数。
我希望实现的是openssl rsautl -verify -inkey public.pem -pubin 的 C# 等价物。即用公钥“解密”以验证所述消息的内容。
我在正确的轨道上吗?
- 米克
【问题讨论】:
-
虽然出于我的目的,我可以进行验证,而不需要解密,但我确实将它用于其他目的。比 Bouncycastle 更简单的解决方案是(至少对我而言):
OpenSSL.Core.BIO bin = new OpenSSL.Core.BIO(public_key_as_string); OpenSSL.Crypto.RSA rsa = OpenSSL.Crypto.RSA.FromPublicKey(bin, null, null); byte[] message = new byte[1024]; message = rsa.PublicDecrypt(base64string, OpenSSL.Crypto.RSA.Padding.PKCS1);使用托管的 OpenSSL.NET 包装器。
标签: c# rsa signature public-key