Я реализую некоторые классы для .NET, которые (среди прочего) упрощают шифрование и дешифрование.
Мой текущий алгоритм создает 8-байтовую соль и использует эту соль с паролем для генерации ключа и IV. Затем я храню незашифрованную соль вместе с моими зашифрованными данными.
Это хорошо, потому что размер соли всегда составляет 8 байт, и это все накладные расходы, которые она добавляет к моим зашифрованным данным. Однако есть ли недостаток в использовании одного и того же значения как для моего ключа, так и для IV? Есть ли способ лучше?
Соответствующий код:
SymmetricAlgorithm algorithm = CreateAlgorithm();
byte[] salt = CreateSalt();
byte[] keyBytes = DeriveBytes(salt, algorithm.KeySize >> 3);
byte[] ivBytes = DeriveBytes(salt, algorithm.BlockSize >> 3);
Вспомогательный код:
private static readonly int SaltLength = 8;
internal byte[] CreateSalt()
{
byte[] salt = new byte[SaltLength];
using (RNGCryptoServiceProvider generator = new RNGCryptoServiceProvider())
{
generator.GetBytes(salt);
}
return salt;
}
public byte[] DeriveBytes(byte[] salt, int bytes)
{
Rfc2898DeriveBytes derivedBytes = new Rfc2898DeriveBytes(Password, salt, 1000);
return derivedBytes.GetBytes(bytes);
}