2017-08-21 21 views
0

秘密鍵でメッセージに署名し、公開鍵で検証したいが、それを動作させることができない。rsaでデータを正しく検証する方法は?

ここに私がデータに署名する方法(編集済みだが動作しない) :ここでは

public static string SignData(string message, string privateKey) { 

     byte[] plainText = ASCIIEncoding.Unicode.GetBytes(message); 

     var rsaWrite = new RSACryptoServiceProvider(); 
     rsaWrite.FromXmlString(privateKey); 

     byte[] signature = rsaWrite.SignData(plainText, new SHA1CryptoServiceProvider()); 

     return Convert.ToBase64String(signature); 
    } 

は、私は(まだ動作していない、編集された)データをテストする方法です:

public static bool VerifyData(string sign, string publicKey, string orig) { 

     byte[] signature = Convert.FromBase64String(sign); 
     byte[] original = ASCIIEncoding.Unicode.GetBytes(orig); 

     var rsaRead = new RSACryptoServiceProvider(); 
     rsaRead.FromXmlString(publicKey); 

     if (rsaRead.VerifyData(original, new SHA1CryptoServiceProvider(), signature)) { 
      return true; 
     } else { 
      return false; 
     } 
    } 

私は自分のアカウントクラス内のXML文字列として鍵ペアを格納します。この機能は、account.csのコンストラクタで実行されます。

​​

私はこれで全体の事をテスト:

string signedHash = Utility.SignData("test" ,account.privateKey); 

if (Utility.VerifyData(signedHash, account.publicKey, "test")) {   
    Console.WriteLine("WORKING!"); 
} else { 
    Console.WriteLine("SIGNING NOT WORKING"); 
} 

はなぜ全体的なことが認識されないのは?私の推測では、いくつかのエンコーディングのために動作しないということです。

+0

'return ASCIIEncoding.Unicode.GetString(signature);'は間違っていて、理解できません。バイト配列 'signature'を返すだけで、文字列にしようとしないでください。 –

答えて

2
return ASCIIEncoding.Unicode.GetString(signature); 

署名は任意のバイナリデータであり、必ずしも正当なUnicode/UCS-2である必要はありません。任意のデータをすべてエンコードするには、任意のエンコーディング(https://en.wikipedia.org/wiki/Binary-to-text_encoding#Encoding_standards)を使用する必要があります。あなたは

return Convert.ToBase64String(signature); 

をしたいそして、当然のことながら、検証方法でConvert.FromBase64Stringを使用すると思いますので、署名のための最も人気の輸送は、Base64です。


あなたは.NET 4.6以上のターゲットでコンパイルしている場合は、また新しい看板/検証APIを利用することができます:

rsaRead.VerifyData(original, new SHA1CryptoServiceProvider(), signature) 

rsaRead.VerifyData(original, signature, HashAlgorithmName.SHA1, RSASignaturePadding.Pkcs1) 

だろうそれはよりシンプルに見えないかもしれませんが、他のメソッドが行ったSHA1CryptoServiceProviderの割り当てとファイナライズを防ぎ、Pkcs1シグネチャのパディングからPSSシグネチャへの切り替えが必要な場合は、The Futureを設定します再パディング。 (ただし、実際のメリットはRSACryptoServiceProviderの代わりにRSAベースクラスにあるということです)。

+0

あなたの答えをありがとう。私はあなたが言ったようにコードを変更しました:return tobase64string、verifydata()はハッシュされた文字列をfrombase64stringでbyte []に​​変換します。問題は、コードがまだ正しい結果を表示していないことです(私は最初の投稿のコードを編集しました)。 – Loading

+0

Sign/Verifyコードをそのまま(Base64で)コピー&ペーストしたところ、私のテストでは今動作するようになっています。だからあなたは別の鍵で終わるか、データや署名を壊さなければなりません。ユーティリティー機能は機能的には現在正しく機能しています。 – bartonjs

+0

はい、現在動作しています。私は誤って元のメッセージとハッシュされたメッセージをベリファイ機能に入れ替えました。ご協力ありがとうございました – Loading