2011-07-17 20 views
1

と、私はこれを得たstackoverflowの質問から助けを借りて(RSA秘密鍵で署名)C#の確認データ:はBouncyCastleを使用して、公開鍵

 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です。すなわち、前記メッセージの内容を検証するために前記パブキーを「解読」する。

私はここで正しい軌道に乗っていますか?

  • あるMik
+0

私の目的のために、私は検証を行い、解読する必要はありませんでしたが、私は他の目的のために使っていました。 Bouncycastleよりも簡単な解決策は、少なくとも私にとってはこれでした: 'OpenSSL.Core.BIO bin = new OpenSSL.Core.BIO(public_key_as_string); OpenSSL.Crypto.RSA rsa = OpenSSL.Crypto.RSA.FromPublicKey(bin、null、null); バイト[]メッセージ=新しいバイト[1024]; (OpenSSL.NET)(http://openssl-net.sourceforge.net/)ラッパーを使用して、メッセージを送信します。 – Mik

答えて

0

間違った符号化パラメータを指定しない限り、実際の署名の復号化が失敗することはありません - 署名は、単にデータ(通常はSHA1)の秘密鍵暗号化されたハッシュです。検証ルーチンを使用する唯一の利点は、ブロックを復号化してハッシュ比較が機能することです。もしあなたが血まみれになったければ、公開鍵で復号化操作を行い、ハッシュバイトを自分で比較することができます。

responseはあなたのプログラムのコンテキスト内に実際にはわかりません。 のみにRSAデータを渡してください。最初に署名されたデータがである場合は、 - 同様に、その関数が実際に文字列を受け入れるかどうかをチェックしてください私の経験はBouncyCastleは、一般的にbyte[]

を期待し、私はSignerUtilities.GetSigner()を使用してお勧めします - それはあなたが使用している署名のどのようにそれを伝えるために、文字列の引数を取り、私は"SHA1WithRSA"があなたのために右であることを想像。

関連する問題