Почему mcrypt_encrypt () помещает двоичные символы в конец моей строки? - PullRequest
8 голосов
/ 20 марта 2012

Вот демонстрационный скрипт PHP, который шифрует и дешифрует данные:

<?

$encryptionkey = 'h8y2p9d1';

$card_nbr = "1234";
echo "original card_nbr: $card_nbr <br>\n";

$card_nbr_encrypted=encrypt_data($card_nbr);
echo "card_nbr_encrypted: $card_nbr_encrypted <br>\n";

$card_nbr_decrypted=decrypt_data($card_nbr_encrypted);
echo "card_nbr_decrypted: $card_nbr_decrypted <br>\n";

$len=strlen($card_nbr_decrypted);
echo "length: $len <br>\n";



function encrypt_data($text){
  global $encryptionkey;
  $iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB);
  $iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
  $encrypted_text = mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $encryptionkey, $text, MCRYPT_MODE_ECB, $iv);
  return $encrypted_text;
}

function decrypt_data($text){
  global $encryptionkey;
  $iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB);
  $iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
  $decrypted_text = mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $encryptionkey, $text, MCRYPT_MODE_ECB, $iv);
  return $decrypted_text;
}

?>


Вывод:

original card_nbr: 1234
card_nbr_encrypted: vY¨(Z$<§G3-žÃ-Éù3Ý2Ê×rz¨VÛ
card_nbr_decrypted: 1234  (and 28 binary characters)
length: 32 


Вывод успешно расшифрован, но28 двоичных символов добавляются в конец.Это легче всего увидеть в Firefox при просмотре исходного кода HTML.Длина строки 32 также демонстрирует это.Есть идеи?

enter image description here

Ответы [ 4 ]

8 голосов
/ 20 марта 2012

Возвращаемая строка дополняется до заполнения n * blocksize байтов нулевым символом \0, поэтому вы видите дополнительные данные.

Если вы запустите $card_nbr_decrypted= rtrim($card_nbr_decrypted, "\0");, она должна вернуть фактическуюданные.

3 голосов
/ 20 марта 2012

Кажется, это известная проблема .Используйте rtrim() после декодирования, чтобы удалить лишние NUL.

2 голосов
/ 02 ноября 2013

Вы получаете нулевые байты, потому что вы используете электронный кодовый блок (ECB) для вашего режима работы блочного шифра , который дополняет конец вашего открытого текста, чтобы соответствоватьразмер блока.В вашем случае размер блока составляет 256 бит, потому что вы используете MCRYPT_RIJNDAEL_256.

. Вы можете избежать этой проблемы заполнения вместе, если используете режим Cipher Feedback (CFB) - MCRYPT_MODE_CFB - нет нулевых байтов, нет необходимости обрезать.Но с CFB вы должны HMAC свои зашифрованные данные, чтобы убедиться, что они не были подделаны с (см. «Маллет») .Пример работающей реализации можно найти по адресу: Криптография для среднего разработчика .

Также следует отметить, что режим ECB считается менее безопасным, поскольку он может раскрывать шаблоны данных .Кроме того, ECB (и CBC, так как он также прокладывает) может быть уязвимым для атаки оракула отступления .

0 голосов
/ 03 ноября 2014

Я думаю, проблема в том, что вы используете двоичные данные, когда:

mcrypt_encrypt - шифрует открытый текст с заданными параметрами

Вы можете использовать base64_encode ($ text) для использования открытого текста.

...