2015-10-03 6 views
1

У меня возникли проблемы с преобразованием следующего кода из Perl в PHP. В частности, у меня возникают проблемы с этим разделом, так как я понятия не имею, что происходит здесь:Пытается преобразовать 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 делать в распаковке заявлении, что происходит в части join, и что делает | 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); 

Во всяком случае, любая помощь будет принята с благодарностью!

ответ

2

код выглядит немного запутанным для меня, но вот моя интерпретация:

<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, и возврат захватывается и возвращается. Эффективно это возвращается с md5sum (как возвращается командой оболочки).

как пример вызывающей функции с «именем» в качестве параметра приведет к командной строке строится в printf '\165\163\145\162\156\141\155\145' | md5sum, который дает результат 14c4b06b824ec593239362517f538b29 - однако, если мы отбросим водопроводную md5sum и просто выполнить printf '\165\163\145\162\156\141\155\145' в оболочке, то мы получим возвращается исходная строка «имя пользователя».

Он смотрит на меня, как будто единственной причиной для распаковки, и присоединиться к Printf является обеспечить немного более высокий уровень безопасности, так процессы не содержат исходную строку должен кто-нибудь взломать машину и смотреть процессы и т.д.

по-видимому, используется для ommit замыкающего раскола на пробельном - символ, возвращаемый вызов командной строки, так что вы можете получить только md5sum, разделив retruned строки из командной строки в 2 значения, но только захватив первую в возвращаемом $ скалярного переменная.

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

Вы должны быть в состоянии заменить всю функцию с вызовом функции PHP md5sum с просто строкой в ​​качестве параметра (http://php.net/manual/en/function.md5.php)

+1

Re: «Единственная причина для распаковки, соединения и печати - обеспечить немного больше безопасности», Возможно, но я думаю, что это слишком разрешает произвольные строки, включая те, которые включают одинарные кавычки и NUL. 'printf '\ 047 \ 000' | hexdump -C' – ikegami

+0

yes - это имеет смысл - одинарная кавычка будет мусор командной строки - не должна быть проблемой, с которой нужно справиться, переведя php для использования функции md5sum, но предоставляя более вероятную интерпретацию оригинальное намерение Perl-кодера. –

+0

Прошу прощения, я вижу, как это будет сбивать с толку, как это было для меня, когда я впервые смотрел на нее. К счастью, оригинальный кодер оставил комментарии, чтобы объяснить, для чего был md5sum. По-видимому, md5 не работал должным образом в системе (сетевом устройстве), для которой это было первоначально закодировано, поэтому они прибегли к использованию этого метода md5sum. Надеюсь, что это прояснит! – user41593

1

Ваш PHP-код, очевидно, отсутствует вызов pack.Попробуйте:

$hexchal = pack("H32", $challenge); 
$newchal = pack("H32", md5($hexchal.$uamsecret)); 
$passvar = md5("\0".$password.$newchal); 

В качестве альтернативы, вы можете установить параметр md5 функции РНР raw_output к TRUE:

$hexchal = pack("H32", $challenge); 
$newchal = md5($hexchal.$uamsecret, TRUE); 
$passvar = md5("\0".$password.$newchal); 

Вы должны использовать "H32" в PHP, как и в Perl. Он сообщает pack, чтобы ожидать 16 байтов (32 кубика).

+0

Спасибо! Я не могу поверить, что я забыл() не уверен, как я пропустил это, но это было довольно поздно, когда я снова начал заниматься этим. Также благодарим вас за разъяснения по упаковке! – user41593

Смежные вопросы