2011-06-20 161 views
0

我有一個Visual Basic函數,我不熟悉VB。我需要將其轉換爲PHP並開始了。有幾個函數我不知道如何複製,我正在尋找一些幫助,看看我是否有嵌套的權利等等。在下面的代碼中,有vb函數,然後我嘗試te PHP版本。它不完整,在PHP版本中我已經評論了我不確定的vb部分。任何人都可以幫助我把正確的路線?將Visual Basic函數轉換爲PHP

Public Function gfnCrypt(ByVal Expression As String, ByVal Password As String) As String 
    'RC4 Encryption 
    Dim rb(0 To 255) As Integer, X As Long, Y As Long, Z As Long, Key() As Byte, ByteArray() As Byte, temp As Byte 
    On Error Resume Next 
    If Len(Password) = 0 Then 
    Exit Function 
    End If 
    If Len(Expression) = 0 Then 
    Exit Function 
    End If 
    If Len(Password) > 256 Then 
    Key() = StrConv(Left$(Password, 256), vbFromUnicode) 
    Else 
    Key() = StrConv(Password, vbFromUnicode) 
    End If 
    For X = 0 To 255 
    rb(X) = X 
    Next X 
    X = 0 
    Y = 0 
    Z = 0 
    For X = 0 To 255 
    Y = (Y + rb(X) + Key(X Mod Len(Password))) Mod 256 
    temp = rb(X) 
    rb(X) = rb(Y) 
    rb(Y) = temp 
    Next X 
    X = 0 
    Y = 0 
    Z = 0 
    ByteArray() = StrConv(Expression, vbFromUnicode) 
    For X = 0 To Len(Expression) 
    Y = (Y + 1) Mod 256 
    Z = (Z + rb(Y)) Mod 256 
    temp = rb(Y) 
    rb(Y) = rb(Z) 
    rb(Z) = temp 
    ByteArray(X) = ByteArray(X) Xor (rb((rb(Y) + rb(Z)) Mod 256)) 
    Next X 
    gfnCrypt = StrConv(ByteArray, vbUnicode) 
End Function 

而在PHP:

function gfnCrypt($mywebpassword, $mywebkey) { 
    //'RC4 Encryption 
    //Dim rb(0 To 255) As Integer, X As Long, Y As Long, Z As Long, Key() As Byte, ByteArray() As Byte, temp As Byte 
    if(strlen($mywebpassword) == 0){ 
    return false; 
    } 
    if(strlen($mywebkey) == 0){ 
    return false; 
    } 
    if(strlen($mywebpassword) > 256){ 
    //Key() = StrConv(Left$(Password, 256), vbFromUnicode) 
    }else{ 
    //Key() = StrConv(Password, vbFromUnicode) 
    } 
    $rb=array(); 
    for($x=0;$x=255;$x++){ 
    $rb['x'] = $x; 
    for($x=0;$x=255;$x++){ 
    $y = ($y + $rb['x'];// + Key(X Mod Len(Password))) Mod 256 
    $temp = $rb['x']; 
    $rb['x'] = $rb[$y]; 
    $rb[$y] = $temp; 
    //ByteArray() = StrConv(Expression, vbFromUnicode) 
     for($x=0;$x=strlen($mywebpassword), $x++){ 
     $y = ($y + 1);// Mod 256 
     $z = ($z + $rb[$y]);// Mod 256 
     $temp = $rb[$y]; 
     $rb[$y] = $rb[$z]; 
     $rb[$z] = $temp; 
     //ByteArray(X) = ByteArray(X) Xor (rb((rb(Y) + rb(Z)) Mod 256)) 
     } 
    } 
    } 
    //gfnCrypt = StrConv(ByteArray, vbUnicode) 
    return $gfnCrypt; 
} 
+0

請正確格式化您的代碼。 – BRampersad

+1

看到幫助如何發佈代碼.. –

+0

對不起,我不知道添加代碼格式的能力。 – Sphere

回答

2
  • 算術模可用於php,使用%算子。

$modulus = $a % $b

  • 我想你會得到你的3個嵌入式for (x…)循環的方式錯誤。

  • 要訪問陣列(該$i第例如)的一個元素不使用$array['i']$array[$i]

  • StrConv必須是ut8_encodeleft東西可以用substr($string, 0, 255)完成。

參考文獻:utf8_encodesubstr

+0

謝謝。我特別關注這行: – Sphere

+0

[code] Key()= StrConv(Left $(Password,256),vbFromUnicode) – Sphere

+0

我知道它有樹嵌套循環而不是三個並行那些? – Sphere

1

如果你正在嘗試做在PHP中RC4加密,那麼你可能wan't來看一看這個項目在這個環節http://code.google.com/p/rc4crypt/

+2

這不是一個答案,你應該刪除它並添加它作爲評論。 – meagar

+1

我認爲不應該刪除這個答案。 – diagonalbatman

+2

我提高了它;如果diagonbatman確實是正確的,並且OP正在嘗試進行RC4加密,那麼這是一個有效的答案。很多時候,最好的答案並不是一個問題直接提出的問題,而是他真正需要的。 – Evert

1

我真的希望你有一些單元測試來測試:

function gfnCrypt($mywebpassword, $mywebkey) { 
    //'RC4 Encryption 
    //Dim rb(0 To 255) As Integer, X As Long, Y As Long, Z As Long, Key() As Byte, ByteArray() As Byte, temp As Byte 
    rb = array(); 
    Key = array(); 
    ByteArray = array(); 
    if(strlen($mywebpassword) == 0){ 
    return false; 
    } 
    if(strlen($mywebkey) == 0){ 
    return false; 
    } 
    if(strlen($mywebpassword) > 256){ 
    //Key() = StrConv(Left$(Password, 256), vbFromUnicode) 
    Key[] = ut8_encodesubstr(Password, 0, 256)); 
    }else{ 
    //Key() = StrConv(Password, vbFromUnicode) 
    Key[] = ut8_encode(Password); 
    } 
    $rb=array(); 
    for($x=0;$x=255;$x++){ 
    $rb['x'] = $x; 
    for($x=0;$x=255;$x++){ 
    $y = ($y + $rb['x'] + Key(X % strlen(Password))) % 256; 
    $temp = $rb['x']; 
    $rb['x'] = $rb[$y]; 
    $rb[$y] = $temp; 
    //ByteArray() = StrConv(Expression, vbFromUnicode) 
    ByteArray[] = ut8_encode(Expression); 
     for($x=0;$x=strlen($mywebpassword), $x++){ 
     $y = ($y + 1);// Mod 256 
     $z = ($z + $rb[$y]);// Mod 256 
     $temp = $rb[$y]; 
     $rb[$y] = $rb[$z]; 
     $rb[$z] = $temp; 
     //ByteArray(X) = ByteArray(X) Xor (rb((rb(Y) + rb(Z)) Mod 256)) 
     ByteArray[X] = (ByteArray[X] ^= (rb[(rb[Y] + rb[Z]] % 256)]); 
     } 
    } 
    } 
    //gfnCrypt = StrConv(ByteArray, vbUnicode) 
    gfnCrypt = ut8_encode(ByteArray); 
    return $gfnCrypt; 
} 

我完成你開始的代碼,但似乎真的錯了(例如,爲什麼要嵌套3 for循環,使用相同的變量?)。它似乎甚至不符合最初的VB代碼...