Aquí hay un fragmento de las funciones de mcrypt que uso. Usan mcrypt_generic
y mdecrypt_generic
, que se deben usar de acuerdo con PHP manual.
function encrypt($key, $data){
$b = mcrypt_get_block_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_CBC);
$enc = mcrypt_module_open(MCRYPT_RIJNDAEL_256, '', MCRYPT_MODE_CBC, '');
$iv = mcrypt_create_iv(mcrypt_enc_get_iv_size($enc), MCRYPT_DEV_URANDOM);
mcrypt_generic_init($enc, md5($key), $iv);
// PKCS7 Padding from: https://gist.github.com/1077723
$dataPad = $b-(strlen($data)%$b);
$data .= str_repeat(chr($dataPad), $dataPad);
$encrypted_data = mcrypt_generic($enc, $data);
mcrypt_generic_deinit($enc);
mcrypt_module_close($enc);
return array(
'data' => base64_encode($encrypted_data),
'iv' => base64_encode($iv)
);
}
function decrypt($key, $iv, $encryptedData){
$iv = base64_decode($iv);
$enc = mcrypt_module_open(MCRYPT_RIJNDAEL_256, '', MCRYPT_MODE_CBC, '');
mcrypt_generic_init($enc, md5($key), $iv);
$encryptedData = base64_decode($encryptedData);
$data = mdecrypt_generic($enc, $encryptedData);
mcrypt_generic_deinit($enc);
mcrypt_module_close($enc);
// PKCS7 Padding from: https://gist.github.com/1077723
$dataPad = ord($data[strlen($data)-1]);
return substr($data, 0, -$dataPad);
}
No sé mucho acerca de mcrypt
tampoco, por lo que sólo un poco hackeado estos juntos. I md5
la clave, por lo que siempre tiene 32 caracteres (la longitud máxima de la clave), y calculo aleatoriamente un "Vector de inicialización".
Usar PKCS7 Padding es mejor porque puede tener cadenas que terminan en espacios en blanco (como trim
lo eliminaría), también el cifrado es más eficiente cuando la cadena tiene una longitud determinada.
Estoy usando AES 256 (MCRYPT_RIJNDAEL_256) aquí, pero AES 192 (MCRYPT_RIJNDAEL_192) también funcionaría.
Demostración: http://ideone.com/WA5Tk
me pregunto si ha oído cualquier comentario acerca de la fuerza de estas funciones. Creo que se ven bien, incluso podría usarlos yo mismo ... pero esto está un poco por encima de mí, para ser honesto ... – Shackrock
Escribí esto yo mismo después de buscar y encontrar otras funciones (similares). Parecen fuertes, no están seguros de lo fuertes que son, para ser honestos. –
Entonces, ¿debemos almacenar el IV para descifrar los datos? – xendi