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

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

Я узнал об алгоритмах шифрования и дешифрования, я пытался использовать aes или rijndaelmanaged в 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.

1 Ответ

1 голос
/ 06 апреля 2019

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

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

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

...