在Silverlight中实现PasswordDeriveBytes

时间:2011-11-22 20:02:08

标签: silverlight encryption sha1

我正在尝试在Silverlight中读取一些加密数据,使用PasswordDeriveBytes使用旧版.NET应用程序对其进行加密以生成密钥。我知道我们现在应该使用Rfc2898DeriveBytes,但是现有的应用程序部署在2000多个位置并且在所有这些地方更改数据的加密只是为了实现UI的Silverlight版本不会在这个时候是可行的。

我已经尝试实现我自己的PasswordDeriveBytes.GetBytes(int byteCount)版本,但是虽然我可以轻松获得前20个字节(使用SHA1哈希),但我无法弄清楚下一组字节是如何计算的(I需要生成一个32字节的密码)。根据我所读到的,微软正在使用PBKDF1的“扩展”来计算密钥,但我没有找到任何有关该扩展可能的信息。

我尝试从Mono项目的PasswordDeriveBytes实现移植代码,以及我在Web上的其他几个地方找到的代码,但是它们都返回了与原始.NET类完全不同的密码(即使对于前20个字节)。

这是GetBytes()的版本,返回正确的前20个字节,但我不知道如何计算下一个字节块(或任何后续块)。这是简化的代码,没有错误处理,但我认为它清楚地显示了我如何生成我的第一个再见块。

public byte[] GetBytes(int byteCount)
{
    byte[] result = new byte[byteCount];

    byte[] pwd = Encoding.UTF8.GetBytes(_PassPhrase);
    byte[] salt = Encoding.UTF8.GetBytes(_Salt);

    byte[] pwdAndSalt = new byte[pwd.Length + salt.Length];
    pwd.CopyTo(pwdAndSalt, 0);
    salt.CopyTo(pwdAndSalt, pwd.Length);

    byte[] hash = _Sha1.ComputeHash(pwdAndSalt);
    for (int i = 1; i < _Iterations; i++)
    {
        hash = _Sha1.ComputeHash(hash);
    }

    hash.CopyTo(result, 0);

    return result;
}

任何人都知道如何在Silverlight中正确实现PasswordDeriveBytes以生成与常规.NET版本相同的密钥?我将非常感激。

由于

0 个答案:

没有答案