Hallo,
vorab, ich benütze .Net 4.0, doch diese Version ist in der Combo Box weiter oben nicht auswählbar.
Ich habe eine Frage zur verschlüsselungen/entschlüsselung mithilfe der AesCryptoServiceProvider Klasse:
Zur besseren Verständnis des Codes der noch folgt, hier eine Klasse die ich benütze, um die Daten für die AES ver-/entschlüsselung zu halten.
C#-Quelltext
1: 2: 3: 4: 5: 6: 7:
| public class AESEncryptionSettings : IDisposable { public byte[] Key { get; set; } public byte[] IV { get; set; } public ICryptoTransform Encrypter { get; set; } public ICryptoTransform Decrypter { get; set; } } |
(IDisposable wird weiter unten implementiert, ist hier aber nicht wichtig)
Ich habe mir folgende Funktion geschrieben, um den Schlüssel und co. zu generieren.
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26:
| public const int AESKeyLength = 256; public static AESEncryptionSettings GenerateAESSettings(byte[] ivToUse = null, byte[] keyToUse = null) { AESEncryptionSettings AESSettings = new AESEncryptionSettings();
AesCryptoServiceProvider acp = new AesCryptoServiceProvider(); acp.BlockSize = 128; acp.KeySize = AESKeyLength; if (ivToUse == null) acp.GenerateIV(); else acp.IV = ivToUse; if (keyToUse == null) acp.GenerateKey(); else acp.Key = keyToUse;
AESSettings.IV = acp.IV; AESSettings.Key = acp.Key; AESSettings.Decrypter = acp.CreateDecryptor(); AESSettings.Encrypter = acp.CreateEncryptor(); acp.Dispose();
return AESSettings; } |
Die Frage ist nun, wie entschlüssle/verschlüssle ich die Daten nun?
Eine Nachricht zu ent-/verschlüsseln ist noch relativ einfach
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9:
| public static byte[] EncryptAES(byte[] plain, AESEncryptionSettings settings) { return settings.Encrypter.TransformFinalBlock(plain, 0, plain.Length); } public static byte[] DecryptAES(byte[] encrypted, AESEncryptionSettings settings) { return settings.Decrypter.TransformFinalBlock(encrypted, 0, encrypted.Length); } |
Doch was nun, wenn ich mehrere Nachrichten hintereiander ver-/entschlüsseln möchte?
Zwar gibt es die
ICryptoTransform.TransformBlock Methode die wohl dafür gedacht ist, doch benötige ich hierfür die Länge der Ausgangsnachricht, die ich nicht kenne.
Ist das so dann nicht implementierbar? Bzw ist AES dafür nicht gedacht? Was gibt es für Alternativen?
mfg Flitzs
EDIT: Versuche ich damit, mehrere Nachrichten zu ent-/verschlüsselen, wird beim zweiten entschlüsseln eine
System.Security.Cryptography.CryptographicException mit der Meldung: "Padding is invalid and cannot be removed." ausgelöst.