gpt4 book ai didi

c# - 对 Key 和 IV 使用相同值的缺点?

转载 作者:太空宇宙 更新时间:2023-11-03 21:19:10 24 4
gpt4 key购买 nike

我正在为 .NET 实现一些类(除其他外)简化加密和解密。

我当前的算法创建一个 8 字节的盐,并使用该盐和密码生成 key 和 IV。然后,我将未加密的盐与我的加密数据一起存储。

这很好,因为盐似乎总是 8 个字节,这就是它添加到我的加密数据中的所有开销。但是,对我的 key 和 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);
}

最佳答案

好的,只要您为每条消息使用一个新的、随机创建的盐,您就接近我可能做的事情了。随机盐意味着 IV 将随着每条新消息而变化,这意味着完全相同的消息每次传输将是不同的加密文本。都好。如果我是你,我会改变的一件事是不使用 DeriveBytes 获取 key 然后获取 IV,我会让 DeriveBytes 给出一组字节的 key 和 IV 的大小,然后拆分它们并使用它们分别地。 IV 不应该对任何人保密。关键一定是。因此,如果您从相同的 salt 和密码中 DeriveBytes 一次,然后将这些字节拆分为 key 和 IV,攻击者在查看 IV 后仍然比以前更了解 key 。

或者,您可以使用随机数在 IV 字节和 key 字节之间创建已知排列。例如,请原谅我的伪代码:

IV = DeriveBytes(salt + password + "IV")
key = DeriveBytes(salt + password + "key")

任何一种方式都是安全的。但是我只会 DeriveBytes,比如 32 个字节,然后将其中的 16 个用于 IV,将其中的 16 个用于 key 。前 16 个字节中没有任何信息可以帮助攻击者计算接下来的 16 个字节。

关于c# - 对 Key 和 IV 使用相同值的缺点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31954882/

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