2011-09-16 10 views
5

Ok, he intentado crear mis propios métodos de cifrado/descifrado usando PHP mcrypt, y cuando los publiqué hace un tiempo algunos los llamaron "basura". Mencionaban cosas sobre "Vectores de inicialización" y demás. Básicamente, ¿cómo puedo hacer que estos métodos de criptografía mejor:métodos apropiados de cifrado mcrypt de PHP?

function encrypt($key, $data){ 
    $encrypted_data = mcrypt_cbc(MCRYPT_RIJNDAEL_192, $key, $data, MCRYPT_ENCRYPT); 
    return base64_encode($encrypted_data); 
} 

function decrypt($key, $encryptedData){ 
    $dec = base64_decode($encryptedData); 
    $decrypt = mcrypt_cbc(MCRYPT_RIJNDAEL_192, $key, $dec, MCRYPT_DECRYPT); 
    return trim($decrypt); 
} 

Quiero que estos trabajen lo mejor que pueden sin que yo soy un pato en un nuevo mundo cuando se trata de mcrypt, cualquier sugerencia es bienvenida, gracias!

Respuesta

3

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

+0

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

+0

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. –

+0

Entonces, ¿debemos almacenar el IV para descifrar los datos? – xendi

2

Puede crear una vía intravenosa con mcrypt_create_iv(), utilizando el tamaño adecuado para su modo de encriptación.

$size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_192, MCRYPT_MODE_CBC); 
$iv = mcrypt_create_iv($size, MCRYPT_DEV_RANDOM); 

luego pasarlo a mcrypt_cbc() como el quinto parámetro opcional. Los únicos cambios que he hecho aquí a sus funciones originales son acontecerá en $iv:

function encrypt($key, $data, $iv){ 
    $encrypted_data = mcrypt_cbc(MCRYPT_RIJNDAEL_192, $key, $data, MCRYPT_ENCRYPT, $iv); 
    return base64_encode($encrypted_data); 
} 

function decrypt($key, $encryptedData, $iv){ 
    $dec = base64_decode($encryptedData); 
    $decrypt = mcrypt_cbc(MCRYPT_RIJNDAEL_192, $key, $dec, MCRYPT_DECRYPT, $iv); 
    return trim($decrypt); 
} 
+0

En la encriptación está usando 'MCRYPT_RIJNDAEL_192', así que asegúrese de usar eso en' mcrypt_get_iv_size' para asegurarse de que el Vector de Inicialización tenga la longitud correcta. –

+1

@Rocket Fixed. Copiar/pegar error –

Cuestiones relacionadas