2015-02-06 2 views
2

Я пытаюсь сделать процедуру шифрования/дешифрования с помощью mcrypt, но, похоже, он пытается испортить данные, пытающиеся зашифровать.mcrypt messing с данными

Heres код:

$data = 'Some important data'; 
    $key = "mycryptKey"; 
    $cipher = "rijndael-128"; 

    $encryptedData = mcrypt_encrypt($cipher, $key, $data, MCRYPT_MODE_ECB); 
    $decryptedData = mcrypt_decrypt($cipher, $key, $encryptedData, MCRYPT_MODE_ECB); 

    var_dump($data); //string 'Some important data' (length=19) 
    var_dump($encryptedData); //string '™ì{*¾xv-&n5’Œü½Ýëc®n)mSƒ7]' (length=32) 
    var_dump($decryptedData); //string 'Some important data�������������' (length=32) 

Он продолжает добавлять эти символы в конце исходной строки. Я видел пример на How do you Encrypt and Decrypt a PHP String?, но он не работал

Это настоящий тест. Ключ и данные я использую тот же размещено здесь

Редактировать

я понял, после того, как @jonhopkins комментария, что Mcrypt был обивкой некоторые «\ 0» символов после $ данных контента, поэтому я очищаю его после дешифрования с помощью «strtok»:

$decryptedData = \strtok(mcrypt_decrypt($cipher, $key, $encryptedData, MCRYPT_MODE_ECB), "\0"); 
var_dump($decryptedData); //string 'Some important data' (length=19) 
+2

Если бы мне пришлось угадать, я бы предположил, что метод шифрования автоматически заполняет строку. IIRC rijndael-128 требует, чтобы его ввод был длинным, равным 16, поэтому 'mcrypt_encrypt' заполняется 0s до 32 байтов, но я полагаю, что' mcrypt_decrypt' не может определить исходную длину, поэтому он оставляет эти дополнительные байт. – jonhopkins

+0

Вы гений @jonhopkins! Но есть еще один вопрос: как я мог возвращать одни и те же данные, если мне нужно его модифицировать, прежде чем перейти к mcrypt? – CarlosCarucce

+0

Это большой вопрос, который, как мне бы хотелось, я знал ответ ... Я даже не уверен, что это то, что происходит. Но если я найду что-нибудь, то я дам вам знать. edit: http://stackoverflow.com/q/20507050 это может помочь – jonhopkins

ответ

1

Что вам не хватает здесь, это отступы; данные, которые должны быть зашифрованными должен быть дополнен первым:

$data = pkcs7_pad($data, 16); 

Кроме того, после расшифровки вам необходимо обратить отступы:

$decryptedData = pkcs7_unpad($decryptedData, 16); 

Функции, используемые:

function pkcs7_unpad($data) 
{ 
    return substr($data, 0, -ord($data[strlen($data) - 1])); 
} 

function pkcs7_pad($data, $size) 
{ 
    $length = $size - strlen($data) % $size; 
    return $data . str_repeat(chr($length), $length); 
} 

Кроме того, это важно обратите внимание, что расширение mcrypt довольно старое и не поддерживается в хорошем состоянии; Я бы рекомендовал вместо этого переключиться на OpenSSL. См. Мой earlier answer для полного примера.