openssl_encrypt openssl_decrypt encrypt ejemplo decrypt php security encryption aes

openssl_decrypt - php encrypt aes 256



Encriptación AES-256 en PHP (4)

Necesito una función de PHP, AES256_encode($dataToEcrypt) para encriptar los $data en AES-256 y otro AES256_decode($encryptedData) haga lo contrario. ¿Alguien sabe qué código debe tener esta función?

Hay una diferencia entre el cifrado y la codificación .

¿ Realmente necesitas AES-256? La seguridad de AES-256 frente a AES-128 no es tan significativa; es más probable que se arruine en la capa de protocolo que en el pirateo porque utilizó un cifrado de bloque de 128 bits en lugar de un cifrado de bloque de 256 bits.

Importante: use una biblioteca

Una implementación AES-256 rápida y sucia

Si está interesado en construir uno propio, no por el bien de implementarlo en producción, sino por su propia educación, he incluido una muestra AES256

/** * This is a quick and dirty proof of concept for StackOverflow. * * @ref http://stackoverflow.com/q/6770370/2224584 * * Do not use this in production. */ abstract class ExperimentalAES256DoNotActuallyUse { /** * Encrypt with AES-256-CTR + HMAC-SHA-512 * * @param string $plaintext Your message * @param string $encryptionKey Key for encryption * @param string $macKey Key for calculating the MAC * @return string */ public static function encrypt($plaintext, $encryptionKey, $macKey) { $nonce = random_bytes(16); $ciphertext = openssl_encrypt( $plaintext, ''aes-256-ctr'', $encryptionKey, OPENSSL_RAW_DATA, $nonce ); $mac = hash_hmac(''sha512'', $nonce.$ciphertext, $macKey, true); return base64_encode($mac.$nonce.$ciphertext); } /** * Verify HMAC-SHA-512 then decrypt AES-256-CTR * * @param string $message Encrypted message * @param string $encryptionKey Key for encryption * @param string $macKey Key for calculating the MAC */ public static function decrypt($message, $encryptionKey, $macKey) { $decoded = base64_decode($ciphertext); $mac = mb_substr($message, 0, 64, ''8bit''); $nonce = mb_substr($message, 64, 16, ''8bit''); $ciphertext = mb_substr($message, 80, null, ''8bit''); $calc = hash_hmac(''sha512'', $nonce.$ciphertext, $macKey, true); if (!hash_equals($calc, $mac)) { throw new Exception(''Invalid MAC''); } return openssl_decrypt( $ciphertext, ''aes-256-ctr'', $encryptionKey, OPENSSL_RAW_DATA, $nonce ); } }

Uso

Primero, genera dos claves (sí, dos de ellas) y guárdalas de alguna manera.

$eKey = random_bytes(32); $aKey = random_bytes(32);

Luego, para cifrar / descifrar mensajes:

$plaintext = ''This is just a test message.''; $encrypted = ExperimentalAES256DoNotActuallyUse::encrypt($plaintext, $eKey, $aKey); $decrypted = ExperimentalAES256DoNotActuallyUse::decrypt($encrypted, $eKey, $aKey);

Si no tiene random_bytes() , obtenga random_compat .

Necesito una función de PHP, AES256_encode($dataToEcrypt) para encriptar los $data en AES-256 y otro AES256_decode($encryptedData) haga lo contrario. ¿Alguien sabe qué código debe tener esta función?


Mira el módulo mcrypt

Ejemplo AES-Rijndael tomado de here

$iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC); $iv = mcrypt_create_iv($iv_size, MCRYPT_DEV_URANDOM); $key = pack(''H*'', "bcb04b7e103a0cd8b54763051cef08bc55abe029fdebae5e1d417e2ffb2a00a3"); # show key size use either 16, 24 or 32 byte keys for AES-128, 192 # and 256 respectively $key_size = strlen($key); echo "Key size: " . $key_size . "/n"; $text = "Meet me at 11 o''clock behind the monument."; echo strlen($text) . "/n"; $crypttext = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key, $text, MCRYPT_MODE_CBC, $iv); echo strlen($crypttext) . "/n";

Esta es la función de descifrado


MCRYPT_RIJNDAEL_256 no es equivalente a AES_256.

La forma de hacer que RIJNDAEL se descifre de AES es usar MCRYPT_RIJNDAEL_128 y rellenar la cadena para encriptar antes de encriptar

AES-256 tiene BlockSize = 128bit y KeySize = 256bit Rijndael-256 tiene BlockSize = 256bit y KeySize = 256bit

Solo AES / Rijndael 128bit son idénticos. Rijndael-192 y Rijndael-256 no son idénticos a AES-192 y AES-256 (los tamaños de los bloques y el número de rondas son diferentes).


$key = ''324325923495kdfgiert734t''; // key used for decryption in jasper code $text = ''string_to_be_encrypted''; $encrypted = fnEncrypt($text, $key); function fnEncrypt( $plaintext, $key ) { $plaintext = pkcs5_pad($plaintext, 16); return bin2hex(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, hex2bin($key), $plaintext, MCRYPT_MODE_ECB)); } function pkcs5_pad ($text, $blocksize) { $pad = $blocksize - (strlen($text) % $blocksize); return $text . str_repeat(chr($pad), $pad); } function hex2bin($hexdata) { $bindata = ""; for ($i = 0; $i < strlen($hexdata); $i += 2) { $bindata .= chr(hexdec(substr($hexdata, $i, 2))); } return $bindata; }