2017-01-19 42 views
1

PaddingMode.PKCS7を使用して文字列を復号しようとすると、 'Padding is not invalid'という例外が発生しますが、PaddingMode.Zerosを使用しようとすると、例外が発生します。Paddingは無効であり、RijndaelManagedを使用して削除することはできません

P.S私はPaddingMode.PKCS7を使用してスクリプトを暗号化しているので、同じPaddingModeを使用してスクリプトを復号化する必要があります。

if (encrypted == null || encrypted.Length == 0) 
       throw new ArgumentNullException("ecrypted"); 
      if (keyArr == null || keyArr.Length == 0) 
       throw new ArgumentNullException("keyArr"); 
      if (iv == null || iv.Length == 0) 
       throw new ArgumentNullException("iv"); 

      using (RijndaelManaged rij = new RijndaelManaged()) 
      { 

       rij.Padding = PaddingMode.PKCS7; 
       rij.Mode = CipherMode.CBC; 
       rij.KeySize = 128; 
       rij.BlockSize = 128; 

       rij.Key = keyArr; 
       rij.IV = iv; 

       ICryptoTransform decryptor = rij.CreateDecryptor(); 

       using (MemoryStream ms = new MemoryStream()) 
       { 
        using (CryptoStream cs = new CryptoStream(ms, decryptor, CryptoStreamMode.Write)) 
        { 
         cs.Write(encrypted, 0, encrypted.Length); 
        } 
        plainText = Encoding.UTF8.GetString(ms.ToArray()); 
       } 

      } 

事前

+0

問題を特定できるように、ここにコードを入力してください。 – Andy

+0

Andy、私はコードを提供しています、plsは問題を特定できますか? – Krish

+0

復号化するコードを追加しましたが、暗号化はしません。私の推測では、暗号テキストをBase64や16進数で正しくエンコードしていないとデータが壊れてしまうのです。暗号テキストにUTF-8やASCIIなどのエンコーディングを使用すると、バイトシーケンスが印字不能文字または制御文字として解釈されます。上記のように安全なエンコーディングを使用してください。 – Andy

答えて

1

のおかげで通常のパディングの誤りではなく、それが復号誤りである、パディングエラーがあるというわけではありません。解読が失敗すると、出力は本質的にランダムなバイトであり、パディングは当然間違いになります。

ていることを確認してください:

  1. すべて同じオプションが使用され、それが明示的にデフォルト値に依存しているすべてのオプションを指定しないのがベストです。
  2. 暗号化キーは正確な許容サイズですが、キー埋め込みには依存しません。
  3. 暗号化されたデータのすべてのエンコーディングは、暗号化と復号化で正しく処理されます。
関連する問題