我在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。
答案 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;