Estoy usando PHP 7.1 y puedo cifrar con éxito un trozo de cadena, así:
$key = random_bytes(32);
$iv = openssl_random_pseudo_bytes(openssl_cipher_iv_length('aes-256-gcm'));
$cipherText = openssl_encrypt(
'The quick brown fox jumps over the lazy dog.',
'aes-256-gcm',
$key,
OPENSSL_RAW_DATA,
$iv,
$tag,
''
)
Entonces, puedo descifrarlo exitosamente con:
openssl_decrypt(
$cipherText,
'aes-256-gcm',
$key,
OPENSSL_RAW_DATA,
$iv,
$tag,
''
);
Sin embargo, durante las pruebas, descubrí que si lo descifraba de la siguiente manera:
openssl_decrypt(
$cipherText,
'aes-256-gcm',
$key,
OPENSSL_RAW_DATA,
$iv,
mb_substr($tag, 0, mb_strlen($tag) - 15),
''
);
Todavía obtendría mi cuerda perfectamente bien. Sin sorpresa, esto también sucede si elimino datos de la etiqueta de autenticación cuando estoy en formato base64url.
¿Por qué sucede esto?