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

Schreibe einen Kommentar