Mitsuhirato: VB-Code in PHP umschreiben

Hallo,

ich bin momentan dran ein älteres VB-Skript in PHP umzuschreiben. Leider bringt es nicht das gewünschte Ergebnis und ich vermute es liegt an den xor Operatoren. Der Quelltext ist nicht so schwer zu lesen, aber irgendwie komme ich nicht zu einer vernünftigen Lösung in PHP. Da ich nicht der geborene Programmieren bin hoffe ich hier Hilfe zu finden.
Wie zu erkennen ist, setzt es verschlüsselte Passwörter in Klartext um und umgekehrt. Benötigen tue ich eigentlich nur den Teil der Entschlüsselung.

Der VBQuelltext:
***************************************************************
************** VB
Function CodierenPasswort(PlainText As String, CipherText As String) As Variant
On Error GoTo Fehler
Dim I As Long, Prev As Integer, Result As String
Dim Char As Integer, KeyIndex As Integer
Dim KeyLen As Integer, TextValue As String
Dim NewChar As Integer, fEncrypting As Integer
ReDim KeyChar(255) As Integer

'//'Magic values' used for en/decryption. Change these
Const MAGIC1 = 123
Const MAGIC2 = 4
Const KeyValue = "Verschlüsseltes Passwort"

'//Determine if we're encrypting or decrypting
If Len(PlainText) Then
    fEncrypting = True
    TextValue = PlainText
Else
    TextValue = CipherText
End If

'//Initialize 'previous character' value, index into
'//key string and length of key
Prev = MAGIC1: KeyIndex = 1
KeyLen = Len(KeyValue)

'//Convert key string to array
For I = 1 To Len(KeyValue)
    KeyChar(I) = Asc(Mid(KeyValue, I, 1))
Next I

'//Actual en/decryption loop
For I = 1 To Len(TextValue)
     Char = Asc(Mid(TextValue, I, 1))
     NewChar = Char Xor KeyChar(KeyIndex) Xor Prev Xor ((I / MAGIC2) Mod 255)
     Result = Result & Chr(NewChar)
     If fEncrypting Then
        Prev = Char
     Else
        Prev = NewChar
     End If
     KeyIndex = KeyIndex + 1
     If KeyIndex > KeyLen Then KeyIndex = 1
Next I

'//Return result to caller
If fEncrypting Then
    CipherText = Result
Else
    PlainText = Result
End If
CodierenPasswort = Result
  Exit Function
Fehler:
  Fehlermeldung Err.Number, Err.Description
End Function
************** ENDE VB
***************************************************************

Und das ist meine bisherige Umsetzung in PHP (habe den Verschlüsselungssteil weggelassen):

***************************************************************
****************************** PHP
function codieren($CipherText){
define('magic1',123);
define('magic2',4);
define('KeyValue','Verschlüsseltes Passwort');

$TextValue = $CipherText;

$Prev = magic1;
$KeyIndex = 1;
$KeyLen = strlen(KeyValue);

$pwlength = strlen($TextValue);

for ($j=0; $j < $KeyLen; $j++){
    $KeyChar[$j] = ord(substr(KeyValue, $j, 1));
  }

for ($i=0; $i < $pwlength; $i++){
      $char = ord(substr($TextValue, $i ,1));
      $newchar = $char XOR $KeyChar[$KeyIndex] XOR $Prev XOR bcmod(($i/magic2),255);
      $newchar = chr($newchar);
       $result = $result.$newchar;
       $Prev = $newchar;
       $KeyIndex = $KeyIndex + 1;
         If ($KeyIndex > $KeyLen){
            $KeyIndex = 1;
         }
  }
$PlainText= $result;
echo $PlainText;
}
********* ENDE PHP
***************************************************************

Wäre klasse wenn jemand eine zündende Idee hätte.

