2011-06-20 107 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代码...