2017-11-05 5 views
2

このアーカイブのメッセージを得るには、アーカイブの名前をテキストボックスに入力します。埋め込み文字が来ると解読の問題が発生する

私はテキストボックスにパスワードを書き込みます

I塩を計算します。

private void button1_Click_1(object sender, EventArgs e) 
    { 
     String message; 
     String password; 
     String result; 
     String resultSalt; 
     String nameResult; 
     byte[] salt; 


     password = textBox2.Text; 
     nameResult = textBox3.Text; 
     new RNGCryptoServiceProvider().GetBytes(salt = new byte[16]); 

     resultSalt = Convert.ToBase64String(salt); 

     if (radioButton1.Checked == true) 
     { 
      message = readArchive(); 
      result = Encrypt(message,password,resultSalt); 
      try 
      { 
       File.WriteAllText(nameResult, result); 
       MessageBox.Show("Encrypt Ok"); 
      } 
      catch 
      { 
       MessageBox.Show("Error"); 
      } 

     } 
     else 
     { 
      message = readArchive(); 
      result = Decrypt(message,password,result); 
      try 
      { 
       File.WriteAllText(nameResult, resultSalt); 
       MessageBox.Show("Decrypt OK"); 
      } 
      catch 
      { 
       MessageBox.Show("Error"); 
      } 

     } 
    } 

方法を暗号化

public static string Encrypt(string message, string pass, string salt) 
    { 
     AesCryptoServiceProvider aes = new AesCryptoServiceProvider(); 
     DeriveBytes rgb = new Rfc2898DeriveBytes(pass, Encoding.Unicode.GetBytes(salt), 9); 
     byte[] key = rgb.GetBytes(aes.KeySize >> 3); 
     byte[] iv = rgb.GetBytes(aes.BlockSize >> 3); 
     aes.Mode = CipherMode.CBC; 
     aes.Key = key; 
     aes.IV = iv; 
     ICryptoTransform encryptor = aes.CreateEncryptor(); 
     byte[] data = Encoding.Unicode.GetBytes(message); 
     byte[] dataencrypt = encryptor.TransformFinalBlock(data, 0, data.Length); 
     return Convert.ToBase64String(dataencrypt); 
    } 

方法は

public static string Decrypt(string message, string pass, string salt) 
    { 
     AesCryptoServiceProvider aes = new AesCryptoServiceProvider(); 
     DeriveBytes rgb = new Rfc2898DeriveBytes(pass, Encoding.Unicode.GetBytes(salt), 9); 
     byte[] key = rgb.GetBytes(aes.KeySize >> 3); 
     byte[] iv = rgb.GetBytes(aes.BlockSize >> 3); 
     aes.Mode = CipherMode.CBC; 
     aes.Key = key; 
     aes.IV = iv; 
     ICryptoTransform decryptor = aes.CreateDecryptor(); 
     byte[] data = Convert.FromBase64String(message); 
     byte[] datadecrypt = decryptor.TransformFinalBlock(data, 0, data.Length); 
     return Encoding.Unicode.GetString(datadecrypt); 
    } 

方法readArchive

private string readArchive() 
    { 
     String nameArchive = textBox1.Text; 
     String text = ""; 
     try 
     { 

      text = File.ReadAllText(@nameArchive); 

     } 
     catch 
     { 

      MessageBox.Show("Error."); 
     } 
     return text; 
    } 
を復号化]ボタンをクリックします

エラーライン

byte[] datadecrypt = decryptor.TransformFinalBlock(data, 0, data.Length); 

System.Core.dll

で型「System.Security.Cryptography.CryptographicException」

追加情報の未処理の例外:文字の間にパディングが有効でないとできません除去される。

+0

詳細が必要です。 例外メッセージは何ですか?内部の例外があり、それは何ですか? – GhostTW

+0

'Unicode.GetBytes(salt)'は弱いですが、暗号化と一致する必要があります。 –

+0

Decryption _and_ Encryptionコードで完全な[mcve]を書いてください。 –

答えて

1

あなたは、あなたと塩をコードするbase64である:あなたのEncrypt(..)に渡し、その後Encoding.Unicode.GetBytes(salt)でbase64でエンコードされた文字列のバイト値を取る前にresultSalt = Convert.ToBase64String(salt)。これはおそらくあなたが望むものではなく、代わりにbyte []として渡すか、またはそれを使う前に適切なbase64デコードを行います。

しかし、これは主な問題ではありません。主な問題は、ではなく、にresultを渡すことです。しかし、あなたがそうするとき、それはEncrypt(..)で使用されているものと同じであることを保証する必要があります。現在、あなたはクリックごとに新しい塩を生成します。

+0

これは私の問題を解決します – Teddy

関連する問題