2017-06-06 15 views
-3

私はプロジェクトで作業していました。暗号化は正常に機能していますが、復号化に際しては私のプログラムは "Bad data Exception"を投げています。この問題をどのように修正すればよいですか?RSA解読中に不正なデータ例外が発生しました

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Windows.Forms; 
using System.Text; 
using System.IO; 
using System.Security.Cryptography; 

namespace WindowsFormsApplication2 
{ 

    public partial class Form1 : Form 
    { 
     byte[] cipher; 
     byte[] plain; 

     public Form1() 
     { 
      InitializeComponent(); 
     } 

     private void Form1_Load(object sender, EventArgs e) 
     { 

     } 


     private static string Encrypt(byte[] plain) 
     { 
      byte[] encrypted; 
      RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(); 

       StreamReader StRe = new StreamReader("D:\\PjesaVetemPublike.xml"); 
       string VetemPublikeXML = StRe.ReadToEnd(); 
       rsa.FromXmlString(VetemPublikeXML); 
       StRe.Close(); 
       encrypted = rsa.Encrypt(plain, true); 

      return Encoding.UTF8.GetString(encrypted); 
     } 

     private static string Decrypt(byte[] encrypted) 
     { 
      byte[] decrypted; 
      RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(); 

       StreamReader StRe = new   
     StreamReader("D:\\PjesaPublikeDhePrivate.xml"); 
       string PublikeDhePrivate = StRe.ReadToEnd(); 
       rsa.FromXmlString(PublikeDhePrivate); 
       StRe.Close(); 

       decrypted = rsa.Decrypt(encrypted, false); //THE ERROR APPEARS RIGHT HERE 

      return Encoding.UTF8.GetString(decrypted); 
     } 

     private void button1_Click(object sender, EventArgs e) 
     { 
      plain = Encoding.UTF8.GetBytes(txtPlain.Text); 
      txtCipher.Text = Encrypt(plain); 

     } 

     private void button2_Click(object sender, EventArgs e) 
     { 

      txtDekriptuar.Text = Decrypt(cipher); 
     } 
    } 
} 
+0

これはおそらく悪いキーの指標です。キーを確認します – mjw

答えて

3

を使用する必要があります。

あなたがこのパターンに従う必要がテキストとして暗号化されたコンテンツを保存/テキストを暗号化して送信する場合:

暗号化(textIn => TEXTOUT):いくつかの経由bytesInへ

  • コンバートtextInエンコーディング。 UTF-8はかなり良いです。
  • bytesInをbytesOutに暗号化します。
  • 可逆エンコードをbytesOutに適用します。 Base64はほとんどの場合、これに最適な選択肢であり、.NETに組み込まれている最高のものです。 (textOut = Convert.ToBase64String(bytesOut))。
  • Return textOut。

復号化(textIn => TEXTOUT):

  • 逆bytesInにtextInを有効にする暗号化から変換を適用します。だからおそらくConvert.FromBase64String
  • bytesInをbytesOutに復号化します。
  • バイトエンコーディングトランスフォームを適用してbytesOutをtextOutにします。本当にこれがEncryptで使用されるものと同じである必要があると言うものは何もありませんが、おそらくそうするのが理にかなっています。

暗号化されたデータのテキスト表現のためにUTF-8(またはASCIIまたはUCS-2など)を使用に伴う問題は、暗号化されたデータが正当にその値0x00あるバイト(または制御コードを含むことができることです改行など)。 .NETはほとんどの場合、文字列に埋め込まれたヌル文字を楽しく転送しますが、間違いなく大きな混乱を招く可能性があります(すべての言語/関数で同じことが行われるわけではありません)。

その他の楽しいキャラクター:

  • あなたの言語/関数が埋め込ま0x7F(削除)のために何をしますか?
  • 文字列を1行のテキストフィールドに格納すると、CR文字またはLF文字はどうなりますか? LFなしのCR、またはCRなしのLFを取得した場合、あなたのプログラムはWindows上で何をしますか?
  • A 0x13(^ S)とUnixのコマンドラインがハングアップしたように見えるかもしれないが、それだけで0x11(^ Q)で待機しています。

暗号文を格納するためにどのようなエンコーディングを使用するには?まあ、制御文字を安全にパックするもの。

+0

それは働いた、ありがとう。 –

1

鍵のペアが正しいと仮定すると、暗号化と復号化に異なるpadding schemesを使用しているという問題があります。

RSACryptoServiceProvider#EncryptRSACryptoServiceProvider#Decryptに渡される第2引数は、OAEPが使用されているかどうかを示します。暗号化中にOAEPを要求していますが、復号化中にPKCS#1 v1.5のパディングを要求しています。それらは互換性がありません。より安全なOAEPを使用してください。

あなたが暗号文を有意義にUTF-8に変換することができ、それが保証されていないと仮定されている他の問題の中

decrypted = rsa.Decrypt(encrypted, true); 
+0

mscorlib.dllで 'System.Security.Cryptography.CryptographicException'の未処理の例外が発生しました 追加情報:復号化するデータは、このモジュラス128バイトの最大値を超えています。 –

+1

あなたの秘密鍵が公開鍵に対応していないと思われます。また、RSAは、(あなたは[ハイブリッド暗号](https://en.wikipedia.org/wiki/Hybrid_cryptosystem)を実装する必要があります)任意のデータを暗号化するために使用することはできません。 –

関連する問題