2017-01-12 2 views
1

Ich sah, dass eine andere Fragen zu diesem Thema existiert, aber ich habe jede Frage überprüft und ich kann mein Problem nicht lösen .. Dies ist meine Methode zu entschlüsseln und eine andere Methode zum Entschlüsseln aufrufen Verfahren mit den erforderlichen Parametern:Padding ist ungültig und kann nicht entfernt werden C# entschlüsseln

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); 
     } 
} 

Encrypt-Methode funktioniert gut, aber bei der Entschlüsselung Methodenaufruf, begegne ich diesen Fehler:

Padding is invalid and cannot be removed.

ich habe auch versucht csDecrypt.FlushFinalBlock() diese Zeile vor diesem Spiel zu setzen:

using (StreamReader srDecrypt = new StreamReader(csDecrypt)) 

Der Fehler verschwindet und als Ergebnis bekomme ich eine leere Zeichenfolge.

Irgendwelche Ideen, um das zu lösen?

+0

Wo ist die IV angegeben? – zaph

+1

Sie müssen den gleichen Schlüssel * und * IV für die Verschlüsselung und Entschlüsselung verwenden. Es sieht so aus, als ob Sie die IV sowohl bei den Verschlüsselungs- als auch bei den Entschlüsselungsmethoden zufallsgeneriert haben und daher nicht identisch sind. – Iridium

+0

@KurokawaMasato AesOperationType ist eine Klasse, die eine Enum mit Cbc, Cfb enthält. Dort gibt es kein Problem – Carto

Antwort

0

Normalerweise bedeutet ein ungültiger Auffüllfehler, dass die Entschlüsselung fehlgeschlagen ist. In diesem Fall wird im CBC-Modus die IV nicht angegeben, so dass es Junk (oder zufällig) sein wird.

Entweder:

  1. eine IV von Blocklänge angeben (AES 16-Byte).

  2. Erstellen Sie eine zufällige IV bei der Verschlüsselung und vor der verschlüsselten Daten. Bei der Entschlüsselung wird die IV getrennt und zur Entschlüsselung verwendet. < - Beste Option

Verwandte Themen