2012-02-10 80 views
7

我已经在C#C#PasswordDeriveBytes混乱

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

我使用 “SHA1” 散列算法下面的代码。

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

回答

11

微软的落实原有PKCS#5(又名PBKDF1)包括不安全扩展来提供比散列函数更多的字节可以提供(见bug报告herehere)。

即使它不是越野车,你应该避免无证,专有技术扩展标准(或者你可能永远无法解密你的数据在未来的 - 至少不是外部Windows)

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

4

在GetBytes方法后面使用了什么算法?

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

您可以阅读Wikipedia Article on PBKDF2以了解底层概念是如何实现这项工作的一般概念。

+0

该方法如何从20个字节(其中'SHA1'哈希算法生成)派生32个字节。 – Siddiqui 2012-02-10 17:17:37

+0

@Siddiqui @'HenrickHellstrom很好地解释了它。 – vcsjones 2012-02-10 19:56:06

4

密钥导出函数使用称为密钥伸展的功能。 (不要打扰维基百科上查找,因为当前文章混淆了关键加强的概念,这是完全不同的。)

通常通过应用PRF(如散列函数或密码)在CTR模式下,或迭代它并连接中间输出。例如,如果使用CTR过程,SHA-1作为PRF,并且需要32个字节的伪随机输出,则将SHA1(keymaterial,0)与SHA1(keymaterial,1)的前12个字节连接起来。

+0

感谢您的回放,您能否多给我一点关于CTR程序的解释。 – Siddiqui 2012-02-11 10:19:58

+1

在这种情况下,数字0和1可以用一个位来表示(记住SHA-1对位串进行操作作为输入),但通常(keymaterial,0)等被定义为例如。 (a)在末尾附加单个字节(或字)0的关键材料,或(b)首先具有keymaterial的完整64字节输入块,一些填充(通常为零的字节)和一个值为0的单个字节结束。 – 2012-02-11 10:28:50