2016-05-03 6 views
0

Warum bekomme ich diese Warnmeldung "Warnung: mcrypt_decrypt(): Empfangene Initialisierungsvektor der Größe 44, aber Größe 32 ist für diesen Verschlüsselungsmodus erforderlich in ..." mit diesem Code?PHP und mcrypt_decrypt(): Warnung über "Größe des Initialisierungsvektors"

$sessionKey = "Secr3t_Sess1on!Key_4t6ydv98*w8ds"; 
$data = "clear text"; 

$ivSize = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_CBC); 
$keySize = mcrypt_get_key_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_CBC); 


// Encode data 
$iv = mcrypt_create_iv($ivSize, MCRYPT_DEV_URANDOM); 
$key = mb_substr (hash('sha256', $sessionKey), 0, $keySize); 
$encryptedData = mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $key, $data, MCRYPT_MODE_CBC, $iv); 
$encryptedB64Data = base64_encode($iv.$encryptedData); 


// Decode data 
$data = base64_decode($encryptedB64Data, true); 
$key = mb_substr (hash('sha256', $sessionKey), 0, $keySize); 
$iv = mb_substr ($data, 0, $ivSize); 
$data = mb_substr ($data, $ivSize); 
$data = mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $key, $data, MCRYPT_MODE_CBC, $iv); 
$decodedData = rtrim($data, "\0"); 
+0

Siehst du den Unterschied zwischen '$ iv' im Codierabschnitt und' $ iv' im Decodierabschnitt? – castis

+0

@castis Warum ist das Problem? Der $ iv des Dekodierungsabschnitts wird aus $ data extrahiert (ich lese das erste Beispiel http://php.net/manual/en/function.mcrypt-encrypt.php) – Webman

+0

Nur als ein FYI, [Mcrypt ist veraltet] (http://blog.remirepo.net/post/2015/07/07/About-libmcrypt-and-php-mcrypt) – Machavity

Antwort

1

Ich denke, das Problem ist die mb_substr-Methode.

$iv = mb_substr ($data, 0, $ivSize); 

$ Daten werden als Multi-Byte-String behandelt. Aus diesem Grund werden mehrere Zeichen als ein Multi-Byte-Zeichen gezählt. Verwenden Sie einfach die normale Substr-Funktion sollte funktionieren.

+0

Eine Frage: Warum benutze ich substr (und nicht mb_substr), wenn ich PHP so konfiguriert habe, dass es in UTF8 funktioniert? – Webman

+0

Weil mb_substr die Bytes in $ data so interpretieren kann, dass bis zu 4 Bytes als ein UTF8-Zeichen gezählt werden. Es wird also nicht die erwarteten 32 Bytes, sondern 32 UTF8-Zeichen zurückgeben, die dann z. 35 Bytes lang. –

Verwandte Themen