Я пытаюсь прочитать некоторые зашифрованные данные в Silverlight, которые были зашифрованы с использованием устаревшего приложения .NET с использованием PasswordDeriveBytes
для генерации ключа.Я знаю, что в настоящее время мы должны использовать Rfc2898DeriveBytes
, но существующее приложение развернуто в более чем 2000 местах, и изменение шифрования данных во всех этих местах просто для реализации версии пользовательского интерфейса Silverlight будет неосуществимым.в настоящее время.
Я пытался реализовать свою собственную версию PasswordDeriveBytes.GetBytes(int byteCount)
, но хотя я могу легко получить первые 20 байтов (используя хэширование SHA1), я не могу понять, как следующий наборбайт рассчитывается (мне нужно сгенерировать 32-байтовый пароль).Согласно тому, что я прочитал, Microsoft использует «расширение» PBKDF1 для вычисления ключа, но я не нашел никакой информации о том, каким может быть это расширение.
Я пробовал переносить код изРеализация PasswordDeriveBytes
проекта Mono и кода, который я нашел в нескольких других местах в Интернете, но все они возвращают совершенно другой пароль, чем исходный класс .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;
}
У любого есть идея, как правильно реализовать PasswordDeriveBytes
в Silverlight, чтобы генерировать идентичные ключи какобычная версия .NET?Буду очень признателен.
Спасибо