3

我刚刚熟悉加密和.NET框架。看过很多例子后,我看到一个重复的模式,在使用.NET类Rfc2898DeriveBytes时会感到困惑。当使用这个类来获得加密密钥和初始化向量时,似乎使用了相同的方法。使用Rfc2898DeriveBytes类获取密钥和IV

下面是MSDN blog的一些代码,演示如何获取密钥和初始化向量。

byte[] salt = new byte[] { 0, 1, 2, 3, 4, 5, 6, 7 }; 
Rfc2898DeriveBytes pwdGen = new Rfc2898DeriveBytes("[email protected]$$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)只是随机数,那么在使用正确的密码和盐时又如何获得它们?

回答

4

RFC2898密钥导出算法是确定性的。当你用相同的输入运行它时,你会得到相同的输出。

所以只要你以相同的顺序调用GetBytes(),请求相同数量的字节,你将得到相同的密钥和IV。

不要忘记,在真实的系统中,salt应该在加密时随机生成(并存储以便在解密时可以检索到)。

+0

如果Key和IV来自同一个方法,它们有什么不同?如何知道应该传入多少个字节的参数? – webworm 2011-03-25 15:22:28

+1

@webworm:第一个'GetBytes(16)'调用返回算法输出的字节0到15,第二个'GetBytes(8)'调用返回输出字节16到23。您知道有多少个字节,因为密钥大小和IV大小是由算法,密码模式和实现选择决定的。 – caf 2011-03-26 01:17:16

+0

如果你从随机盐的密码中,或从随机密码中获得IV,并且使用恒定的盐,那么这有什么关系吗? – 2012-01-30 20:31:03

相关问题