gpt4 book ai didi

c# - 对称加密 (AES) : Is saving the IV and Salt alongside the encrypted data safe and proper?

转载 作者:IT王子 更新时间:2023-10-29 04:29:57 25 4
gpt4 key购买 nike

我试图了解在使用对称加密算法(在本例中为 AES)加密和解密数据时如何处理和管理初始化向量和盐(如果适用)。

我从不同的 SO 线程和各种其他网站推断出 IV 或 salt 都不需要是 secret 的,唯一的只是为了抵御密码分析攻击,例如暴力攻击。考虑到这一点,我认为将我的伪随机 IV 与加密数据一起存储是可行的。我在问我使用的方法是否正确,此外,我是否应该以同样的方式处理我目前的硬编码盐?将它与 IV 一起写入内存流

我的代码:

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;
}

我也愿意接受有关对称加密的任何其他信息,以了解正确的做法。

最佳答案

将 IV 和 Salt 与密文一起存储是正确的,也是最佳做法。硬编码 salt 是没有用的,随机很重要,硬编码迭代是完全可以的,但通常比 300 高得多(实际上至少 1000,如果你的机器/使用可以在 10 秒内处理它,你通常会更高数以千计)。

因为我已经从堆栈溢出剪切和粘贴到开源代码中看到了很多不好的(或旧的)c# 加密示例,所以我写了一小段剪切和粘贴加密代码 Modern Examples of Symmetric Authenticated Encryption of a string.我尽量保持最新和审查。它将 iv 和 salt 与密文一起存储,它还验证密文和密文中包含的值。

理想情况下,虽然更好的做法是使用高级加密库来为您处理 iv 等最佳做法,但 csharp 通常不存在这些。我一直在研究原生 csharp version谷歌的 keyczar图书馆。虽然它在功能上已经可以使用,但我一直想在第一个正式稳定版本发布之前更多地关注代码。

关于c# - 对称加密 (AES) : Is saving the IV and Salt alongside the encrypted data safe and proper?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13901529/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com