2015-05-27 25 views
5

Ho il seguente codice che ha funzionato bene su PHP 5.5.9.mcrypt_encrypt non funziona correttamente su PHP 5.6.9

function index() 
{ 
    echo $this->encryptText_3des('TEST','JHHKJH9879'); 
} 

function encryptText_3des($plainText, $key) { 
    $key = hash("md5", $key, TRUE); 
    for ($x=0;$x<8;$x++) { 
     $key = $key.substr($key, $x, 1); 
    } 
    $padded = $this->pkcs5_pad($plainText, 
    mcrypt_get_block_size(MCRYPT_3DES, MCRYPT_MODE_CBC)); 
    $encrypted = base64_encode(mcrypt_encrypt(MCRYPT_3DES, $key, $padded, MCRYPT_MODE_CBC)); 
    return $encrypted; 
} 

function pkcs5_pad ($text, $blocksize) 
{ 
    $pad = $blocksize - (strlen($text) % $blocksize); 
    return $text . str_repeat(chr($pad), $pad); 
} 

La crittografia stava accadendo fine.But nel 5.6.9, il PHP nel doc di mcrypt_encrypt, accennano che

chiave non valido e iv dimensioni non sono più accettate. mcrypt_encrypt() genererà un avviso e restituirà FALSE se gli input non sono validi. In precedenza le chiavi e le IV venivano riempite con byte "\ 0" alla successiva dimensione valida.

Come modifico il mio codice corrente con il quinto parametro senza alterare l'algoritmo di crittografia?

ho cercato

$iv_size = mcrypt_get_iv_size(MCRYPT_3DES, MCRYPT_MODE_CBC); 
$iv = mcrypt_create_iv($iv_size, MCRYPT_RAND); 

e dato $ IV come quinto parametro.

Ma non ha funzionato. La crittografia era diversa da quella precedente.

risposta

2

trovato la risposta nel caso qualcuno ha bisogno

$ivSize = 8; 
$iv = str_repeat("\0", $ivSize); 

$encrypted = base64_encode(mcrypt_encrypt(MCRYPT_3DES, $key, $padded, MCRYPT_MODE_CBC, $iv)); 

passa un quinto parametro manualmente che la versione precedente faceva da sola!

4

Non emulare il comportamento debole delle versioni precedenti di PHP per l'inizializzazione di IV.

Utilizzare mcrypt_create_iv().

Hanno rimosso l'auto zero-byte iv per un motivo .

+0

Mentre sono d'accordo che un IV a caso dovrebbe essere utilizzato, potrebbe non essere applicabile al caso PO, perché hanno già una libreria piena di testi cifrati che devono essere compatibili. –

+0

@ArtjomB. buon punto, per garantire la decrittografia dei testi cifrati "legacy", il "vecchio" iv deve essere usato .. – DanFromGermany

+1

Assicurati di usare anche 'MCRYPT_DEV_URANDOM'! –

0

Vi consiglierei di non reinventare la ruota poiché la vostra funzione ha numerosi difetti di ingegneria crittografica.

  • Non utilizzare 3DES, utilizzare AES. La costante di mcrypt corretta per AES è MCRYPT_RIJNDAEL_128, indipendentemente dalla dimensione della chiave desiderata. Mcrypt is pretty terrible.
  • Non utilizzare md5() come funzione di derivazione chiave. Se ti senti necessario avere un KDF (ad esempio perché stai utilizzando una password invece di memorizzare una chiave di crittografia), utilizza hash_pbkdf2() con SHA-256.
  • Si sta crittografando ma non si autentica il testo cifrato. Secret-key encryption without message authentication is NOT secure in any language! Encrypt-Then-MAC per favore.

Se avete intenzione di utilizzare mcrypt (le nostre raccomandazioni per secure data encryption in PHP sono da utilizzare libsodium, se è possibile, altrimenti defuse/php-encryption, altrimenti OpenSSL), assicurarsi che si passa la costante corretta a mcrypt_create_iv().

Bad:

$iv = mcrypt_create_iv(16, MCRYPT_RAND); // BAD EXAMPLE 

Buono:

$iv = mcrypt_create_iv(16, MCRYPT_DEV_URANDOM); // YES!