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 otroAES256_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
- defuse/php-encryption
- PECL libsodium
- Halite (envoltorio de libsodium, ahora estable)
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;
}