Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
尝试将Perl转换为PHP_Php_Perl_Md5_Pack - Fatal编程技术网

尝试将Perl转换为PHP

尝试将Perl转换为PHP,php,perl,md5,pack,Php,Perl,Md5,Pack,我无法将以下代码从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

我无法将以下代码从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
拆分
结束时做了什么

对于下面的这一部分,我相信我也遇到了问题。我这里的主要问题是关于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;
    }
子md5sum($){
my@ib=解包(“C*”,班次);
my$encstr=join(“,map{sprintf('\%3.3o',$\}@ib);
my($out)=拆分(//,`printf'$encstr'| md5sum`);
退回$out;
}
上的
“C*”,shift
将字符串转换为一个数字数组,然后通过对每个数字进行sprintf格式化,将该数组连接在一起形成一个新字符串。然后,在执行命令行
printf'$encstring'| md5sum
时,将生成的字符串用作参数,并捕获并返回返回值。实际上,这将与md5sum一起返回(由shell命令返回)

例如,以“username”作为参数调用函数将导致命令行被构造为
printf'\165\163\145\162\156\141\155\145'|md5sum
,这将给出
14c4B06824ec593239362517f538b29-
的结果,但是如果我们丢弃管道md5sum并只执行
printf>“\165\163\145\162\156\141\155\145”
在shell中,然后返回“username”的原始字符串

在我看来,解包、连接和printf的唯一原因似乎是为了提供更多的安全性,以便在有人入侵机器并监视进程等时,进程不包含原始字符串

空格上的split似乎用于ommit命令行调用返回的尾随字符,这样您只能通过将重新运行的字符串从命令行拆分为2个值,但只将第一个值捕获到返回的$out标量变量中来获取md5sum

我假设代码的作者无法使用CPANMD5模块,因此转而使用命令行md5sum命令,但希望混淆和命令行调用


您应该能够使用php md5sum函数调用替换整个函数,该函数调用仅使用字符串作为参数()

您的php代码显然缺少对
pack
的调用。尝试:

$hexchal = pack("H32", $challenge);
$newchal = pack("H32", md5($hexchal.$uamsecret));
$passvar = md5("\0".$password.$newchal);
或者,您可以将PHP的
md5
函数的
raw\u输出
参数设置为
TRUE

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

您应该像在Perl中一样在PHP中使用
“H32”
。它告诉
pack
需要16个字节(32个半字节)。

Re“解包、连接和打印的唯一原因是提供多一点安全性”,也许吧,但我认为它太允许任意字符串,包括包含单引号和NUL的字符串
printf'\047\000'| hextump-C
yes-这很有意义-单引号会破坏命令行-不应该是需要通过将php转换为使用md5sum函数来处理的问题,但它提供了对perl编码器的原意的更可能的解释。我很抱歉,我知道这会让人困惑,就像我第一次看到它时一样。幸运的是,最初的编码人员留下了注释,解释了md5sum的用途。显然,md5在最初为其编码的系统(网络设备)上无法正常工作,因此他们转而使用md5sum方法。希望能把事情弄清楚!这是否回答了您的问题?如果回答了,请在方框内打勾:^)谢谢!我不敢相信我漏掉了()不知道我是怎么漏掉的,只是当我再次开始玩这个的时候已经很晚了。也感谢您对包装的澄清!