Symmetric Encryption (AES): Sichert das IV und Salt neben den verschlüsselten Daten sicher und ordentlich?
Ich versuche, Sinn zu machen, wie Sie zu behandeln und zu verwalten, eine initilization Vektor-und Salz (wenn zutreffend), der beim verschlüsseln und entschlüsseln von Daten mit einen symmetrischen Verschlüsselungs-Algorithmus, in diesem Fall AES.
Habe ich abgeleitet aus verschiedenen SO threads und verschiedenen anderen websites, die weder von der IV oder Salz müssen geheim sein, nur um zu verteidigen gegen cryptanalytic Angriffe wie brute-force-Angriff. Mit diesem hintergrund dachte ich, wäre es sinnvoll meine pseudo-random-IV mit den verschlüsselten Daten. Ich Frage, ob die Methode, die ich verwende, ist die richtige und außerdem, sollte ich die Behandlung meiner derzeit hart codiert Salz in der gleichen Weise? Dass das schreiben auf die Speicher-stream an der Seite der IV
Mein code:
private const ushort ITERATIONS = 300;
private static readonly byte[] SALT = new byte[] { 0x26, 0xdc, 0xff, 0x00, 0xad, 0xed, 0x7a, 0xee, 0xc5, 0xfe, 0x07, 0xaf, 0x4d, 0x08, 0x22, 0x3c };
private static byte[] CreateKey(string password, int keySize)
{
DeriveBytes derivedKey = new Rfc2898DeriveBytes(password, SALT, ITERATIONS);
return derivedKey.GetBytes(keySize >> 3);
}
public static byte[] Encrypt(byte[] data, string password)
{
byte[] encryptedData = null;
using (AesCryptoServiceProvider provider = new AesCryptoServiceProvider())
{
provider.GenerateIV();
provider.Key = CreateKey(password, provider.KeySize);
provider.Mode = CipherMode.CBC;
provider.Padding = PaddingMode.PKCS7;
using (MemoryStream memStream = new MemoryStream(data.Length))
{
memStream.Write(provider.IV, 0, 16);
using (ICryptoTransform encryptor = provider.CreateEncryptor(provider.Key, provider.IV))
{
using (CryptoStream cryptoStream = new CryptoStream(memStream, encryptor, CryptoStreamMode.Write))
{
cryptoStream.Write(data, 0, data.Length);
cryptoStream.FlushFinalBlock();
}
}
encryptedData = memStream.ToArray();
}
}
return encryptedData;
}
public static byte[] Decrypt(byte[] data, string password)
{
byte[] decryptedData = new byte[data.Length];
using (AesCryptoServiceProvider provider = new AesCryptoServiceProvider())
{
provider.Key = CreateKey(password, provider.KeySize);
provider.Mode = CipherMode.CBC;
provider.Padding = PaddingMode.PKCS7;
using (MemoryStream memStream = new MemoryStream(data))
{
byte[] iv = new byte[16];
memStream.Read(iv, 0, 16);
using (ICryptoTransform decryptor = provider.CreateDecryptor(provider.Key, iv))
{
using (CryptoStream cryptoStream = new CryptoStream(memStream, decryptor, CryptoStreamMode.Read))
{
cryptoStream.Read(decryptedData, 0, decryptedData.Length);
}
}
}
}
return decryptedData;
}
Ich bin auch offen für alle anderen Informationen über die symmetrische Verschlüsselung wird mit Bezug auf die entsprechende übung.
InformationsquelleAutor der Frage Caster Troy | 2012-12-16
Du musst angemeldet sein, um einen Kommentar abzugeben.
Speicherung der IV und Salz lange mit dem Geheimtext ist die richtige und beste Praxis. Hart codieren, das Salz ist nicht sinnvoll, eher zufällig ist wichtig, harte Kodierung der Iterationen ist vollkommen in Ordnung, ist aber in der Regel viel höher als 300 (die in der Tat mindestens 1000, und Sie in der Regel gehen viel höher, wenn Ihre Maschine/Nutzung kann es handhaben wie in 10s von tausenden).
Weil ich gesehen habe so viele schlechte (oder alte) Beispiele für c# Verschlüsselung von stack-overflow-Ausschneiden und einfügen in open-source-code, ich schrieb etwas von Ausschneiden und einfügen-Verschlüsselung code Moderne Beispiele von Symmetrischen Authentifizierte Verschlüsselung einer Zeichenkette.dass ich versuche, aktuell zu halten und überprüft. Es speichert die iv und Salz mit den ciphertext es auch authentifiziert den Chiffretext und Werte enthalten, mit dem verschlüsselten text.
Idealerweise eine bessere Praxis wäre eine high-level-Verschlüsselung-Bibliothek, die das handhaben würde, best practices wie die iv für Sie, aber diejenigen, die in der Regel noch nicht existierte, csharp. Ich arbeite schon an einer einheitlichen csharp-version von google keyczar Bibliothek. Es ist zwar funktionell bereit für den Einsatz, ich habe gefehlt, um mehr Augen auf den code, bevor die erste offizielle stabile Version.
InformationsquelleAutor der Antwort jbtule
Ja, die IV und Salz werden öffentliche Werte. Was noch wichtiger ist, sicherzustellen, dass diese zufällig sind die Werte für jeden Verschlüsselungsvorgang.
Um ein Beispiel zu geben von dieser in freier Wildbahn, nehmen Sie einen Blick auf die rncryptor Daten-format. Hier die Salz-und IV sind verpackt in einem Daten-format, zusammen mit dem Geheimtext und einen MAC-Wert. (Hinweis: dies ist eine objective-c-Beispiel).
InformationsquelleAutor der Antwort Duncan Jones