2011-09-16 11 views
5

Ok, ho provato a creare i miei metodi di crittografia/decrittografia usando PHP mcrypt, e quando li ho pubblicati qualche tempo fa alcuni li chiamavano "trash". Stavano citando cose su "Vettori di inizializzazione" e così via. In sostanza, come posso fare questi metodi di crittografia migliore:metodi di crittografia PHP mcrypt corretti?

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); 
} 

voglio che questi funzionino il meglio che possono tranne che io sono un anatra in un mondo nuovo, quando si tratta di mcrypt, tutti i suggerimenti sono i benvenuti, grazie!

risposta

3

Ecco uno snippet delle funzioni di mcrypt che utilizzo. Utilizzano mcrypt_generic e mdecrypt_generic, che devono essere utilizzati in base allo 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); 
} 

Non so molto su mcrypt neanche, quindi ho solo un po hacked questi insieme. I md5 la chiave quindi è sempre composta da 32 caratteri (la lunghezza massima della chiave) e calcolando casualmente un "Vettore di inizializzazione".

Utilizzando PKCS7 Padding è meglio perché si può avere le stringhe che terminano con uno spazio bianco (come trim eliminerebbe quello), anche la crittografia è più efficiente quando la stringa è una certa lunghezza.

Sto usando AES 256 (MCRYPT_RIJNDAEL_256) qui, ma anche AES 192 (MCRYPT_RIJNDAEL_192) funzionerebbe.

Demo: http://ideone.com/WA5Tk

+0

Mi chiedo solo se hai sentito tutte le risposte circa la forza di queste funzioni. Penso che abbiano un bell'aspetto, potrebbero persino usarli io stesso ... ma questo è un po 'sopra di me, ad essere onesti ... – Shackrock

+0

Ho scritto questi dati dopo aver cercato in giro e trovato altre (simili) funzioni. Sembrano forti, non sono sicuro di quanto siano forti, ad essere onesti. –

+0

Quindi dobbiamo memorizzare la IV per decrittografare i dati? – xendi

2

È possibile creare una flebo con mcrypt_create_iv(), utilizzando la dimensione appropriata per la modalità di crittografia.

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

poi passarlo al mcrypt_cbc() come il 5 ° parametro opzionale. Le uniche modifiche che ho apportato qui per le funzioni originali sono di passare in $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

Nella crittografia sta usando 'MCRYPT_RIJNDAEL_192', quindi assicurati di usarlo in' mcrypt_get_iv_size' per assicurarti che il vettore di inizializzazione sia della lunghezza giusta. –

+1

@Rocket corretto. Copia/incolla errore. –