безопасность — скрипт MD5 в переполнении стека

В качестве упражнения я пытаюсь реализовать MD5 в PHP. Я знаю, что в PHP есть встроенная функция для этого, но я хотел бы прочитать, запустить и изучить рабочий источник. я нашел этот скрипт это прекрасно работает, когда соответствующие разделы не закомментированы (для включения заполнения сообщения) и массивы отформатированы соответствующим образом (для совместимости с моей версией PHP.) Однако созданный хеш — несмотря на правильную длину — не является MD5. Например, хеш MD5 для строки нулевой длины должен быть:

d41d8cd98f00b204e9800998ecf8427e

но хеш, возвращаемый сценарием для того же:

85bd946a585af9fd3fb9eda68707c1d8

Я пробовал другие строки, но нет никакой корреляции. Я изучал MD5, так что имею достаточные знания о том, как он работает. Я допрашивал сценарий, но он кажется законным. Я полагаю, что я кричу другому, чтобы выяснить, почему этот скрипт не возвращает MD5.

1

Решение

Этот скрипт не возвращал подлинные MD5-хэши, потому что возникла проблема с функцией поворота.

В настоящее время PHP не предлагает собственные функции побитового вращения. Тем не менее, битовое вращение может быть достигнуто путем объединения результата левого сдвига и результата правого сдвига. Однако во время сдвигов правых битов на целых числах со знаком со знаком бит знака сдвигается для сохранения знака операнда; это имеет нежелательные последствия и преодолевается с помощью битовой маски.

куда $x является входным значением и $c количество бит для сдвига. Все значения 32-битные.

Оригинальный код:

`return ($x << $c) | ($x >> (32 - $c));`

Новый код:

if($x < 0){
return ($x << $c) | abs( ((pow(2, $c)) * -1) - ($x >> (32 - $c)));
} else {
return ($x << $c) |                            ($x >> (32 - $c)) ;
}

Я намеренно оставил несколько пробелов в строке 4 для сравнения со строкой 2, чтобы показать сходство формул и наличие (или отсутствие) битовой маски.

Троичный отформатированный:

 return ($x < 0) ? (($x << $c) | abs( ((pow(2, $c)) * -1) -
($x >> (32 - $c)))) : (($x << $c) | ($x >> (32 - $c)));
2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]