将代码从php转换为delphi

时间:2015-04-15 23:25:32

标签: php algorithm delphi

我在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));
    }
}

我想把这段代码移到delphi,到目前为止我做到了

    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,但我不知道如何将此代码转换为Delphi。

1 个答案:

答案 0 :(得分:-1)

delphi本质上是pascal,在pascal中xor运算符是...... xor

所以你的代码:

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

将是:

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

更新:

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

  

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

在delphi中类似的功能就像(没有实际的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;