Прочитав вокруг этого вопроса на этих сообщениях (чтобы назвать, но два) …
Шифрование / дешифрование в vb.net не всегда возвращает одно и то же значение
C # PasswordDeriveBytes Confusion
…Мне было интересно, если бы кто-нибудь знал метод, который Microsoft использует для растягивания их вывода?
Чтобы интегрироваться с системой, написанной на C # кем-то другим, мне нужно сгенерировать большой хэш в PHP. Код, который генерирует их хэш SHA1, генерирует 32-байтовый вывод, а не стандартный 20-байтовый выход SHA1. Так кто-нибудь взломал, как Microsoft заполняет оставшиеся 12 байтов? Я пробовал множество комбинаций добавления SHA1 соли, пароля и т. Д., А также добавления на предыдущих итерациях, но, похоже, ничего не дает вывод Microsoft.
Я немного обеспокоен этим комментарием https://stackoverflow.com/a/13482133/4346051…
«PasswordDeriveBytes использует неизвестный, проприетарный, недетерминированный, сломанный,
криптографически небезопасный метод растяжения ключа для PasswordDeriveBytes «
Пример кода следующим образом …
Код C #, который мне нужно скопировать в PHP, чтобы получить правильный хеш для интеграции со сторонним программным обеспечением:
string sPassword = "iudF98yfh9aRfhanifakdfn0a4ut-a8J789jasdpasd=";
string sSalt = "lYU7m+MDCvVWVQyuLIX3og==";
int iLength = 256 / 8;
byte[] saltInBytes = Encoding.ASCII.GetBytes(sSalt);
PasswordDeriveBytes password = new PasswordDeriveBytes(sPassword, saltInBytes, "SHA1", 2);
byte[] keyBytes = password.GetBytes(iLength);
Console.WriteLine("\nkeyBytes = \n");
foreach (byte value in keyBytes)
{
Console.WriteLine(value);
}
…какие выводы …
0
176
172
127
35
113
212
85
123
19
71
65
23
127
84
165
163
225
80
207
67
125
128
205
188
248
103
52
23
245
111
20
Мой PHP-код для той же функциональности …
$sPassword = "iudF98yfh9aRfhanifakdfn0a4ut-a8J789jasdpasd=";
$sSalt = "lYU7m+MDCvVWVQyuLIX3og==";
$iIterations = 2;
$iLength = 256 / 8;
// combine password with salt
$key = $sPassword.$sSalt;
// perform sha1 how ever many times, using raw binary output instead of hex
for($i = 1; $i <= $iIterations; $i++) {
$key = sha1($key, true);
}
// get the iLength number of chars
$key = substr($key, 0, $iLength);
$aKeyBytes = unpack('C*', $key);
print_r($aKeyBytes);
…и это выводит …
Array
(
[1] => 0
[2] => 176
[3] => 172
[4] => 127
[5] => 35
[6] => 113
[7] => 212
[8] => 85
[9] => 123
[10] => 19
[11] => 71
[12] => 65
[13] => 23
[14] => 127
[15] => 84
[16] => 165
[17] => 163
[18] => 225
[19] => 80
[20] => 207
)
…но, как вы видите, у нас 12 «байтов».
К сожалению, это должно быть воспроизведено — я не могу изменить C #, чтобы использовать лучший метод — я не могу контролировать эту сторону — мой код PHP должен генерировать его
Мне нужно более или менее то же самое — данные, зашифрованные с помощью AES256-CBC
в PHP
что мне нужно было иметь возможность расшифровать с помощью VB
код.
Мне потребовалось некоторое время на поиск в Интернете и тестирование различных примеров кода, но я смог заставить его работать, используя информацию из следующих постов:
С уважением,
Sven
Других решений пока нет …