Поскольку IV не имеет значения в режиме ECB, мы можем его игнорировать. Тем не менее, Mcrypt не очень снисходительно. Нам все еще нужно предоставить и IV, даже если это подделка.
// We'll be encrypting this data
$key = 'password';
$data = 'The quick brown fox jumped over the lazy dogs.';
$encrypted = null;
// 3des in ECB mode
$m = mcrypt_module_open(MCRYPT_3DES, null, MCRYPT_MODE_ECB, null);
// Our IV will be enough NUL bytes to satisfy mcrypt.
$fake_iv = str_repeat(chr(0), mcrypt_enc_get_iv_size($m));
mcrypt_generic_init($m, $key, $fake_iv);
$encrypted = mcrypt_generic($m, $data);
// "s/6HOXpVyMyFdSPYUgIgneMRY0o3Kubkwc++hSg9kC4Sw0TWsNTqzrhXY3z4PH9w"
echo base64_encode($encrypted), "\n";
unset($m);
// And now, in reverse!
$n = mcrypt_module_open(MCRYPT_3DES, null, MCRYPT_MODE_ECB, null);
// Another fake IV
$fake_iv = str_repeat(chr(0), mcrypt_enc_get_iv_size($n));
mcrypt_generic_init($n, $key, $fake_iv);
$original = mdecrypt_generic($n, $encrypted);
// string(48) "The quick brown fox jumped over the lazy dogs."
var_dump($original);
Опять же, вы захотите сделать это, только если будете придерживаться режима ECB. Режим ECB может быть довольно ужасным. Возможно, вы захотите просмотреть статью Википедии о режимах блочного шифрования для получения дополнительной информации.
Единственное, что здесь не обрабатывается, это отступы. mcrypt не позволяет вам выбрать метод заполнения и делает что-то другое в зависимости от шифра. Как правило, он не добавляет никаких отступов.
Если в выбранном вами методе заполнения используются байты NUL, вам необходимо предварительно заполнить данные самостоятельно, чтобы обеспечить совместимость. Вы можете использовать mcrypt_get_block_size
и str_pad
с опцией STR_PAD_RIGHT
, чтобы сделать это.
Аналогичным образом, вам может потребоваться обрезать NUL-байты справа сразу после расшифровки. Поможет второй параметр trim
.