У меня возникли проблемы с преобразованием следующего кода из Perl в PHP. В частности, у меня возникают проблемы с этим разделом, поскольку я не знаю, что здесь происходит:
sub md5sum($) {
my @ib = unpack("C*", shift);
my $encstr = join("", map {sprintf('\%3.3o', $_)} @ib);
my ($out) = split(/ /, 'printf '$encstr' | md5sum');
return $out;
}
Главное, на что я ищу помощь, - это то, что делает "C*", shift
в инструкции unpack, что происходит в части join
, и что делает | md5sum
| md5sum
делать в конце split
Для этого раздела ниже, я считаю, что у меня также проблемы. Мой главный вопрос здесь для пакета php, указать H32 или просто H?
$hexchal = pack "H32", $challenge;
$newchal = pack "H32", md5sum($hexchal . $uamsecret);
my $passvar = "";
$passvar = md5sum("\0" . $password . $newchal);
Вот что я пробовал для раздела выше, но $ hexchal не совпадают
$hexchal = pack("H32", $challenge);
$newchal = md5($hexchal.$uamsecret);
$passvar = md5("\0".$password.$newchal);
В любом случае, любая помощь будет принята с благодарностью!
Код выглядит немного запутанным для меня, но здесь моя интерпретация:
<1> sub md5sum($) {
<2> my @ib = unpack("C*", shift);
<3> my $encstr = join("", map {sprintf('\%3.3o', $_)} @ib);
<4> my ($out) = split(/ /, 'printf '$encstr' | md5sum');
<5> return $out;
}
"C*", shift
на <2> преобразует строку в массив чисел, который затем объединяется, чтобы сформировать новую строку, выполнив форматирование sprintf на каждом номере. Полученная строка затем используется aparameter при выполнении командной строки printf '$encstring' | md5sum
printf '$encstring' | md5sum
и возврат будет возвращен. Эффективно это возвращается с md5sum (как возвращается командой оболочки).
в качестве примера вызова функции с именем "username" в качестве параметра приведет к построению командной строки как printf '\165\163\145\162\156\141\155\145' | md5sum
printf '\165\163\145\162\156\141\155\145' | md5sum
который дает результат 14c4b06b824ec593239362517f538b29 -
однако, если мы 14c4b06b824ec593239362517f538b29 -
md5sum и просто выполним printf '\165\163\145\162\156\141\155\145'
в оболочке, тогда мы получим исходную строку 'username' вернулся.
Мне кажется, что единственная причина для распаковки, соединения и печати - обеспечить немного больше безопасности, поэтому процессы не содержат исходную строку, если кто-то взломает машину и просмотрит процессы и т.д.
Разделение на пробелы, по-видимому, используется для исключения конечного символа, возвращаемого вызовом командной строки, так что вы получаете только md5sum, разделяя полученную строку из командной строки на 2 значения, но только захватывая первый в возвращаемый скачок $ out переменная.
Я предполагаю, что автор кода не смог использовать модуль CPAN MD5 и поэтому вернулся к использованию команды командной строки md5sum, но хотел обфускать и вызвать вызовы командной строки.
Вы должны иметь возможность заменить всю функцию вызовом функции php md5sum с помощью только строки в качестве параметра (http://php.net/manual/en/function.md5.php)
Очевидно, что у вашего PHP-кода отсутствует вызов pack
. Пытаться:
$hexchal = pack("H32", $challenge);
$newchal = pack("H32", md5($hexchal.$uamsecret));
$passvar = md5("\0".$password.$newchal);
Кроме того, вы можете установить для параметра raw_output
функции PHP md5
значение TRUE
:
$hexchal = pack("H32", $challenge);
$newchal = md5($hexchal.$uamsecret, TRUE);
$passvar = md5("\0".$password.$newchal);
Вы должны использовать "H32"
в PHP, как в Perl. Он сообщает pack
ожидать 16 байт (32 глыбы).
printf '\047\000' | hexdump -C