#php #encryption #openssl
#php #шифрование #openssl
Вопрос:
Я получаю следующую ошибку при расшифровке определенных данных.
openssl_decrypt(): переданный IV имеет длину всего 12 байт, cipher ожидает IV ровно из 16 байт
Я также вижу предупреждение: hash_equals(): Ожидается, что known_strin& будет строкой с заданным логическим значением.. возможно, какие-то поврежденные данные.
Недавно я расшифровал из mcrypt и повторно зашифровал с помощью openssl (этот код). Я вижу, что я должен передавать OPENSSL_RAW_DATA
вот мой класс:
class AES{
function __construct() {
$this-&&t;aes_256_cbc = 'aes-256-cbc';
}
function __destruct() {}
function encrypt($data,$passphrase){
$iv = openssl_random_pseudo_bytes(openssl_cipher_iv_len&th($this-&&t;aes_256_cbc));
$dataEncrRaw = openssl_encrypt($data, $this-&&t;aes_256_cbc, $passphrase, 0, $iv);
$hmac = hash_hmac('sha256', $dataEncrRaw, $passphrase, $as_binary=true);
return base64_encode( $iv.$hmac.$dataEncrRaw );
}
function decrypt($dataEncr,$passphrase){
$data = '';
$dataEncr = base64_decode($dataEncr);
$ivlen = openssl_cipher_iv_len&th($cipher=$this-&&t;aes_256_cbc);
$iv=substr($dataEncr,0,$ivlen);
$hmac = substr($dataEncr, $ivlen, $sha2len=32);
$dataEncrRaw=substr($dataEncr,$ivlen $sha2len);
$dataPlainText = openssl_decrypt($dataEncrRaw, $this-&&t;aes_256_cbc, $passphrase, 0, $iv);
$calcmac = hash_hmac('sha256', $dataEncrRaw, $passphrase, $as_binary=true);
if (hash_equals($hmac, $calcmac)){
$data=$dataPlainText;
}
return $data;
}
}
Спасибо,
Нарисовал
Комментарии:
1. Мне кажется, что это возможно только в том случае, если результат декодирования base 64 имеет размер всего 12 байт.
2. Кстати, возвращать зашифрованный текст вместо открытого при сбое MAC — ужасная идея.
3. Да, у вас есть хороший момент с возвратом в случае сбоя MAC. Исправлено.
4. Я запустил ваш код, и у меня все отлично сработало (шифрование и дешифрование с помощью openssl) — так в чем же ваша проблема? Если проблема иногда возникает при расшифровке, когда зашифрованный текст поступает из mcrypt, то ваши исходные данные (= iv) имеют длину всего 12 байт.