#php #encryption
#php #шифрование
Вопрос:
После прохождения большого количества операций шифрования / дешифрования с помощью Google, мне удается создать этот фрагмент кода. Но он показывает следующую ошибку, из-за которой я не могу понять, ПОЧЕМУ это происходит.
ОШИБКА: Предупреждение: mcrypt_encrypt(): параметр IV должен быть такой же длины, как размер блока в /var/www/encrypt.php в строке 16
error_reporting(E_ALL ^ E_DEPRECATED);
ini_set('display_errors', '1');
class Cipher {
private $securekey, $iv;
function __construct($textkey) {
$this->securekey = hash('sha256',$textkey,TRUE);
//$this->iv = mcrypt_create_iv(32);
$size = mcrypt_get_iv_size(MCRYPT_CAST_256, MCRYPT_MODE_CFB);
$this->iv = mcrypt_create_iv($size, MCRYPT_DEV_RANDOM);
}
function encrypt($input) {
return base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $this->securekey, $input, MCRYPT_MODE_CFB, $this->iv));
}
function decrypt($input) {
return trim(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $this->securekey, base64_decode($input), MCRYPT_MODE_CFB, $this->iv));
}
}
$cipher = new Cipher('secret passphrase');
$encryptedtext = $cipher->encrypt("hide me");
echo "->encrypt = $encryptedtext<br />";
$decryptedtext = $cipher->decrypt($encryptedtext);
echo "->decrypt = $decryptedtext<br />";
var_dump($cipher);
Если я прокомментирую следующие 2 строки из функции КОНСТРУКТОРА..
$size = mcrypt_get_iv_size(MCRYPT_CAST_256, MCRYPT_MODE_CFB);
$this->iv = mcrypt_create_iv($size, MCRYPT_DEV_RANDOM);
amp; раскомментируйте эту строку..
$this->iv = mcrypt_create_iv(32);
Он перестал показывать ошибку.
Я не могу определить, что я делаю неправильно.
Комментарии:
1. Примечание сбоку:
securekey
является неправильным, если вы просто хэшируете пароль. Google для PBKDF2.
Ответ №1:
Вы передаете неправильное имя алгоритма mcrypt_get_iv_size()
. Вы передаете MCRYPT_CAST_256
, когда это должно быть MCRYPT_RIJNDAEL_256
.
CAST-256 имеет размер блока 16 байт, тогда MCRYPT_RIJNDAEL_256
как указывает Rijndael с размером блока 32 байта. Это будет причиной ошибки.
Комментарии:
1. Спасибо за ответ. вы правы. Я использовал неправильный алгоритм. На самом деле, я пытаюсь создать одну библиотеку шифрования / дешифрования, которая будет использоваться для шифрования личных данных пользователя, например.. SSN, DOB и некоторая финансовая информация. Можете ли вы дать мне некоторое представление, подходит ли этот КЛАСС для обработки такой информации, или я должен использовать что-то еще.