我在C#中有以下代码
PasswordDeriveBytes DerivedPassword = new PasswordDeriveBytes(Password, SaltValueBytes, HashAlgorithm, PasswordIterations);
byte[] KeyBytes = DerivedPassword.GetBytes(32);
我正在使用“SHA1”哈希算法。
根据SHA1定义,它生成160位(20字节)密钥。我的问题是GetBytes方法如何从DerivedPassword中获取32个字节,GetBytes方法后面使用了什么算法?
答案 0 :(得分:11)
Microsoft对原始PKCS#5(又名PBKDF1)的实现包括不安全扩展,以提供比散列函数提供的更多字节(请参阅错误报告here和here)
即使它没有错误,你也应该避免对标准进行无证的专有扩展(或者你将来可能永远无法解密数据 - 至少不能在Windows之外解密。)
我强烈建议您使用较新的Rfc2898DeriveBytes
,它实现自.NET 2.0以来可用的PBKDF2(PKCS#5 v2)。
答案 1 :(得分:5)
GetBytes方法背后使用了什么算法?
它使用算法PBKDF1,稍作修改以允许任意密钥长度。替换类Rfc2898DeriveBytes
使用PBKDF2。
您可以阅读Wikipedia Article on PBKDF2,了解基本概念是如何发挥作用的。
答案 2 :(得分:4)
密钥派生函数使用名为密钥拉伸的功能。 (不要在维基百科上查找它,因为当前的文章将这个概念与Key Enhance混淆了,这是完全不同的。)
键拉伸通常通过在CTR模式下应用PRF(例如散列函数或密码),或通过迭代它并连接中间输出来完成。
例如,如果使用CTR过程,SHA-1作为PRF,并且需要32字节的伪随机输出,则将SHA1(keymaterial,0)与SHA1的前12个字节(keymaterial,1)连接起来。 / p>