C#PasswordDeriveBytes混淆

我在C#中有以下代码

PasswordDeriveBytes DerivedPassword = new PasswordDeriveBytes(Password, SaltValueBytes, HashAlgorithm, PasswordIterations); byte[] KeyBytes = DerivedPassword.GetBytes(32); 

我正在使用“SHA1”哈希算法。

根据SHA1定义,它生成160位(20字节)密钥。 我的问题是GetBytes方法如何从DerivedPassword中获取32个字节,GetBytes方法后面使用了什么算法?

微软对原始PKCS#5(又名PBKDF1)的实现包括不安全的扩展,以提供比散列函数所能提供的更多字节(参见此处和此处的错误报告)。

即使它没有错误,你应该避免未经证实的专有标准扩展(或者你将来可能永远无法解密你的数据 – 至少不在Windows之外。)

强烈建议您使用较新的Rfc2898DeriveBytes ,它实现了自.NET 2.0以来可用的PBKDF2(PKCS#5 v2)。

GetBytes方法背后使用什么算法?

它使用算法PBKDF1,稍作修改以允许任意密钥长度。 替换类, Rfc2898DeriveBytes使用PBKDF2。

您可以阅读有关PBKDF2的维基百科文章,以了解基础概念使其发挥作用的一般概念。

密钥派生函数使用称为密钥拉伸的function。 (不要在维基百科上查找它,因为当前的文章将这个概念与Key Enhance混淆,后者完全不同。)

键拉伸通常通过在CTR模式下应用PRF(例如散列函数或密码),或通过迭代它并连接中间输出来完成。

例如,如果使用CTR过程,SHA-1作为PRF,并且需要32字节的伪随机输出,则将SHA1(keymaterial,0)与SHA1的前12个字节(keymaterial,1)连接起来。