c# - 如何在aes加密和解密算法中使用随机salt和随机iv?

标签 c# encryption aes rijndaelmanaged

是否可以在使用 AES 或 RijndaelManaged 的​​加密和解密算法中使用随机盐和随机 iv?

我正在学习加密和解密算法,我尝试在C#中使用aes或rijndaelmanagement,有人说,如果你使用静态盐进行加密并重复使用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 的方法。

最佳答案

是的...使用静态 IV 或盐不是一个好主意。原因是使用一致的 IV 或盐对您使用该 IV 和盐发送的所有消息具有“告诉”或一致的效果。出于所有实际目的,您可以生成随机盐和 IV,但是解密器需要知道它们的值。从技术上讲,它们不是 secret 的,您可以将它们发送给收件人。如果它们用于加密数据库中保存的数据,您需要将 salt 和 IV 与消息一起保留。

在分组密码中,它们用于“掩盖”消息的开头,这样您就不会在密文中看到重复出现的模式。如果您在所有消息上使用相同的盐和 IV(假设您使用相同的密码或 key ),则以相同的几个字符开头的每条消息在密文的开头将具有相同的几个字节......并且这就是嗅探你的消息的开始。第一个 block 的位被反馈到下一个密文 block 中...因此随机的前几 block 消息会更完全地扰乱您的消息...使模式分析变得更加困难。

顺便说一句,您正在使用旧示例中的一些旧代码。我建议您看看this question了解在 .Net 中加密/解密数据的更合适的方法。您会在一些答案中看到一些代码,这些代码看起来很像您的代码,但也存在重要的差异。这个问题中的讨论和热门答案值得一读。

关于c# - 如何在aes加密和解密算法中使用随机salt和随机iv?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55546903/

相关文章:

c# - 参数类型 System.Linq.IQueryable<> 不可分配给参数类型 Systems.collection.generic.ienumerable

c# - 使用 webbrowser 从 C# 向套接字发送命令

c# - Ninject - 绑定(bind)通用类型与约束

java - BouncyCaSTLe PGP 和 McAfee eBusiness Server 8.6 不兼容

c - C语言中AES混合列 block 的伽罗瓦域乘法

c# - ConcurrentDictionary.Where 对于基于 int 数组(键字段)的过滤非常慢

android - 如何安全存储应用程序私有(private)文件?

c# - RC4算法: Unable to Encrypt/Decrypt data where client uses Javascript and Server c#

具有去哈希功能的 Java AES

c++ - 在 HElib 上使用 AES 实现; addCtxt 函数失败