Как использовать случайную соль и случайный iv в алгоритме шифрования и дешифрования aes?

можно ли использовать случайную соль и случайный iv в алгоритме шифрования и дешифрования с использованием AES или RijndaelManaged?

Я изучал алгоритмы шифрования и дешифрования, я пробовал использовать aes или rijndael, управляемые на C#, кто-то еще сказал, что если вы используете статическую соль для шифрования и повторно используете IV, это не будет безопасно.

Шифрование

public static byte[] encryptAES(byte[] bytesToBeEncrypted, byte[] 
passwordBytes)
{
byte[] result = null;
byte[] salt = new byte[] { 1, 2, 3, 4, 5, 6, 7, 8 };
using (MemoryStream MS = new MemoryStream())
{
using (RijndaelManaged Rima = new RijndaelManaged())
{
Rima.KeySize = 256;
Rima.BlockSize = 128;
Rfc2898DeriveBytes RFCDB = new Rfc2898DeriveBytes(passwordBytes, salt, 
1000);
Rima.Key = RFCDB.GetBytes(Rima.KeySize / 8);
Rima.IV = RFCDB.GetBytes(Rima.BlockSize / 8);
Rima.Mode = CipherMode.CBC;
using (CryptoStream CS = new CryptoStream(MS, Rima.CreateEncryptor(), 
CryptoStreamMode.Write))
{
CS.Write(bytesToBeEncrypted, 0, bytesToBeEncrypted.Length);
CS.Close();
}
result = MS.ToArray();
}
}
return result;
}

Расшифровка

public static byte[] decryptAES(byte[] bytesToBeDecrypted, byte[] 
passwordBytes)
{
byte[] result = null;
using (MemoryStream memoryStream = new MemoryStream())
{
Rfc2898DeriveBytes rfc2898DeriveBytes = new 
Rfc2898DeriveBytes(passwordBytes, saltBytes, 1000);
Rima.Key = rfc2898DeriveBytes.GetBytes(Rima.KeySize / 8);
Rima.IV = rfc2898DeriveBytes.GetBytes(Rima.BlockSize / 8);
using (CryptoStream cryptoStream = new CryptoStream(memoryStream, 
Rima.CreateDecryptor(), CryptoStreamMode.Write))
{
cryptoStream.Write(bytesToBeDecrypted, 0, bytesToBeDecrypted.Length);
cryptoStream.Close();
}
result = memoryStream.ToArray();
}
return result;
}

private static RijndaelManaged Rima = new RijndaelManaged
{
KeySize = 256,
BlockSize = 128,
Mode = CipherMode.CBC
};

private static byte[] saltBytes = new byte[] { 1, 2, 3, 4, 5, 6, 7, 8 };

Я пытался найти способ использовать случайную или динамическую соль и случайный IV.


person Nurohman AR    schedule 06.04.2019    source источник
comment
RijndaelManaged — очень старая и нестандартная библиотека. Стандартом является AES, и вы должны использовать AesCryptoServiceProvide. Забудьте о режиме работы CBC, используйте AES-GCM или ChaCha-Poly1305, которые включают режимы аутентифицированного шифрования. в TLS 1.3.   -  person kelalaka    schedule 06.04.2019


Ответы (1)


Да... использовать статический IV или соль - плохая идея. Причина в том, что использование согласованного IV или соли оказывает «сообщение» или постоянное влияние на все сообщения, которые вы отправляете с использованием этого IV и соли. Для всех практических целей вы можете сгенерировать случайную соль и IV, но дешифратор должен знать их значения. Технически они не являются секретными, и вы можете отправить их получателю. Если они используются для шифрования данных, хранящихся в базе данных, вам необходимо сохранить соль и IV вместе с сообщением.

В блочных шифрах они используются для «маскировки» начала сообщения, чтобы вы не видели повторяющихся шаблонов в зашифрованном тексте. Если вы используете одну и ту же соль и IV во всех своих сообщениях (при условии, что вы используете один и тот же пароль или ключ), каждое сообщение, начинающееся с одних и тех же нескольких символов, будет иметь одни и те же несколько байтов в начале зашифрованного текста... и в этом и заключается начало вынюхивания ваших сообщений. Биты первого блока передаются обратно в следующий блок зашифрованного текста... поэтому несколько случайных первых фрагментов сообщения более полно зашифровывают ваши сообщения... что значительно усложняет анализ шаблонов.

Кстати, вы используете старый код из старых примеров. Я рекомендую вам взглянуть на этот вопрос для более подходящих способов шифрования/дешифрования данных в .Net. В некоторых ответах вы увидите какой-то код, который очень похож на ваш, но есть важные отличия. Обсуждения в этом вопросе и лучшие ответы заслуживают прочтения.

person Clay    schedule 06.04.2019
comment
спасибо, я заменил его с помощью AesCryptoServiceProvider, можете ли вы помочь мне найти случайные ссылки на соль и случайный iv в шифровании и дешифровании aes? - person Nurohman AR; 08.04.2019
comment
Я сохраню случайную соль и случайный IV, сгенерированный в текстовом файле, для последующего использования при расшифровке. - person Nurohman AR; 08.04.2019
comment
извините, я нашел все ответы в вашем комментарии, спасибо @Clay - person Nurohman AR; 08.04.2019