A continuación se muestra un ejemplo de un script probado en PHP 8.1 para cifrar y descifrar una cadena de texto basada en openssl.
nano encrypt-decrypt.php
<?php
define('ENCRYPTION_KEY', '<mark>my-secret-key-there-2121</mark>');
// Encrypt
$plaintext = "<output>Cadena de prueba para cifrado en php 8.1</output>";
$ivlen = openssl_cipher_iv_length($cipher="AES-128-CBC");
$iv = openssl_random_pseudo_bytes($ivlen);
$ciphertext_raw = openssl_encrypt($plaintext, $cipher, ENCRYPTION_KEY, $options=OPENSSL_RAW_DATA, $iv);
$hmac = hash_hmac('sha256', $ciphertext_raw, ENCRYPTION_KEY, $as_binary=true);
$ciphertext = base64_encode( $iv.$hmac.$ciphertext_raw );
<output>echo $ciphertext.'<br>';</output>
// Decrypt
$c = base64_decode($ciphertext);
$ivlen = openssl_cipher_iv_length($cipher="AES-128-CBC");
$iv = substr($c, 0, $ivlen);
$hmac = substr($c, $ivlen, $sha2len=32);
$ciphertext_raw = substr($c, $ivlen+$sha2len);
$plaintext = openssl_decrypt($ciphertext_raw, $cipher, ENCRYPTION_KEY, $options=OPENSSL_RAW_DATA, $iv);
$calcmac = hash_hmac('sha256', $ciphertext_raw, ENCRYPTION_KEY, $as_binary=true);
if (hash_equals($hmac, $calcmac))
{
<output>echo $plaintext;</output>
}
?>
La primera línea es el resultado del cifrado y la segunda línea es el descifrado. Es más, si actualizamos la página sin cambiar la frase, siempre obtendremos un resultado diferente, pero al descifrarla será el mismo.
Para separar estas funciones en diferentes archivos, deberá transferir la clave en el parámetro ENCRYPTION_KEY.
Sin comentarios aún