у меня есть этот код в 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.
delphi по своей природе паскаль, в паскале оператор xor … xor
так твой код:
$xorsum ^= ($last = hash_hmac($algorithm, $last, $password, true));
будет:
last := hash_.....;
xorsum := xorsum xor last;
ОБНОВИТЬ:
last и xorsum являются строками, а php применяет xor к строкам в соответствии со следующим правилом:
Если оба операнда для &, | и операторы ^ являются строками, то
операция будет выполняться над значениями 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;
Других решений пока нет …