Problem mit XOR function

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Problem mit XOR function

    Moin ich habe ein Problem mit meiner XOR- Funktion

    Die $text sieht wie folgt aus:
    0011000001011000010101000011011001010000001100000011001000100000001011000100110001011110001001010101 111101010110001000000101011
    Die $passwort so:
    0100001100110001001100100101011100110100010000100100010101010010010101000011100100110101001101000100 001100110001001100100101011

    Leider ist das Ergebnis ( $encoded ) komischerweise immer $text

    PHP-Code:

    function X_Eor($string$key)
    {
      for(
    $i=0$i<strlen($string); $i++)
     {
        for(
    $j=0$j<strlen($key); $j++)
        {
          
    $string[$i] = $string[$i]^$key[$j];
        }
      }


    return 
    $string;
     
    }
    $encoded X_Eor($text$passwort);

    echo 
    $encoded
    Eigentlich müsste die Werte Tabelle ja so aussehen:

    0 0 = 0
    0 1 = 1
    1 0 = 1
    1 1 = 0

    Wo mache ich mein Denkfehler?

    Wäre echt nett wenn jemand rat weiss

    Danke

    Euer

    WW

  • #2
    $encoded = $text ^ $passwort;

    Kommentar


    • #3
      hmmmm

      Wenn ich das so mache bekomme ich gar keine Ausgabe mehr, bzw...
      nur noch solche Rechtecke.



      WW

      Kommentar


      • #4
        huhus..

        dein selbstgecodetes xor tauscht gaaaaaanz oft nämlich strlen($key) mal und überhaupt ganz schön durcheinander... weil du mit den verschachtelten schleifen genau strlen($string) mal die gesamte ersetzung durchläufst...

        $text ^ $passwort; muss auch fehlschlagen, da dort die 1 und 0 als zeichen interpretiert werden und schon alleine geweils 1 oder zwei byte (je nach zeichensatz) also 8 oder 16 bit lang sind... insofern bekommst du zeichensalat.. das ist zwar intern völlig korrekt und lässt sich mit einem weiteren xor und gleichem key auch wiedr decodieren, nur ist das ergebnis natürlich nicht lesbar, weil der zeichensatz n bischen größer ist als nur 1 und 0 ....

        mein vorschlag wäre folgender:

        PHP-Code:

        function X_Eor($string$key)
        {
          for(
        $i=0$i<strlen($string); $i++)
         {

              
        $string[$i] = ( $string[$i] + $key[$i] ) % 2;
              
        //evtl geht hier auch $string[$i] = $string[$i] ^ $key[$i]; ... müsste man ausprobieren

          
        }


        return 
        $string;
         

        liefert demnach

        (0 + 0) % 2 = 0
        (1 + 0) % 2 = 1
        (0 + 1) % 2 = 1
        (1 + 1) % 2 = 0

        denzufolge korrektes entweder oder

        randbedingungen: key ist mindestens so lang wie string...

        falls key kürzer sein darf, muss $key vorher noch verlängert werden, etwa so:

        PHP-Code:
        while (strlen($key)<strlen($string)) $key.=$key
        dann sollte es laufen...

        greetz, high
        Zuletzt geändert von highrise; 04.12.2006, 07:01.
        Good programming is 40% experience, 20% skill, 20% RTFM, 15% caffeine, and 5% attention to detail.
        When everything else fails, manipulate the data...
        Beschriftungen / Großformatdruck / Werbemittel

        Kommentar


        • #5
          PHP-Code:
          <?php
          error_reporting
          (E_ALL);

          class 
          XorFilter{
             private 
          $key_;
             private 
          $key_max_index_;
             public function 
          __construct($key){
                
          $this->key_ $key;
                
          $this->key_max_index_ strlen($key) - 1;
             }
             public function 
          work($inp){
                
          $key_index 0;
                
          $out '';
                for(
          $inp_index 0;$inp_index strlen($inp);$inp_index++){
                   
          $key_index = ($key_index $this->key_max_index_) ? $key_index;
                   
          $out .= chr(ord($inp{$inp_index})^ord($this->key_{$key_index++}));
                }
                return 
          $out;
             }
          }

          $the_key "mysecret";
          $the_text "Hello this is useless text.";

          $filter = new XorFilter($the_key);

          $cipher $filter->work($the_text);
          $plain $filter->work($cipher);

          echo 
          "cipher: $cipher \n plain: $plain";
          if(
          $plain == $the_text){
            echo 
          "\nja";
          }else{
            echo 
          "\nnein";
          }
          Schnell runter gehackt.
          Der php-operator ^ für bitwise xor sollte schneller sein wenn der
          interpreter es direkt in c-xor und damit in den opcode xor umsetzt.

          greets
          (((call/cc call/cc) (lambda (x) x)) "Scheme just rocks! and Ruby is magic!")

          Kommentar


          • #6
            Garantiert noch schneller runtergehackt:
            PHP-Code:
            decimal: <?php echo 12 10?><br />
            binary string: <?php echo bindec('1100') ^ bindec('1010'); ?>

            Kommentar


            • #7
              Ich danke euch. Hat einwandfrei geklappt.

              Sorry für die späte Antwort, musste mich in der Schule rumquälen

              Kommentar

              Lädt...
              X