Last active
June 3, 2023 18:19
-
-
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
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?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); | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?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