2017-03-11 1 views
0

Ich möchte Datei von Single-Datei-Stream verschlüsseln, aber ich habe diesen Fehler, wenn Entschlüsselung Padding ist ungültig und kann nicht entfernt werden, aber Verschlüsselung und Entschlüsselungsmethode hat gleiche Polsterung, wenn ich Padding einstellen. Zeros nicht verschlüsselt DateiC# Rijandel Datei Entschlüsselung Padding ist ungültig und kann nicht entfernt werden

private static readonly byte[] SALT = new byte[] { 0x26, 0xdc, 0xff, 0x00, 0xad, 0xed, 0x7a, 0xee, 0xc5, 0xfe, 0x07, 0xaf, 0x4d, 0x08, 0x22, 0x3c }; 
    Rfc2898DeriveBytes pdb = new Rfc2898DeriveBytes("TestKey", SALT); 
    public bool EncryptFileP(string Path) 
    { 
     FileInfo IOF = new FileInfo(Path); 
     WRStream = new FileStream(Path, FileMode.Open); 

     CryptoStream cryptoStream; 
     Rijndael rijndael = Rijndael.Create(); 

     rijndael.Key = pdb.GetBytes(16); 
     rijndael.IV = pdb.GetBytes(16); 

     rijndael.Mode = CipherMode.CBC; 
     rijndael.Padding = PaddingMode.PKCS7; 

     cryptoStream = new CryptoStream(WRStream, rijndael.CreateEncryptor(), CryptoStreamMode.Write); 

     cryptoStream.Close(); 
     WRStream.Close(); 

     return true; 
    } 
    public bool DecryptFileP(string Path) 
    { 
     FileInfo IOF = new FileInfo(Path); 
     WRStream = new FileStream(Path, FileMode.Open); 

     CryptoStream cryptoStream; 
     Rijndael rijndael = Rijndael.Create(); 

     rijndael.Key = pdb.GetBytes(16); 
     rijndael.IV = pdb.GetBytes(16); 

     rijndael.Mode = CipherMode.CBC; 
     rijndael.Padding = PaddingMode.PKCS7; 

     cryptoStream = new CryptoStream(WRStream, rijndael.CreateDecryptor(), CryptoStreamMode.Write); 

     cryptoStream.Close(); //error! padding is invalid and cannot be removed 
     WRStream.Close(); 


     return true; 
    } 
+0

Das bedeutet, dass die Entschlüsselung fehlgeschlagen ist, mindestens eine der verschlüsselten Daten, IV, Schlüssel oder Parameter sind inkorrekt oder sind die falsche Dencding . Mit PKCS # 7 padding die richtige Sache zu verwenden. – zaph

+0

Wenn eine der angegebenen Antworten Ihr Problem gelöst hat, können Sie [eine der Antworten akzeptieren] (http://meta.stackexchange.com/q/5234/266187). Wenn nicht, dann erweitern Sie bitte, was falsch ist. –

Antwort

0

Sie haben für die Verschlüsselung und Entschlüsselung Rfc2898DeriveBytes separat instanziiert, weil es Stateful ist. Verschieben Sie Rfc2898DeriveBytes pdb = new Rfc2898DeriveBytes("TestKey", SALT); in EncryptFileP und DecryptFileP.


Sicherheits Hinweise:

Die IV (sprich: random) unvorhersehbar sein muss. Verwenden Sie keine statische IV, da dies die Chiffre deterministisch und daher nicht semantisch sicher macht. Ein Angreifer, der Chiffriertexte beobachtet, kann feststellen, wann das gleiche Nachrichtenpräfix vorher gesendet wurde. Die IV ist nicht geheim, Sie können sie also zusammen mit dem Geheimtext senden. Normalerweise wird es einfach dem Geheimtext vorangestellt und vor der Entschlüsselung abgeschnitten.

Es ist besser, Ihre Chiffrate zu authentifizieren, so dass Angriffe wie eine padding oracle attack nicht möglich sind. Dies kann mit authentifizierten Modi wie GCM oder EAX oder mit einem encrypt-then-MAC Schema geschehen.

2

Sieht für mich wie Sie fehlen, lesen und schreiben aus den Streams, die Sie erstellen.

An einem gewissen Punkt eine Datei zu verschlüsseln, müssen Sie die plaint Textdaten, die Sie cryptoStream in Ihrem EncryptFileP, und in ähnlicher Weise verschlüsseln wollen schreiben, wenn Sie entschlüsseln Sie wieder aus cryptoStream in DecryptFileP lesen müssen. Diese Streams verschlüsseln/entschlüsseln eine Datei nicht an Ort und Stelle, so wie es aussieht.

Verwandte Themen