2015-04-15 169 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?」 –