2015-04-15 165 views
-2

我在PHP转换代码德尔福

function wa_pbkdf2($algorithm, $password, $salt, $count, $key_length, $raw_output = false) 
{ 
    $algorithm = strtolower($algorithm); 
    if (! in_array($algorithm, hash_algos(), true)) { 
     die('PBKDF2 ERROR: Invalid hash algorithm.'); 
    } 
    if ($count <= 0 || $key_length <= 0) { 
     die('PBKDF2 ERROR: Invalid parameters.'); 
    } 
    $hash_length = strlen(hash($algorithm, "", true)); 
    $block_count = ceil($key_length/$hash_length); 
    $output = ""; 
    for ($i = 1; $i <= $block_count; $i++) { 
     $last = $salt . pack("N", $i); 
     $last = $xorsum = hash_hmac($algorithm, $last, $password, true); 
     for ($j = 1; $j < $count; $j++) { 
      $xorsum ^= ($last = hash_hmac($algorithm, $last, $password, true)); 
     } 
     $output .= $xorsum; 
    } 
    if ($raw_output) { 
     return substr($output, 0, $key_length); 
    } else { 
     return bin2hex(substr($output, 0, $key_length)); 
    } 
} 

此代码,我想搬到这个代码德尔福,我做到了,到目前为止

function wa_pbkdf2(password,salt:ansistring;count,keylength:integer;outputraw:boolean=false):ansistring; 
var 
    hashlength:integer; 
    blockcount:integer; 
    last:ansistring; 
    xorsum:ansistring; 
    I: Integer; 
    j: Integer; 
begin 
    hashlength:=Length(THMACUtils<TIdHMACSHA1>.HMAC('','')); 
    if frac(keylength/hashlength)>0.5 then //VOLTAAQUI 
    blockcount:=round(keylength/hashlength) 
    else 
    blockcount:=Round(keylength/hashlength)+1; 
    for I := 1 to blockcount do 
    begin 
    last:=salt+ReturnINT32(i); 
    xorsum:=StringOf(THMACUtils<TIdHMACSHA1>.HMAC(password,last)); 
    last:=xorsum; 
    res:=last; 
    for j := 1 to count-1 do 
    begin 

    end; 
end; 
end; 

我怎样才能做到这一点。

我的问题是在这里

$xorsum ^= ($last = hash_hmac($algorithm, $last, $password, true)); 

我知道^= is XOR,但我不知道如何将这个代码转换为德尔福。

+1

请停止使用AnsiString类型来保存二进制数据。字符串用于文本。使用一个字节数组。 –

回答

-1

德尔福在本质上是帕斯卡,帕斯卡XOR运算符是... xor

因此您的代码:

$xorsum ^= ($last = hash_hmac($algorithm, $last, $password, true)); 

将是:

last := hash_.....; 
xorsum := xorsum xor last; 

UPDATE:

last和xorsum是字符串,php根据以下规则在字符串上应用xor:

如果两个操作数都为&,和^运算符是字符串,则将对 组成字符串的字符的ASCII值执行 操作,结果将为字符串。在所有其他 的情况下,两个操作数都将转换为整数,结果将为 为整数。在delphi

类似的功能将是这样(没有实际德尔福写作,可能错别字):

function xorstring(a,b:ansistring;):ansistring; 
begin 
    for I := 1 to a.length do 
     result[i] = chr(ord(a[i]) xor ord(b[i])); 
end 

UPDATE2:

function xorstring(a,b:ansistring):ansistring; 
var 
i:integer; 
begin 
    setlength(result,length(a)); 
    for I := 1 to length(a) do 
     result[i] := ansichar(ord(a[i]) xor ord(b[i])); 
end; 
+0

但xorsum和最后是字符串变量,我不知道如何异或字符串。 –

+0

@CaioSouzaAndrade xor sum和last不是字符串,它们是php中的数字,请检查'$ last = $ xorsum = hash_hmac($ algorithm,$ last,$ password,true);' - 这里是他们转换为数字 –

+0

,但是当我做的var_dump($最后)在PHP中,我得到这个结果:string(20)“ _ 14 ! /@ L?” –