2016-05-03 2 views
0

Почему я получаю это предупреждение «Предупреждение: mcrypt_decrypt(): Полученный вектор инициализации размером 44, но размер 32 необходим для этого режима шифрования ...» с этим кодом?PHP и mcrypt_decrypt(): предупреждение о «размере вектора инициализации»

$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

Вы видите разницу между '$ iv' в разделе кодирования по сравнению с' $ iv' в разделе декодирования? – castis

+0

@castis Почему эта проблема? $ Iv секции декодирования извлекается из $ data (я прочитал первый пример http://php.net/manual/en/function.mcrypt-encrypt.php) – Webman

+0

Так же, как FYI, [mcrypt устарел] (http://blog.remirepo.net/post/2015/07/07/About-libmcrypt-and-php-mcrypt) – Machavity

ответ

1

Я думаю, что проблема заключается в методе mb_substr.

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

$ data обрабатывается как многобайтовая строка. Вот почему несколько символов считаются символами нескольких байтов. Просто используйте нормальную функцию substr, которая должна работать.

+0

Один вопрос: почему я использую substr (а не mb_substr), если я настроил PHP для работы в UTF8? – Webman

+0

Поскольку mb_substr может интерпретировать байты в $ data таким образом, что до 4 байтов считаются одним символом UTF8. Таким образом, он не будет возвращать ожидаемые 32 байта, но 32 символа UTF8, которые затем, например. 35 байт в длину. –

Смежные вопросы