我刚刚熟悉加密和.NET框架。在查看了许多示例之后,我看到一个重复的模式,在使用.NET类Rfc2898DeriveBytes
时会产生混淆。使用此类获取加密密钥和初始化向量时,似乎使用了相同的方法。
以下是MSDN blog中的一些代码,用于演示获取密钥和初始化向量。
byte[] salt = new byte[] { 0, 1, 2, 3, 4, 5, 6, 7 };
Rfc2898DeriveBytes pwdGen = new Rfc2898DeriveBytes("P@$$w0rd", salt, 1000);
// generate an RC2 key
byte[] key = pwdGen.GetBytes(16);
byte[] iv = pwdGen.GetBytes(8);
我也看到过这个用在其他地方。我想我会认为它会是这样的......
// generate an RC2 key
byte[] key = pwdGen.GetKey();
byte[] iv = pwdGen.GetInitializationVector();
我必须在这里遗漏一些东西。如果密钥和初始化向量(IV)只是随机数,那么在使用正确的密码和盐时它们又是如何获得的?
答案 0 :(得分:4)
RFC2898密钥派生算法是确定性的。当您使用相同的输入运行它时,您将获得相同的输出。
因此,只要您以相同的顺序调用GetBytes()
,请求相同的字节数,您将获得相同的密钥和IV。
不要忘记在实际系统中,盐应该在加密时随机生成(并存储以便在解密时检索它)。