2016-01-06 5 views
0

Я использовал алгоритм Rijndael для шифрования и дешифрования пароля моей базы данных. Я сохранил закодированный пароль в другом файле. Здесь я уменьшил код релевантной:mcrypt_decrypt добавление нуля в конце дешифрованного текста

$encrypted = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, PASSWORD_SALT, 'mypassword', MCRYPT_MODE_ECB);  
$decrypted = mcrypt_decrypt(MCRYPT_RIJNDAEL_128, PASSWORD_SALT, $encrypted, MCRYPT_MODE_ECB); 
// !! The value of $decrypted is "mypassword  " i.e. "mypasswordNULLNULLNULLNULLNULL" 

'mypassword' преобразуется в 'mypassword' + 6xNULL. Дешифрованный код содержит нуль.

Я написал этот код 1 год назад, и все работает нормально. Но теперь, когда изменилась версия всех технологий, у меня возникла проблема.

ответ

2

Это всегда было так.

Согласно документации:

Данные, которые будут расшифрованы с заданным шифром и режимом. Если размер данных не является n * blockize, данные будут дополняться «\ 0».

Таким образом, либо вы обрезаете свои данные с помощью \0, либо вам нужно сохранить исходную длину в любом месте, а затем разрезать прокладку 0.

+0

Обратите внимание, что если ваш открытый текст был необработанным двоичным кодом, и существует вероятность того, что ваше исходное сообщение закончилось бы в серии '\ 0' байт, вы потеряете данные. Лучшая идея: переключиться на OpenSSL, который даст вам дополнение PKCS7, если вам не нужно думать/ухаживать. –

2

Использование алгоритма Rijndael-128 mcrypt_encrypt() всегда будет возвращать кратные 16 байт. Если ваш обычный текст не является точным кратным 16 байт, данные будут заполняться нулевыми байтами, поэтому он будет кратным 16.

Эти нулевые байты также отображаются в расшифрованном тексте. Вы должны удалить те, с помощью:

$decrypted = rtrim($decrypted, "\0"); 

Примечание 1: Rijndael представляет собой алгоритм шифрования блока, который работает на блоке фиксированного размера. Вот почему заполнение может быть необходимо.

Примечание 2: Шифрование подходит только для кодированного ввода, который никогда не заканчивается значением 00h (из-за нулевого заполнения по умолчанию). Взято из примера кода в

+0

Но код работал ранее. Как его решить. Я не знаю заранее, какой размер будет иметь пароль – afzalex

+0

Вам не нужно знать длину пасеора, вы всегда можете обрезать выход, как указано выше. – maxhb