2017-01-12 3 views
1

このトピックに関する別の質問がありますが、すべての質問を確認しましたが、私は問題を解決できません。 これは私の解読方法で、必要なパラメータを持つメソッド:埋め込みが無効であり、削除できません。C#decrypt

public string Decrypt(AesOperationType operationType, byte[] criptotext, byte[] Key, byte[] initVector) 
{ 

     string plaintext = null; 

     using (Aes aesAlg = Aes.Create()) 
     { 
      aesAlg.KeySize = 128; 
      aesAlg.Key = Key; 
      aesAlg.IV = initVector; 
      if (operationType == AesOperationType.Cbc) 
      { 
       aesAlg.Mode = CipherMode.CBC; 
      } 
      else if (operationType == AesOperationType.Cfb) 
      { 
       aesAlg.Mode = CipherMode.ECB; 
      } 

      //apelam functia de decriptare 
      ICryptoTransform decryptor = aesAlg.CreateDecryptor(aesAlg.Key, aesAlg.IV); 

      using (MemoryStream msDecrypt = new MemoryStream(criptotext)) 

      using (CryptoStream csDecrypt = new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read)) 
      { 
       using (StreamReader srDecrypt = new StreamReader(csDecrypt)) 
       { 
        plaintext = srDecrypt.ReadToEnd(); 
       } 
      } 
     } 
     Console.WriteLine("Start decrypt for criptotext : " + BitConverter.ToString(criptotext) + "\n"); 
     Console.WriteLine("Plaintext after decrypt : " + plaintext + "\n"); 

     return plaintext; 
} 

public byte[] Encrypt_Call() 
{ 
     var key = "1212121212121212"; 
     var key_byte = Encoding.ASCII.GetBytes(key); 
     using (Aes aess = Aes.Create()) 
     { 
      var iv = aess.IV; 
      cryptdecrypt object = new cryptdecrypt(); 
      var result = object.Encrypt(AesOperationType.Cbc, "plaintext", key_byte, iv); 
      return result; 
     } 
} 

public void Decrypt_Call() 
{ 
     var key = "1212121212121212"; 
     var key_byte = Encoding.ASCII.GetBytes(key); 
     using (Aes aess = Aes.Create()) 
     { 
      var iv = aess.IV; 
      cryptdecrypt object = new cryptdecrypt(); 
      var cryptotext = Encrypt_Call(); 
      var result = object.Decrypt(AesOperationType.Cbc, cryptotext , key_byte, iv); 
     } 
} 

暗号化方式は正常に動作しますが、復号化メソッドの呼び出しで、私はこのエラーに直面:

Padding is invalid and cannot be removed.

私も、この行の前にcsDecrypt.FlushFinalBlock()この行を入れてみました:

using (StreamReader srDecrypt = new StreamReader(csDecrypt)) 

エラーが表示されなくなり、結果として空の文字列が表示されます。

これを解決する方法はありますか?

+0

ここでIVは指定されていますか? – zaph

+1

暗号化と復号化には同じキー*と* IVを使用する必要があります。暗号化と復号化の両方の方法でIVを無作為に生成している可能性があるため、同じではありません。 – Iridium

+0

@KurokawaMasato AesOperationTypeは、Cbc、Cfbで列挙型を含むクラスです。問題はありません。 – Carto

答えて

0

通常、無効なパディングエラーは、復号化に失敗したことを意味します。この場合、CBCモードでは、IVは指定されていないので、ジャンク(またはランダム)になります。

いずれか:

  1. はブロック長(AES-16バイト)のIVを指定します。

  2. 暗号化されたランダムIVを作成し、暗号化されたデータの先頭に追加します。解読時にIVを分割し、解読に使用します。 < - ベストオプション

関連する問題