Ankündigung

Einklappen
Keine Ankündigung bisher.

[solved] mcrypt frage

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

  • [solved] mcrypt frage

    Hallo,

    ich habe mich endlich mal dazu durchgerungen mich mit mcrypt zu befassen. Eigentlich ne feine Sache. Nur habe ich bisher ein kleines Verständnisproblem.

    Ich habe mich an dem Beispiel aus php.net versucht:

    Code:
       $key = "This is a very secret key";
       $text = "Meet me at 11 o'clock behind the monument.";
    
       $iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB);
       $iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
       $crypttext = mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $key, $text, MCRYPT_MODE_ECB, $iv);
    
    
       $iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB);
       $iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
       $plaintext = mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $key, $crypttext, MCRYPT_MODE_ECB, $iv);
    Am Ende kommt nicht mehr mein Klartext heraus. Sehe ich es richtig, daß Du die Zeile $iv = mcrypt_create_iv(... ein Zufallsschlüsselerzeugt und dieser aber bei mcrypt_encrypt und mcrypt_decrypt identisch sein muß, damit der verschlüsselte Text wieder herauskommt?

    Gibt es vielleicht eine andere, bessere Methode Texte zu ver- und entschlüsseln?
    http://www.donvelopment.org


  • #2
    http://www.dynamicwebpages.de/php/ref.mcrypt.php
    ...
    PHP-Code:
    $key "this is a secret key";
    $input "Let us meet at 9 o'clock at the secret place.";

    $encrypted_data mcrypt_ecb (MCRYPT_3DES$key$inputMCRYPT_ENCRYPT);
    ?> 
    "Nobody is as smart as everybody" - Kevin Kelly
    — The best things in life aren't things

    Kommentar


    • #3
      Bekomme leider mein mcrypt-extension nicht zum Laufen, aber das hier sollte eigentlich funktionieren:

      PHP-Code:
      <?php
      class Cryptor
      {
          private 
      $_td;
          private 
      $_cypher 'blowfish';
          private 
      $_mode   'cfb'
          private 
      $_key    'si2_"/ffu&2gz';
          
          public function 
      __construct()
          {
              
      $this->_td  mcrypt_module_open($this->_cypher''$this->_mode'');
          }
          
          public function 
      encrypt($plaintext)
          {
              
      $iv mcrypt_create_iv(mcrypt_enc_get_iv_size($this->_td), MCRYPT_RAND);
              
      mcrypt_generic_init($this->_td$this->_key$iv);
              
      $crypttext mcrypt_generic($this->_td$plaintext);
              
      mcrypt_generic_deinit($this->_td);
              return 
      $iv $crypttext;
          }
          
          public function 
      decrypt($crypttext)
          {
              
      $ivsize mcrypt_get_iv_size($this->_td);
              
      $iv substr($crypttext0$ivsize);
              
      $crypttext substr($crypttext$ivsize);
              
      mcrypt_generic_init($this->_td$this->_key$iv);
              
      $plaintext mdecrypt_generic($this->_td$crypttext);
              
      mcrypt_generic_deinit($this->_td);
              return 
      $plaintext;
          }
          
          public function 
      __destruct()
          {
              
      mcrypt_module_close($this->_td);
          }
      }
      ?>

      Kommentar


      • #4
        man bist du großzügig ... *copy*
        "Nobody is as smart as everybody" - Kevin Kelly
        — The best things in life aren't things

        Kommentar


        • #5
          Danke Zergling Werd ich auch gleich mal ausprobieren.

          Aber Du benutzt auch einen iv mit rand? ah. Habs grad gesehen. Du hängst den iv vorangestellt an den crypttext dran. Da wird mir alles klar

          @Zergling: Was ist eigentlich der Unterschied zwischen mcrypt_encrypt /mcrypt_decrypt und mcrypt_generic /mdecrypt_generic?
          http://www.donvelopment.org

          Kommentar


          • #6
            @Zergling: In Zeile 25 hast Du noch einen Fehler.

            falsch: $ivsize = mcrypt_get_iv_size($this->_td);
            richtig: $ivsize = mcrypt_enc_get_iv_size($this->_td);

            Ansonsten klappt wunderbar

            Besteht eigentlich eine Art Sicherheitsrisiko wenn man den $iv mit vor den crypttext hängt? Also das man den $iv mit bekannt gibt.
            http://www.donvelopment.org

            Kommentar


            • #7
              iv sollte bei bestimmten Kryptographie-Modi "zufällig" sein, sonst kann man ihn wohl hacken.
              Aber so richtig durchschaut habe ich das ganze selbst auch nicht, muss man aber finde ich auch nicht.

              Kommentar


              • #8
                Haste recht. Den Durchblick sollte man den Experten überlassen

                Aber Dein Beispiel funzt. Bin ich froh. Kann ich jetzt endlich das Kreditkartenmodul für meinen Mini-Shop endlich fertigstellen.
                http://www.donvelopment.org

                Kommentar


                • #9
                  Hallo,
                  etwas nachträglich aber immerhin, hier die funktionierende Mcrypt-Klasse:
                  PHP-Code:
                  <?php
                  class Mcrypt
                  {
                      private 
                  $_td;
                      private 
                  $_cypher MCRYPT_BLOWFISH;
                      private 
                  $_mode   MCRYPT_MODE_CFB;
                      private 
                  $_key    'si2_"/ffu&2gz'// this is your "password"
                      
                      
                  public function __construct()
                      {
                          
                  $this->_td  mcrypt_module_open($this->_cypher''$this->_mode'');
                      }
                      
                      public function 
                  encrypt($plaintext)
                      {
                          
                  $iv mcrypt_create_iv(mcrypt_enc_get_iv_size($this->_td), MCRYPT_RAND);
                          
                  mcrypt_generic_init($this->_td$this->_key$iv);
                          
                  $crypttext mcrypt_generic($this->_td$plaintext);
                          
                  mcrypt_generic_deinit($this->_td);
                          return 
                  base64_encode($iv $crypttext);
                      }
                      
                      public function 
                  decrypt($crypttext)
                      {
                          
                  $crypttext base64_decode($crypttext);
                          
                  $ivsize mcrypt_get_iv_size($this->_cypher$this->_mode);
                          
                  $iv substr($crypttext0$ivsize);
                          
                  $crypttext substr($crypttext$ivsize);
                          
                  mcrypt_generic_init($this->_td$this->_key$iv);
                          
                  $plaintext mdecrypt_generic($this->_td$crypttext);
                          
                  mcrypt_generic_deinit($this->_td);
                          return 
                  $plaintext;
                      }
                      
                      public function 
                  __destruct()
                      {
                          
                  mcrypt_module_close($this->_td);
                      }
                  }
                  ?>
                  Zwecks "Zeichenglättung" habe ich noch base64_* eingebaut. Die mcrypt-Extension muss installiert sein (php.ini -> "extension=php_mcrypt.dll" entkommentieren (führendes ; entfernen) -> Apache restarten).

                  Kommentar


                  • #10
                    Hi Zergling,

                    ich habe diese Funktionen in einer Datei gespeichert, und diese mittels INCLUDE in meine Webpages eingebunden.

                    Aber da ich vieles noch nicht in PHP gemacht habe, will ich Dich kurz fragen, wie ich nun jene Funktionen aufrufe. Einfach "encrypt($plaintext)" aufrufen? Ich kenne mich mit Klassen noch nicht aus, daher die Frage.
                    sigpic
                    Vielen Dank für Eure Zeit, Absicht, Mühe und für Eure Ideen. Grüße,
                    Sven

                    Kommentar


                    • #11
                      Hallo,

                      PHP-Code:
                      <?php
                      // als erstes jeweils ausführen
                      $mcrypt = new Mcrypt(); // Objekt-Instanz der Klasse erzeugen
                      // verschlüsseln
                      $cryptedStuff $mcrypt->encrypt("Sven aus Berlin bzw. Jamaica");
                      echo 
                      $cryptedStuff// sollte nicht "Sven aus Berlin bzw. Jamaica" sein
                      echo "
                      \n"
                      ;
                      // entschlüsseln
                      $plainStuff $mcrypt->decrypt($cryptedStuff);
                      echo 
                      $plainStuff// sollte "Sven aus Berlin bzw. Jamaica" sein.
                      ?>
                      Wenn ich mal lustig bin erweiter ich die Funktion noch um setPassword(), dann kann man den _key immer selbst setzen und die Klasse ist nicht auf ein Passwort beschränkt, ist ja schon etwas unflexibel.

                      Kommentar


                      • #12
                        Notice: Use of undefined constant MCRYPT_BLOWFISH - assumed 'MCRYPT_BLOWFISH' in T:\projects\local\host\public\test\mcrypt.php on line 56

                        Notice: Use of undefined constant MCRYPT_MODE_CFB - assumed 'MCRYPT_MODE_CFB' in T:\projects\local\host\public\test\mcrypt.php on line 56

                        Fatal error: Call to undefined function mcrypt_module_open() in T:\projects\local\host\public\test\mcrypt.php on line 11
                        In so einem Fall ist PHPs mcrypt-Extension nicht implementiert, das heißt sie muss entweder in der php.ini geladen werden:
                        Code:
                        extension=php_mcrypt.dll
                        (Windows, Linux-Dateiendung wäre so)

                        Falls der Zugriff auf die php.ini nicht möglich ist, kann man versuchen die Extension zur Laufzeit nachzuladen:
                        http://de2.php.net/dl

                        Hier die erweiterte Version, die ein Passwort erzwingt:
                        PHP-Code:
                        <?php
                        class Mcrypt
                        {
                            private 
                        $_td;
                            private 
                        $_cypher MCRYPT_BLOWFISH;
                            private 
                        $_mode   MCRYPT_MODE_CFB;
                            private 
                        $_key    null// this is your "password"

                            
                        public function __construct($password null)
                            {
                                
                        $this->_td  mcrypt_module_open($this->_cypher''$this->_mode'');
                                if (!
                        is_null($password)) {
                                    
                        $this->setKey($password);
                                }
                            }

                            public function 
                        setKey($password)
                            {
                                
                        $this->_key md5($password);
                            }

                            public function 
                        encrypt($plaintext)
                            {
                                if (
                        is_null($this->_key)) {
                                    throw new 
                        Exception("key not set, encryption denied, please call setKey()-method first");
                                }
                                
                        $iv mcrypt_create_iv(mcrypt_enc_get_iv_size($this->_td), MCRYPT_RAND);
                                
                        mcrypt_generic_init($this->_td$this->_key$iv);
                                
                        $crypttext mcrypt_generic($this->_td$plaintext);
                                
                        mcrypt_generic_deinit($this->_td);
                                return 
                        base64_encode($iv $crypttext);
                            }

                            public function 
                        decrypt($crypttext)
                            {
                                if (
                        is_null($this->_key)) {
                                    throw new 
                        Exception("key not set, decryption not possible, please call setKey()-method first");
                                }
                                
                        $crypttext base64_decode($crypttext);
                                
                        $ivsize mcrypt_get_iv_size($this->_cypher$this->_mode);
                                
                        $iv substr($crypttext0$ivsize);
                                
                        $crypttext substr($crypttext$ivsize);
                                
                        mcrypt_generic_init($this->_td$this->_key$iv);
                                
                        $plaintext mdecrypt_generic($this->_td$crypttext);
                                
                        mcrypt_generic_deinit($this->_td);
                                return 
                        $plaintext;
                            }

                            public function 
                        __destruct()
                            {
                                
                        mcrypt_module_close($this->_td);
                            }
                        }
                        ?>
                        Es bleibt jedem selbst überlassen, welche Variante er bevorzugt.

                        Kommentar


                        • #13
                          Hallo SvenLittkowski,

                          hier musst du einfach ein

                          PHP-Code:
                          <?php
                          include('mcrypt.class.php');
                          $oMC = new Mcrypt();
                          $cryptedtext $oMC->encrypt($plaintext);
                          ?>
                          notieren.
                          Viele Grüße,
                          Dr.E.

                          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                          1. Think about software design before you start to write code!
                          2. Discuss and review it together with experts!
                          3. Choose good tools (-> Adventure PHP Framework (APF))!
                          4. Write clean and reusable software only!
                          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

                          Kommentar


                          • #14
                            Uhh! Ohh! Oh nein! Damn!

                            Sobald ich die Datei mittels INCLUDE einbinde, funktioniert jene Page nicht mehr, die jene Seite einbindet: alles bleibt leer.

                            Hier jene komplette Seite, vieleicht kannst Du ja ahnen, woran es liegt.

                            PHP-Code:
                            <?PHP
                             session_start
                            ();
                             
                            $MyUsername=stripcslashes(strip_tags(trim($_POST["MyUsername"]),"[b] [/b][*] [i] [/i] <u> </u> 
                             <font> </font>"
                            ));
                             
                            $MyPassword=stripcslashes(strip_tags(trim($_POST["MyPassword"]),"[b] [/b][*] [i] [/i] <u> </u> 
                             <font> </font>"
                            ));
                             
                            $ButtonSubmit=stripcslashes(strip_tags(trim($_POST["ButtonSubmit"]),"[b] [/b][*] [i] [/i] <u> </u> 
                             <font> </font>"
                            ));
                             @include(
                            "t/Hinweise.php4"); 
                             @include(
                            "p/Standards.php4"); 
                            // @include("t/Crypt.php4");

                             
                            if($MyUsername&&$MyPassword)
                             {
                              @include(
                            "t/DbConn.php4");
                              
                            $Befehl="Select ".
                                      
                            "`NameFirst`, `NameLast`, `NameBusiness`, `Address`, `City`, `ZIP`, `State`, `Country`, ".
                                      
                            "`Telephone`, `EMail`, `Password`, `QuestionSecure`, `Account` ".
                                      
                            "from JBJ_Clients ".
                                      
                            "where `EMail`='".$MyUsername."' and `Password`='".$MyPassword."'";   // echo($Befehl);
                              
                            $Anfrage=mysql_query($Befehl,$Verbindung);
                              if(
                            $Datensatz=@mysql_fetch_assoc($Anfrage))
                              { 
                               
                            $MyName="<table border=\"0\" style=\"width: 160px; height: 50px\" class=\"FramerGray\">\n".
                                       
                            "  <tr>\n".
                                       
                            "    <td style=\"width: 160px; height: 50px\" valign=\"middle\" align=\"center\" bgcolor=\"#FFFFFF\" class=\"Contents\">\n".
                                       
                            "<font style=\"color: #A1BB8E; font-size: 10px\">\n".
                                       
                            "Welcome, ".$Datensatz["NameFirst"]." ".$Datensatz["NameLast"].".\n".
                                       
                            "

                            \n"
                            .
                                       
                            "<a href=\"Logout.php4\">Log out</a>.\n".
                                       
                            "</font>\n".
                                       
                            "    </td>\n".
                                       
                            "  </tr>\n".
                                       
                            "</table>\n";
                                       
                            //   $mcrypt=new Mcrypt();  
                            //   $cryptedStuff=$mcrypt->encrypt("Sven aus Berlin bzw. Jamaica"); 
                            //   echo("mmm".$cryptedStuff); 
                                     
                                       
                               
                            $MyLoginNameFirst=$Datensatz["NameFirst"];
                               
                            $MyLoginNameLast=$Datensatz["NameLast"];
                               
                            $MyLoginAddress=$Datensatz["Address"];
                               
                            session_register("MyFullName");
                               
                            session_register("MyFullAddress");
                               
                               
                               
                               
                               
                            $Datensatz["NameFirst"]." ".$Datensatz["NameLast"];
                               
                            $Whatever="?What1=".$Datensatz["NameFirst"]."&What2=".$Datensatz["NameLast"]."&What3=".$Datensatz["Address"];
                               
                            $Load="<script language=\"JavaScript\">window.open(\"p/Start.php4".$Whatever."\",\"Page\");</script>";
                              }
                              else
                              {
                               if(
                            $MyUsername||$MyPassword)
                               {
                                echo(
                            Hinweis("[b]Not logged in.[/b]
                            Please use the correct username and password.
                            <a href=\"Login.php4\">Retry</a>"
                            ,"#880000","100%"));
                                
                            $Load="";
                               }
                              }
                              @include(
                            "t/DbClose.php4");
                             }
                             else
                             {
                              echo(
                            Hinweis("[b]Not logged in.[/b]
                            Please use the correct username and password.
                            <a href=\"Login.php4\">Retry</a>"
                            ,"#880000","100%"));
                             }
                            ?>
                            <html>
                            <head>
                            <title></title>
                            <?PHP echo($Load); ?>
                            </head>
                            <body>
                            <?PHP echo($MyName); ?>
                            </body>
                            </html>
                            sigpic
                            Vielen Dank für Eure Zeit, Absicht, Mühe und für Eure Ideen. Grüße,
                            Sven

                            Kommentar


                            • #15
                              Wenn eine Seite leer bleibt, dann ist wahrscheinlich ein PHP-Fehler aufgetreten, während display_errors auf FALSE ist.

                              PHP-Code:
                              <?php
                              error_reporting
                              (E_ALL);
                              ini_set("display_errors"true);
                              //..
                              ?>
                              Ein @ vor dem include macht wirklich nur Sinn, wenn es nichts ausmacht, dass das Einbinden der Datei fehlschlägt. Das ist praktisch nie der Fall!
                              Wenn die Datei eingebunden werden muss, damit das Skript sinnvoll arbeitet, dann verwende require (der Name sagt es schon: "benötigt"), wenn es nicht sein muss reicht include, die Warnstufe beim Error-Reporting ist geringer und kann deshalb über error_reporting(E_ALL) der Produktionsumgebung angepasst werden.

                              Ich verwende immer require_once, weil alle Dateien die ich einbinde auch benötigt werden, wenn sie nur bedingt benötigt werden, kommen sie eben in den if-Block, der die Bedingung erfüllt!

                              Kommentar

                              Lädt...
                              X