Problem beim entschlüsseln mit mcrypt (MCRYPT_RIJNDAEL_128)

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

  • Problem beim entschlüsseln mit mcrypt (MCRYPT_RIJNDAEL_128)

    Hi,

    ich versuche in PHP die Funktion eines Python-Scripts nachzubauen zum entschlüsseln von Rapidshare-Links aus .rsdf Dateien. Soweit ich herausfinden konnte sind die Links darin wie folgt verschlüsselt:

    1.) Der IV wird mit AES 128, Mode ECB verschlüsselt
    2.) Link wird mit AES 128 Mode CFB (also Key + IV) verschlüsselt
    3.) Das Ergebnis wird Base64-Encoded
    4.) Das Ergebnis wird in HEX umgewandelt
    5.) Das Ergebnis wird in die Datei geschrieben

    Das Python-Script entschlüsselt die Links auch sauber. Mein PHP-Nachbau jedoch entschlüsselt leider immer nur den 1. Link der Datei sauber. Bei allen folgenden Links ist der Anfang nur wirres Zeugs. Ich hab schon MD5-Checksums über jeden String gelegt um die Fehlerquelle zu finden, aber ohne Erfolg. Hoffe mir kann da wer von euch weiterhelfen, wo bei mir der Fehler liegt.

    [edit] links entfernt, Quellcode steht in den Posts weiter unten

    besten Dank für euere Vorschläge!
    Zuletzt geändert von zzaphod; 25.06.2008, 03:37.

  • #2
    Könntest du bitte die entsprechenden Stellen hier posten. Hat sicher keiner Lust das alles durchzusehen. Sachdienliche Hinweise wäre natürlich auch gerne gesehen.

    Kommentar


    • #3
      kann ich natürlich auch machen Wie man sehen kann entschlüsselt das Python Script auch den 2. Datensatz noch sauber, während das PHP-Script dabei schon patzt. Die MD5 des Strings ist nur bis nach dem base64dec identisch.

      hier der PHP-Code

      PHP-Code:
      <?php

          
      function hex2str($hexstr) {
                
              
      $hexstr str_replace(' '''$hexstr);
                
      $retstr pack('H*'$hexstr);
                return 
      $retstr;
          }

          
          
      $iv_hex  "FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF";
          
      $key_hex "8C 35 19 2D 96 4D C3 18 2C 6F 84 F3 25 22 39 EB 4A 32 0D 25 00 00 00 00";
          
          
      $iv hex2str($iv_hex);
          
      $key hex2str($key_hex);
          
      $iv2 mcrypt_encrypt(MCRYPT_RIJNDAEL_128$key$ivMCRYPT_MODE_ECB"0000000000000000");

          echo 
      "IV2:" $iv2 "\n";
          echo 
      "MD5:" md5($iv2) . "\n-----\n\n";
          
          
      $data file_get_contents('test.rsdf');
          
      $data hex2str($data);
          echo 
      "raw data:\n" $data ."\n-----\n\n";
          
          
      $links explode("\r\n"$data);

          foreach (
      $links as $link){
              if (
      strlen($link)!=0){
                  echo 
      "rawdata   :" strlen($link) ." chars :"$link."\n";
                  echo 
      "MD5:" md5($link) . "\n";
                  
      $test base64_decode($link);
                  echo 
      "base64dec :" strlen($test) ." chars :" .$test."\n";
                  echo 
      "MD5:" md5($test) . "\n";
                  
      $dec mcrypt_decrypt(MCRYPT_RIJNDAEL_128$key$testMCRYPT_MODE_CFB$iv2);
                  echo 
      "decrypted :" strlen($dec) . " chars :" .$dec."\n";
                  echo 
      "MD5:" md5($dec) . "\n-----\n\n";
              }
          }

      ?>

      und (ein Teil) dessen Ausgabe:

      Code:
      rawdata   :92 chars :imlVf7HadQ70zlFlQno/ssi7aJalsNLvX0cgQ4Y0TNT22NneRZqcxnVSpt7xIxBG8GJnhTDXEnWXBKOMGw3fUJrC1lI=
      MD5:fb28756f2926307d10eceeaaad9db527
      base64dec :68 chars :ŠiU±ÚuôÎQeBz?²È»h–¥°Òï_G C†4LÔöØÙÞEšœÆuR¦Þñ#Fðbg…0×u—£Œ
      ßPšÂÖR
      MD5:5789ea973ebca235a75938fba6b12ff5
      decrypted :68 chars :CCF: [url]http://rapidshare.com/files/123789636/bankjob_md_trg.part01.rar[/url]
      MD5:fa192c8a6c3745e03ddd96464658f7a1
      -----
      
      rawdata   :92 chars :cs1sq8/NuARoexXaQs/WrShakUmd4cPyvJV+WhxEii9BG6zfZFhmj40BgY2L/jFbid3Ulm45vybvOEbgqMxMKvG/tAM=
      MD5:7cf321bf65bec2ff57d661fccb65d2aa
      base64dec :68 chars :rÍl«Ï͸h{ÚBÏÖ_(Z‘IáÃò¼•~ZDŠ/A¬ßdXf‹þ1[‰ÝÔ–n9¿&ï8Fà¨ÌL*ñ¿´
      MD5:507c564b7b17d80a71808e6a1b4953f8
      decrypted :68 chars :»ØbiJ¤È#§Oö&Ìdshare.com/files/123789720/bankjob_md_trg.part02.rar
      MD5:6d20d1c0b46061a606a94c2fb1a3df8c
      -----
      hier das Python-Original (was einwandfrei funktioniert):
      Code:
      #!/usr/bin/env python
      
      import md5
      import binascii
      import base64 
      from Crypto.Cipher import AES
      import sys
      
      # 8C 35 19 2D 96 4D C3 18 2C 6F 84 F3 25 22 39 EB 4A 32 0D 25
      
      #infile = 'sys.argv[1]
      infile = 'test.rsdf'
      
      Key = binascii.unhexlify('8C35192D964DC3182C6F84F3252239EB4A320D2500000000')
      
      IV = binascii.unhexlify('FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF')
      IV_Cipher = AES.new(Key,AES.MODE_ECB)
      IV2 = IV_Cipher.encrypt(IV)
      
      print "Content-Type: text/html\n\n"
      print '<pre>'
      print 'IV2:'+IV2
      print 'MD5:'+md5.new(IV2).hexdigest()
      print "-----\n\n"
      
      
      obj = AES.new(Key,AES.MODE_CFB,IV2)
      
      rsdf = open(infile,'r')
      
      data = rsdf.read()
      data = binascii.unhexlify(''.join(data.split()))
      data = data.splitlines()
      
      
      for link in data:
          print "rawdata  :"+link
          print "MD5:"+md5.new(link).hexdigest()
          link = base64.b64decode(link)
          print "base64dec:"+link
          print "MD5:"+md5.new(link).hexdigest()
          link = obj.decrypt(link)
          print "decrypted:"+link
          print "MD5:"+md5.new(link).hexdigest()
      
      
      
      rsdf.close()
      print '</pre>'
      und (ein Teil) dessen Ausgabe:
      Code:
      rawdata  :imlVf7HadQ70zlFlQno/ssi7aJalsNLvX0cgQ4Y0TNT22NneRZqcxnVSpt7xIxBG8GJnhTDXEnWXBKOMGw3fUJrC1lI=
      MD5:fb28756f2926307d10eceeaaad9db527
      base64dec:�iU��u��QeBz?�Ȼh�����_G C�4L�����E���uR���#F�bg�0�u���
      �P���R
      MD5:5789ea973ebca235a75938fba6b12ff5
      decrypted:CCF: [url]http://rapidshare.com/files/123789636/bankjob_md_trg.part01.rar[/url]
      MD5:fa192c8a6c3745e03ddd96464658f7a1
      -----
      
      
      rawdata  :cs1sq8/NuARoexXaQs/WrShakUmd4cPyvJV+WhxEii9BG6zfZFhmj40BgY2L/jFbid3Ulm45vybvOEbgqMxMKvG/tAM=
      MD5:7cf321bf65bec2ff57d661fccb65d2aa
      base64dec:r�l��͸h{�B�֭(Z�I����~ZD�/A��dXf������1[��Ԗn9�&�8F��L*�
      MD5:507c564b7b17d80a71808e6a1b4953f8
      decrypted:CCF: [url]http://rapidshare.com/files/123789720/bankjob_md_trg.part02.rar[/url]
      MD5:a34a1e926c4c092544c39daa6c9d8eb7
      -----
      Zuletzt geändert von zzaphod; 24.06.2008, 17:10.

      Kommentar


      • #4
        OffTopic:

        Man sollte wenigstens andere Links oder so nehmen und damit verschlüssen und entschlüssel, statt Links mit Film-teilen

        Kommentar


        • #5
          Ist die Zeichenanzahl bei Phyton und beim PHP dieselbe? Versuch einmal eine Ausgabe von $key und $iv2 bei jedem Durchlauf + Grösse in Bytes vieleicht wird da was verändert. error_reporting noch an. Ersetzt splitlines() in Python nicht nur das \n ohne \r? Also explode("\n", $data). Das würde auch erklären warum es beim ersten Link noch nichts ändert.
          Vieleicht klappt ja irgendwas von dem

          Kommentar


          • #6
            Zeichenanzahl ist in PHP und Python diesselbe, sonst wäre der MD5 der Strings nicht identisch. Ich hab nun mal noch die MD5 von Key und IV2 bei jedem Durchlauf reingenommen. Diese bleiben unverändert - sowohl in Python als auch in PHP.

            \r\n nehm ich weil die .rsdf Files nach dem Hex-Decode jede Zeile mit \r\n abschließen. So steht in der test.rsdf ab Zeichen 185 ein 0D0A, also 1310 = CRLF.


            ergänzend mal noch die Versions-Angaben zu PHP und Mcrypt:

            PHP: 5.2.6

            MCRYPT: Version 2.5.7
            Api No: 20021217
            Supported ciphers: cast-128 gost rijndael-128 twofish arcfour cast-256 loki97 rijndael-192 saferplus wake blowfish-compat des rijndael-256 serpent xtea blowfish enigma rc2 tripledes
            Supported modes: cbc cfb ctr ecb ncfb nofb ofb stream
            Zuletzt geändert von zzaphod; 24.06.2008, 20:54.

            Kommentar


            • #7
              sodela, nach längerem rumlaborieren und der Konsultierung einiger befreundeter PHP'ler sind wir nun dahintergestiegen,
              wo der Fehler lag. Der IV des Python-Scripts ändert sich nach der einmaligen Instanzierung des Objektes mit jeder
              Entschlüsselung.

              An den IV selbst kommt man jedoch bei Benutzung von mcrypt_decrypt() nicht mehr ran. Also hat man 2 Möglichkeiten,
              entweder mdecrypt_generic() in der Schleife mit vorangehendem mcrypt_module_open() und mcrypt_generic_init()
              benutzen, oder eben alles auf einmal in einem String mit mcrypt_decrypt() zu entschlüsseln.

              Ich hab beide Lösungen angehängt, falls jemand Anderes mal über dasselbe Problem stolpert:

              mit mdecrypt_generic:
              PHP-Code:
              <?php

                  
              function hex2str($hex){

                      
              $hex str_replace(' '''$hex);
                      for (
              $i=0$i<strlen($hex)-1$i+=2){
                          
              $str .= chr(hexdec($hex[$i].$hex[$i+1]));
                      }
                      return 
              $str;
                  }
                  
                  
              $iv_hex  'FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF';
                  
              $key_hex '8C 35 19 2D 96 4D C3 18 2C 6F 84 F3 25 22 39 EB 4A 32 0D 25 00 00 00 00';
                  
                  
              $iv hex2str($iv_hex);
                  
              $key hex2str($key_hex);
                  
              $iv mcrypt_encrypt(MCRYPT_RIJNDAEL_128$key$ivMCRYPT_MODE_ECB"0000000000000000");
                      
                  
              $data file_get_contents('test.rsdf');
                  
              $data rtrim(hex2str($data), "\r\n");
                  
              $links explode("\r\n"$data);
                  
                  
              $td mcrypt_module_open(MCRYPT_RIJNDAEL_128''MCRYPT_MODE_CFB'');
                  
              $i mcrypt_generic_init($td$key$iv);

                  foreach(
              $links as $link)
                  {
                       
              $dec mdecrypt_generic($tdbase64_decode($link));
                       echo 
              str_replace('CCF: '''$dec)."\n";
                  }
                  
                  
              mcrypt_module_close($td);
                  
              ?>
              mit mcrypt_decrypt:
              PHP-Code:
              <?php

                  
              function hex2str($hex){

                      
              $hex str_replace(' '''$hex);
                      for (
              $i=0$i<strlen($hex)-1$i+=2){
                          
              $str .= chr(hexdec($hex[$i].$hex[$i+1]));
                      }
                      return 
              $str;
                  }
                  
                  
              $iv_hex  "FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF";
                  
              $key_hex "8C 35 19 2D 96 4D C3 18 2C 6F 84 F3 25 22 39 EB 4A 32 0D 25 00 00 00 00";
                  
                  
              $iv hex2str($iv_hex);
                  
              $key hex2str($key_hex);
                  
              $iv2 mcrypt_encrypt(MCRYPT_RIJNDAEL_128$key$ivMCRYPT_MODE_ECB"0000000000000000");
                  
                  
              $data file_get_contents('test.rsdf');
                  
              $data hex2str($data);
                  
                  
              $links explode("\r\n"$data);

                  
              $encrypted '';

                  foreach(
              $links as $link)
                  {
                       
              $encrypted .= base64_decode($link);
                  }
                  
                  
              print_r(mcrypt_decrypt(MCRYPT_RIJNDAEL_128$key$encryptedMCRYPT_MODE_CFB$iv2));
                  
              ?>
              Zuletzt geändert von zzaphod; 25.06.2008, 03:33.

              Kommentar


              • #8
                hast du nicht oben geschrieben der IV verändere sich nicht? o.O
                Danke auf jeden Fall für die Lösung

                Kommentar


                • #9
                  Original geschrieben von jmc
                  hast du nicht oben geschrieben der IV verändere sich nicht? o.O
                  Danke auf jeden Fall für die Lösung
                  zumindest nicht innerhalb meiner Variable. Da blieb er gleich, auf den IV innerhalb des Objektes hat man mit mcrypt_decrypt keinen Zugriff, da jeder Aufruf von mcrypt_decrpyt das Objekt in der mcrypt Lib neu instanziert.
                  Zuletzt geändert von zzaphod; 25.06.2008, 18:11.

                  Kommentar


                  • #10
                    OMG Retter!!!!!
                    Vielen Dank für diesen extrem erhellenden Post!

                    Kommentar

                    Lädt...
                    X