【发布时间】:2009-11-24 21:52:32
【问题描述】:
我的任务是将某人用 perl 制作的 crypt 函数转换为 php 代码。一切正常,除了这个:
Perl:
$wert = Encode::encode( "utf8", $wert );
$len=length $wert;
$pad = ($len % 16)?"0".chr(16 - ($len % 16)):"10";
$fuell = pack( "H*", $pad x (16 - $len % 16));
PHP:
$wert = utf8_encode($wert);
$len = mb_strlen($wert);
$pad = ( $len%16 ) ? '0'.chr(16 - ($len%16)) : '10';
$fuell = pack("H*", str_repeat($pad, (16 - $len % 16)));
php 版本适用于某些字符串。但是当我有类似 '2010-01-01T00:00:00.000' 的东西时,perl 版本可以正常工作,并且 php 版本会打印“PHP Warning: pack(): Type H: invalid hex digit”。
如果有人能发现 php 版本中的错误,我将不胜感激。
编辑:
这是我要转换成 php.ini 的完整函数。它是由一家不再为我们工作的公司的程序员制作的,所以我真的不知道最初的意图是什么。
sub crypt
{
my $self = shift;
my ($wert,$pw)= @_;
$wert = Encode::encode( "utf8", $wert );
$pw = Encode::encode( "utf8", $pw );
$len=length $wert;
$pad = ($len % 16)?"0".chr(16 - ($len % 16)):"10";
$fuell = pack( "H*", $pad x (16 - $len % 16));
$wert=$wert.$fuell;
$lenpw=length $pw;
$fuell = ($lenpw % 16)? pack ("H*", "00" x (16 - $lenpw % 16)):"";
$pw=$pw.$fuell;
$cipher = new Crypt::Rijndael $pw, Crypt::Rijndael::MODE_CBC;
$cipher->set_iv($pw);
$crypted = encode_base64($cipher->encrypt($wert),"");
return $crypted;
}
【问题讨论】:
-
添加一些打印语句——
$value和$pad在每个版本中的值是多少?