К сожалению, вам нужны одинаковые $ iv как для загрузки, так и для сохранения.
// Creates a random value so that the same message encoded with the same key
$iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
Обходной путь - использовать
$mode = MCRYPT_MODE_CFB;
Шифровать с
$encrypted = mcrypt_encrypt($cipher, $key, $iv . $message, $mode, $iv);
Префикс закодированного сообщения с IV, а затем при декодировании используйте
$decrypted = mcrypt_decrypt($cipher, $key, $encrypted, $mode, str_pad('', $iv_size));
$decrypted = substr(rtrim($decrypted, "\0"), $iv_size);
CFB имеет возможность повторной синхронизации во время дешифрования и может использовать эту функцию «восстановления», чтобы поместить ваш IV в.
Кроме того, в зависимости от количества создаваемых IV, вы можете использовать urandom, а не random.
$iv = mcrypt_create_iv($iv_size, MCRYPT_DEV_URANDOM);