使用BouncyCastle的,並幫助從計算器問題,我得到這個(簽署了RSA私鑰):C#驗證數據與公開密鑰
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()這樣的方法,但是這會返回一個布爾值,並且我不確定我有沒有參數。
我希望完成的是C#相當於openssl rsautl -verify -inkey public.pem -pubin
。也就是說,用pubkey「解密」來驗證所述消息的內容。
我在正確的軌道上嗎?
- Mik的
儘管爲了我的目的,我可能已經進行了驗證,並且不需要解密,但我確實將其用於其他目的。比起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](http://openssl-net.sourceforge.net/)包裝器。 – Mik