Преобразование функции Visual Basic в PHP - PullRequest
0 голосов
/ 20 июня 2011

У меня есть функция Visual Basic, и я не очень знаком с VB.Мне нужно преобразовать его в PHP и начал.Есть несколько функций, которые я не знаю, как реплицировать, и ищу некоторую помощь с этим и посмотреть, правильно ли я вложил и т.д. В следующем коде есть функция vb, а затем моя попытка teверсия php.это не полный и в версии php я закомментировал части VB, в которых я не уверен.Может кто-нибудь помочь поставить меня на правильные строки?

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;
}

Ответы [ 3 ]

2 голосов
/ 20 июня 2011
  • Арифметика по модулю может быть использована в php с использованием оператора %.

$modulus = $a % $b

  • Я думаю, вы получите ошибки с 3 встроенными циклами for (x…).

  • Для доступа к элементу массива (например, $i) не используйте $array['i'], но $array[$i].

  • StrConv должно быть ut8_encode, а left можно выполнить с помощью substr($string, 0, 255).

Ссылки: utf8_encode substr

1 голос
/ 21 июня 2011

Я действительно надеюсь, что у вас есть несколько модульных тестов, чтобы проверить, что:

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;
}

Я закончил код, который вы запустили, но он кажется действительно неправильным (например, почему nest 3 для циклов, используя ту же переменную?).Кажется, он даже не соответствует исходному коду VB ...

1 голос
/ 20 июня 2011

Если вы пытаетесь выполнить шифрование RC4 в PHP, вы можете не взглянуть на проект по этой ссылке http://code.google.com/p/rc4crypt/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...