2016-11-03 3 views
0

Zuerst, ich weiß, gibt es Dutzende von anderen Beiträge, die Antworten auf diese Frage haben und ich habe sie alle gelesen und ausprobiert. Ich kann immer noch nicht über dieses Problem hinwegkommen, also suche ich nach einer kleinen Hilfe von jemandem, der mehr über Krypto weiß als ich."Padding ist ungültig und kann nicht entfernt werden" während der Entschlüsselung

Zweitens ist der Code, den ich teilen werde, Erbe und weil ich kein Crypto-Experte bin, ist es immer noch nicht 100% klar, was alles bedeutet. Es kann sein, dass ein Teil oder der gesamte Code totaler Müll ist und verschrottet werden sollte; Es gibt jedoch viele andere Systeme, die es bereits verwenden und verschlüsselte Werte gespeichert haben, die diesen Code durchlaufen haben. Dinge wie den Krypto-Algorithmus zu ändern, ist an dieser Stelle nicht gerade eine Option. Abgesehen davon sind die privaten Methoden der Legacy-Code, und die Testwerte (d. H. Der Verschlüsselungsschlüssel) sind alles Dinge, die sich nicht ändern können. Die beiden öffentlichen statischen Methoden sind neu und verursachen wahrscheinlich Probleme, aber ich kann es nicht herausfinden.

On mit dem Code ......

class Program 
{ 
    public static string Encrypt(string key, string toEncrypt) 
    { 
     var keyArray = Convert.FromBase64String(key); 
     var info = Encoding.ASCII.GetBytes(toEncrypt); 

     var encrypted = Encrypt(keyArray, info); 

     return Encoding.ASCII.GetString(encrypted); 
    } 

    public static string Decrypt(string key, string cipherString) 
    { 
     var keyArray = Convert.FromBase64String(key); 
     var cipherText = Encoding.ASCII.GetBytes(cipherString); 

     var decrypted = Decrypt(keyArray, cipherText); 

     return Encoding.ASCII.GetString(decrypted); 
    } 

    private static byte[] Encrypt(byte[] key, byte[] info) 
    { 
     using (var cipher = Aes.Create()) 
     { 
      cipher.Key = key; 
      cipher.Mode = CipherMode.CBC; 
      cipher.Padding = PaddingMode.ISO10126; 

      using (var ms = new MemoryStream()) 
      { 
       using (var cs = new CryptoStream(ms, cipher.CreateEncryptor(), CryptoStreamMode.Write)) 
       { 
        cs.Write(info, 0, info.Length); 
       } 

       var ciphertext = ms.ToArray(); 

       var message = new byte[cipher.IV.Length + ciphertext.Length]; 
       cipher.IV.CopyTo(message, 0); 
       ciphertext.CopyTo(message, cipher.IV.Length); 
       return message; 
      } 
     } 
    } 

    private static byte[] Decrypt(byte[] key, byte[] ciphertext) 
    { 
     using (var cipher = Aes.Create()) 
     { 
      cipher.Key = key; 
      cipher.Mode = CipherMode.CBC; 
      cipher.Padding = PaddingMode.ISO10126; 

      var ivSize = cipher.IV.Length; 
      var iv = new byte[ivSize]; 
      Array.Copy(ciphertext, iv, ivSize); 
      cipher.IV = iv; 

      var data = new byte[ciphertext.Length - ivSize]; 
      Array.Copy(ciphertext, ivSize, data, 0, data.Length); 

      using (var ms = new MemoryStream()) 
      { 
       using (var cs = new CryptoStream(ms, cipher.CreateDecryptor(), CryptoStreamMode.Write)) 
       { 
        cs.Write(data, 0, data.Length); 
       } 

       return ms.ToArray(); 
      } 
     } 
    } 

    static void Main(string[] args) 
    { 
     var newEncryptionKey = Guid.NewGuid().ToString().Replace("-", string.Empty); 

     var encryptedValue = Encrypt(newEncryptionKey, "test"); 

     Console.WriteLine($"New encrypted value: {encryptedValue}"); 

     var decryptedValue = Decrypt(newEncryptionKey, encryptedValue); 

     Console.WriteLine($"New decrypted value: {decryptedValue}"); 
    } 
} 

So gibt es. Im Grunde versuche ich eine Testzeichenkette von "test" zu verwenden und sie mit einer GUID als Schlüssel zu verschlüsseln. Wieder habe ich diesen Schlüssel nicht gewählt und es gibt verschlüsselte Werte, die bereits eine GUID als Schlüssel verwenden, also kann ich das nicht ändern, wenn es überhaupt möglich ist. Die Verschlüsselung funktioniert gut, aber wenn ich die Entschlüsselung mache, bekomme ich die Ausnahme im Titel dieser Frage.

Jede Hilfe wäre sehr geschätzt.

Antwort

1

Sie können nicht einfach eine byte[] von Chiffretext in ASCII konvertieren. So funktioniert es nicht. Zeichenkodierungen sind unheimliche Bestien und sollten nicht durcheinander gebracht werden, wenn du sie nicht verstehst. Ich glaube nicht, dass es eine echte Person gibt, die lebt;)

Was Sie tun sollten ist stattdessen ist Ihr Ergebnis als base64 zurück, die immer noch eine Sammlung von ASCII-Zeichen ist, aber sie sind sicher, um als verschoben werden eine Zeichenfolge und führt nicht zum Verlust von Zeichen.

den geänderten Code Siehe unten:

public static string Encrypt(string key, string toEncrypt) 
{ 
    var keyArray = Convert.FromBase64String(key); 
    var info = Encoding.ASCII.GetBytes(toEncrypt); 

    var encrypted = Encrypt(keyArray, info); 

    return Convert.ToBase64String(encrypted); 
} 

public static string Decrypt(string key, string cipherString) 
{ 
    var keyArray = Convert.FromBase64String(key); 
    var cipherText = Convert.FromBase64String(cipherString); 

    var decrypted = Decrypt(keyArray, cipherText); 

    return Encoding.ASCII.GetString(decrypted); 
} 
+0

Yup. Ich gebe zu, dass ich ein absoluter Neuling bin. Ich habe diesen Code geerbt und die Person, die ihn ursprünglich geschrieben hat, ist nicht mehr da. Vielen Dank für Ihre Erklärung und Hilfe. Es funktioniert jetzt perfekt. – meyousikmann

+0

@meyousikmann Muss von irgendwo lernen. Freue mich zu helfen. –

Verwandte Themen