Danke und Gruß
Mitsu

  1. Moin!

    ich bin momentan dran ein älteres VB-Skript in PHP umzuschreiben. Leider bringt es nicht das gewünschte Ergebnis und ich vermute es liegt an den xor Operatoren. Der Quelltext ist nicht so schwer zu lesen, aber irgendwie komme ich nicht zu einer vernünftigen Lösung in PHP. Da ich nicht der geborene Programmieren bin hoffe ich hier Hilfe zu finden.
    Wie zu erkennen ist, setzt es verschlüsselte Passwörter in Klartext um und umgekehrt. Benötigen tue ich eigentlich nur den Teil der Entschlüsselung.

    Bei allen Verschlüsselungsalgorithmen ist die binäre XOR-Operation ein sehr zentraler Vorgang.

    Dein Problem scheint darin zu bestehen, in PHP das binäre XOR zu finden. In VB-Script ist es offenbar das Schlüsselwort "XOR", in PHP ist damit aber das logische Exklusiv-Oder gemein.

    Siehe einfach mal hier: http://de2.php.net/manual/de/language.operators.bitwise.php

    Ob außerdem noch Probleme auftreten, habe ich auf die Schnelle nicht geprüft. Könnte sein, dass das nicht dein einziges Problem im neuen Code ist.

    - Sven Rautenberg

    --
    "Love your nation - respect the others."
    1. Moin!

      ..... PHP das binäre XOR zu finden. .....

      • Sven Rautenberg

      Habe deinen Rat befolgt und die entsprechenden binären XOR-Operatoren in PHP eingesetzt. Das Ergebnis ist demnach ein anderes, aber leider immer noch nicht das Richtige. :-(

      Mitsu

      1. Hello,

        Habe deinen Rat befolgt und die entsprechenden binären XOR-Operatoren in PHP eingesetzt. Das Ergebnis ist demnach ein anderes, aber leider immer noch nicht das Richtige. :-(

        hab nur die ersten paar Zeilen überflogen... - dein KeyIndex sollte nicht bei 1 sondern bei 0 loslaufen, ich nehme stark an, das VB-Array ist 1-basiert, während dein PHP-Array standardmäßig 0-basiert ist.

        MfG
        Rouven

        --
        -------------------
        sh:| fo:} ch:? rl:( br:& n4:{ ie:| mo:} va:) js:| de:] zu:| fl:( ss:) ls:& (SelfCode)
        There's no such thing as a free lunch  --  Milton Friedman
        1. Hello,

          ..dein KeyIndex sollte nicht bei 1 sondern bei 0 loslaufen....

          MfG
          Rouven

          Vielen Dank für den Hinweis. So langsam nähert sich das an! Mit dem Rat der bitweisen Operatoren und dem KeyIndex wird der erste verschlüsselte Buchstabe nun richtig entschlüsselt. Alle weitere werden aber noch als Kästchen-Symbol dargestellt. Vielleicht hat jemand noch eine Idee?

          Gruß
          Mitsu

          1. Hello,

            Vielen Dank für den Hinweis. So langsam nähert sich das an! Mit dem Rat der bitweisen Operatoren und dem KeyIndex wird der erste verschlüsselte Buchstabe nun richtig entschlüsselt. Alle weitere werden aber noch als Kästchen-Symbol dargestellt. Vielleicht hat jemand noch eine Idee?

            guck dir nochmal den Teil an, wo Prev belegt wird. Erstens fehlt dir da die Fallunterscheidung (kann es sein, dass du den falschen Ast mitgenommen hast?), zweitens schau nochmal nach, ob im VB-Code dort der ordinale oder Wert oder das Char drauf gespeichert wird, du speicherst glaub ich das Char drauf, was mich wundert, wenn man sich beim nächsten zu verschlüsselnden Zeichen die Mühe macht vorher den nummerischen Wert zu ermitteln...

            MfG
            Rouven

            --
            -------------------
            sh:| fo:} ch:? rl:( br:& n4:{ ie:| mo:} va:) js:| de:] zu:| fl:( ss:) ls:& (SelfCode)
            There's no such thing as a free lunch  --  Milton Friedman
            1. .....ordinale oder Wert oder das Char drauf gespeichert wird,.....

              MfG
              Rouven

              Vielen Dank für die guten Hinweise. Jetzt ist es fast geschafft! Habe die entsprechende Zeile in "$Prev = ord($newchar);" geändert. Jetzt gibt es nur noch ein Problem, jedes dritte Zeichen wird noch verkehrt entschlüsselt. Als Beispiel: Das Passwort caravan wird als casavbn entschlüsselt.

              Danke und Gruß
              Mitsu

              1. Hello,

                Beispiel: Das Passwort caravan wird als casavbn entschlüsselt.

                kann es sein, dass eines deiner Schlüsselworte 3 Zeichen lang ist? Denkst du daran auch beim "Überlaufen" des Zählers am Ende der Schleife wieder auf Index 0 zu gehen statt auf Index 1?

                MfG
                Rouven

                --
                -------------------
                sh:| fo:} ch:? rl:( br:& n4:{ ie:| mo:} va:) js:| de:] zu:| fl:( ss:) ls:& (SelfCode)
                When the only tool you've got is a hammer, all problems start to look like nails.
                1. Nochmal herzlichen Dank an die Helfer. Ich denke ich habe es jetzt hinbekommen. Zumindest sehen die Ergebnisse ok aus ;-)

                  Ciao
                  Mitsu