Umstieg von PHP5.5 zu 5.6

oliverb

Mitglied
Moin zusammen,

ich habe eine Funktion, welche problemlos unter PHP5.5 arbeitet und Strings binär verschlüsselt bzw. entschlüsselt. Jetzt mit PHP 5.6 gibt es leider Problem. Es wird kein Resultat verarbeitet bzw. ausgegeben. Wo liegt hier der Fehler? Komme irgendwie nicht weiter. Bitte um Hilfe bzw. Hinweise!

PHP:
function verschluesseln($text, $key, $mode){
     
        /*
            $key = //festgelegter Code
            $text = //Zu verschlüsselnde Inhalt
            $schluessel = verschluesseln($text, $key, 1); //Funktion verschlüsseln binär
            $entschluessel = trim(verschluesseln($schluessel, $key, 2)); //Funktion entschlüsseln trim()
        */
     
        $iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB);
        $iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
     
        if($mode==1){
     
            return base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $key, $text, MCRYPT_MODE_ECB, $iv)); 
         
        }else{
     
            return mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $key, base64_decode($text), MCRYPT_MODE_ECB, $iv);
     
        }
    }
 
Zuletzt bearbeitet von einem Moderator:
Hi

Füg Folgendes am Anfang des Scripts ein und schau nach, ob Fehlermeldungen ausgegeben werden:
PHP:
error_reporting(E_ALL);
ini_set('display_errors', true);
 
Es erscheint leider keine Fehlermeldung. Alle Werte die ich übergebe sind im Klartext abrufbar. Erst wenn Sie durch die Funktion laufen lasse kommt am Ende nichts raus.

Wie gesagt. Mit PHP 5.5 funktioniert es ja... :(
 
Neue Funktion nur etwas anders. PHP5.5 läuft und PHP 5.6 gibt keinen String zurück. Bin echt mit meinem Latein am Ende...:confused:

function encrypt($text, $key)
{
return trim(base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $key, $text, MCRYPT_MODE_ECB, mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB), MCRYPT_RAND))));
}
function decrypt($text, $key)
{
return trim(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $key, base64_decode($text), MCRYPT_MODE_ECB, mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB), MCRYPT_RAND)));
}
 
Hi,

schau mal in die Migrationsseite zu PHP 5.6, dort werden die MCrypt-Funktionen explizit erwähnt:

http://de.php.net/manual/de/migration56.incompatible.php

mcrypt_encrypt(), mcrypt_decrypt(), mcrypt_cbc(), mcrypt_cfb(), mcrypt_ecb(), mcrypt_generic() und mcrypt_ofb() akzeptieren nicht länger Schlüssel oder IVs mit falscher Länge und Blockschlüssel die IVs benötigen schlagen nun fehl, wenn kein IV übergeben wurde.

Tipps dazu: Pack nicht alle Funktionsaufrufe in eine Zeile. Lässt sich schwer debuggen. Versuch mal diesen Code:

PHP:
<?php

function create_iv()
{
    $iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB);
   
    if (false === $iv_size) {
        throw new RuntimeException("Could not retrieve iv size");
    }
   
    $iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
   
    if (false === $iv) {
        throw new RuntimeException("Could not create iv");
    }
   
    return $iv;
}

function encrypt($text, $key)
{
    $key = pack('H*', $key);
   
    $encrypted = mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $key, $text, MCRYPT_MODE_ECB, create_iv());
   
    if (false === $encrypted) {
        throw new RuntimeException("Invalid encryption call");
    }
   
    return trim(base64_encode($encrypted));
}

function decrypt($text, $key)
{
    $key = pack('H*', $key);
   
    $decrypted = mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $key, base64_decode($text), MCRYPT_MODE_ECB, create_iv());
   
    if (false === $decrypted) {
        throw new RuntimeException("Invalid decryption call");
    }
   
    return trim($decrypted);
}

$key = hash("sha256", "mysecret");

$enc = encrypt("Hello World", $key);

$dec = decrypt($enc, $key);

printf("Encrypted: %s\nDecrypted: %s\n", $enc, $dec);
 
Danke für das Feedback. Ich habe das Ganze mittlerweile per mySQL gelöst. Meiner Meinung nach wesentlich einfacher. Für alle die es interessiert wie das geht der entsprechende Code:

INSERT INTO `table` (field)
VALUES (AES_ENCRYPT('String', 'key'))

SELECT
CAST(AES_DECRYPT(field, 'key') AS CHAR) field
FROM `table`

WICHTIG:
Datenfeld muss das Format "varbinary" haben!!
 
Das ist richtig. In diesem Fall aber nicht schlimm. Zumindest ist in den nächsten Major Releases von mySQL diese Funktion nicht als "deprecated" markiert... :)
 

Neue Beiträge

Zurück