2017-03-08 3 views
1

Hallo Ich möchte Text verschlüsseln und entschlüsseln. Mein Verschlüsselungscode funktioniert einwandfrei und entspricht dem Wert, den ich möchte. Aber wenn ich entschlüsseln möchte, gibt dies den Fehler padding is invalid and cannot be removed. Im unteren Code gebe ich zuerst meinen Verschlüsseln und Entschlüsseln beider Codes. Auch ich muss diesen Fehler beheben Stack overflow link, StackoverlFlow Link 2, aber nicht beheben.Padding ist ungültig und kann nicht entschlüsselt werden Wert

string getHashKey1 = EncryptText("10002:1486703720424", "hpIw4SgN)TxJdoQj=GKo)p83$uHePgoF"); 

Ergebnis = 1ltQFLRGNif73uCNzi0YEvBqLKiRgx6fWsk5e/GcTQc=

string reverseKey = DecryptText('1ltQFLRGNif73uCNzi0YEvBqLKiRgx6fWsk5e/GcTQc=', "hpIw4SgN)TxJdoQj=GKo)p83$uHePgoF"); 

Wenn ich in AES_DECRYPT hinzufügen PaddingMode.Zeros aes.Padding =; Ich komme unter Ergebnis. Ergebnis: - ����y�7�t���Ij���,���� Z��$�

public string EncryptText(string input, string password) 
    { 
     string result = ""; 
     try 
     { 
      // Get the bytes of the string 
      byte[] bytesToBeEncrypted = Encoding.UTF8.GetBytes(input); 
      byte[] passwordBytes = Encoding.UTF8.GetBytes(password); 

      byte[] bytesEncrypted = AES_Encrypt(bytesToBeEncrypted, passwordBytes); 

      result = Convert.ToBase64String(bytesEncrypted); 
      return result; 
     } 
     catch (Exception ex) 
     { 

     } 

     return result; 
    } 

public byte[] AES_Encrypt(byte[] bytesToBeEncrypted, byte[] passwordBytes) 
    { 
     byte[] encryptedBytes = null; 
     try 
     {  
      using (MemoryStream ms = new MemoryStream()) 
      { 
       using (Aes aes = Aes.Create()) 
       { 
        aes.Key = passwordBytes; 
        aes.Mode = CipherMode.ECB; 

        // "zero" IV 
        aes.IV = new byte[16]; 

        using (var cs = new CryptoStream(ms, aes.CreateEncryptor(), CryptoStreamMode.Write)) 
        { 
         cs.Write(bytesToBeEncrypted, 0, bytesToBeEncrypted.Length); 
         cs.Close(); 
        } 
        encryptedBytes = ms.ToArray(); 
       } 
      } 
     } 
     catch (Exception ex) 
     { 

     }    
     return encryptedBytes; 
    } 

Above Code arbeitet für encrypt in Ordnung. Below-Code wird Fehler geben padding is invalid and cannot be removed

public string DecryptText(string input, string password) 
    { 
     // Get the bytes of the string 
     byte[] bytesToBeDecrypted = Convert.FromBase64String(input); 
     byte[] passwordBytes = Encoding.UTF8.GetBytes(password); 
     passwordBytes = SHA256.Create().ComputeHash(passwordBytes); 

     byte[] bytesDecrypted = AES_Decrypt(bytesToBeDecrypted, passwordBytes); 

     string result = Encoding.UTF8.GetString(bytesDecrypted); 

     return result; 
    } 


public byte[] AES_Decrypt(byte[] bytesToBeDecrypted, byte[] passwordBytes) 
    { 
     byte[] decryptedBytes = null; 

     using (MemoryStream ms = new MemoryStream()) 
     { 
      using (Aes aes = Aes.Create()) 
      { 
       aes.Key = passwordBytes; 
       aes.Mode = CipherMode.ECB; 
       aes.IV = new byte[16];     

       using (var cs = new CryptoStream(ms, aes.CreateDecryptor(), CryptoStreamMode.Write)) 
       { 
        cs.Write(bytesToBeDecrypted, 0, bytesToBeDecrypted.Length); 
        cs.Close(); // here i am getting error 
       } 
       decryptedBytes = ms.ToArray(); 
      } 
     } 

     return decryptedBytes; 
    } 
+0

Sie sind Hashing das Passwort, wenn Sie entschlüsseln 'passwordBytes = SHA256.Create() ComputeHash (passwordBytes).', Aber nicht, wenn encrypt – pedrofb

+0

@pedrofb, was ich tun muss, wenn ich –

+0

@pedrofb dank Entschlüsselt entfernt ich diese Zeile und jetzt funktioniert es. Danke –

Antwort

1

Sie sind Hashing das Passwort, wenn Sie, zu entschlüsseln

passwordBytes = SHA256.Create().ComputeHash(passwordBytes); 

aber nicht, wenn verschlüsseln. Dies bedeutet, dass Sie unterschiedliche Passwörter

+0

danke bis abstimmen deine antwort. Ich habe meine 3 Stunden schon vergeben um Fehler zu finden –

3

Sie haben zwei Probleme verwenden:

1) (bereits erwähnt von pedrofb): Sie verwenden UTF8.GetBytes in verschlüsseln, aber SHA256(UTF8.GetBytes()) in entschlüsseln.

Sie sollten keine dieser Methoden verwenden, sondern stattdessen eine geeignete kennwortbasierte Schlüsselableitungsfunktion wie PBKDF2 verwenden. In .NET PBKDF2 ist über die Rfc2898DeriveBytes Klasse verfügbar.

byte[] salt = 8 or more bytes that you always pass in as the same. 
// (salt could be fixed for your application, 
// but if you have users it should be unique per user and stored along with the output value) 
int iterations = 100000; 
// Or bigger. If you were making a user management system you 
// should write this number down, too, so you can increase it over time; 
// it should be whatever number makes it take 100ms or more on the fastest relevant computer) 
Rfc2898DeriveBytes pbkdf2 = new Rfc2898DeriveBytes(password, salt, iterations); 
passwordBytes = pbkdf2.GetBytes(16); // 16 = AES128, 24 = AES192, 32 = AES256. 

2) Sie verwenden Base64-Codierung in verschlüsseln, aber UTF8.GetBytes in entschlüsseln.

Bonus Probleme:

3) Sie verwenden Electronic Codebook (EZB) verketten. Cipher Block Chaining (CBC) wird gegenüber ECB empfohlen.

CBC Um richtig zu nutzen, einen zufälligen Initialisierungsvektor lassen (IV) in encrypt generiert werden (die automatisch erfolgt, wenn Sie ein neues Aes Objekt zu erstellen, oder Sie können GenerateIV() in encrypt anrufen, wenn Sie das Objekt wieder verwenden). Dann können Sie einfach die IV (die immer 16 Bytes für AES ist) dem Chiffretext voranstellen. Bei der Entschlüsselung können Sie entweder a) die ersten 16 Bytes zerhacken und als IV zuweisen (dann den Rest der Daten entschlüsseln) oder b) den gesamten Blob entschlüsseln und die ersten 16 Bytes der entschlüsselten Ausgabe ignorieren.

Verwandte Themen