Skip to content

Instantly share code, notes, and snippets.

@fitorec
Last active June 3, 2023 18:19
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save fitorec/11ba6a4e43cd2759890be84ae960a88c to your computer and use it in GitHub Desktop.
Save fitorec/11ba6a4e43cd2759890be84ae960a88c to your computer and use it in GitHub Desktop.
Implementación del Algoritmo AES-256-CBC usando las librerías de OpenSSL
<?php
namespace App\Encryption;
class AES {
public static function generate_iv()
{
return openssl_random_pseudo_bytes(
openssl_cipher_iv_length('aes-256-cbc')
);
}
public static function generate_key() {
// Longitud de clave en bytes para AES-256 (256 bits)
// $keyLength = 32;
return openssl_random_pseudo_bytes(32);
}
/**
* Encrypt Cifra el arreglo $data, en función de la clave $key.
*
* @param array $data Datos a Cifrar
* @param string $key Clave de cifrado en formato base64
*
* @return array Un arreglo con el vector de inicialización iv y el mensaje
* cifrados ambos en formato base64.
*/
public static function encrypt(array $data, string $key)
{
$iv = AES::generate_iv();
$msg = json_encode($data);
$encrypted = openssl_encrypt(
$msg,
'aes-256-cbc',
base64_decode($key),
OPENSSL_RAW_DATA,
$iv
);
return [
"iv" => base64_encode($iv),
"message" => base64_encode($encrypted)
];
}
/**
* Descifra el arreglo $encrypt_data, en función de la clave $key.
*
* @param array $encrypt_data contiene el mensaje `message` y vector `iv` ambos en base64
* @param string $key Clave de cifrado en formato base64
*
* @return array El contenido del mensaje en formato de arreglo o null en caso de error.
*/
public static function decrypt(array $encrypt_data, string $key)
{
if ( ! isset($encrypt_data['message']) || ! isset($encrypt_data['iv'])) {
return null;
}
$msg = openssl_decrypt(
base64_decode($encrypt_data['message']),
'aes-256-cbc',
base64_decode($key),
OPENSSL_RAW_DATA,
base64_decode($encrypt_data['iv']),
);
return json_decode($msg, true);
}
}
<?php
use App\Encryption\AES;
$data = ['id' => 5, 'dato_extra' => 'Algún texto'];
$key = AES::generate_key();
$encrypt = AES::encrypt($data, $key);
$decrypt = AES::decrypt($encrypt, $key);
$result = [
'data' => $data,
'key' => base64_encode($key),
'encryp' => $encrypt,
'decrypt' => $decrypt
];
/*
Resultado
===============================================
{
"data": {
"id": 5,
"dato_extra": "Algún texto"
},
"key": "WcB00KaCCtp+UUZKESvBMoCC+1Kvwn2ko6FT\/Nf5NYQ=",
"encryp": {
"iv": "C7VvPa6E0Kq\/0SWhnf4lsg==",
"message": "xzgbSt+Yy5DK7MKaOpBqcxy9nmAb25REpu4Nm2kPnOvJTxA8JbcN+khnYJ8i7esi"
},
"decrypt": {
"id": 5,
"dato_extra": "Algún texto"
}
}
*/
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment