2011-09-16 12 views
5

Ok, Próbowałem stworzyć własne metody szyfrowania/odszyfrowywania za pomocą PHP mcrypt, a kiedy opublikowałem je jakiś czas temu, niektórzy nazywają je "kosz". Wspominali o rzeczach "Wektory inicjacyjne" i takie. Zasadniczo, w jaki sposób mogę zrobić te metody kryptograficzne lepiej:właściwe metody szyfrowania mcrypt 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); 
} 

Chcę nich pracować najlepiej mogą oprócz tego, że jestem kaczka w nowym świecie, jeśli chodzi o mcrypt, wszelkie sugestie są mile widziane, dzięki!

Odpowiedz

3

Oto fragment opisu funkcji mcrypt, których używam. Używają one mcrypt_generic i mdecrypt_generic, które powinny być używane zgodnie z 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); 
} 

nie wiem zbyt wiele o mcrypt albo, więc po prostu trochę posiekany je razem. I md5 klawisz, więc zawsze jest to 32 znaki (maksymalna długość klucza), a ja losowo obliczam "wektor inicjujący".

Lepiej jest używać , ponieważ możesz mieć ciągi, które kończą się białą przestrzenią (ponieważ trim to usunie), szyfrowanie jest również wydajniejsze, gdy ciąg ma określoną długość.

Używam tutaj AES 256 (MCRYPT_RIJNDAEL_256), ale AES 192 (MCRYPT_RIJNDAEL_192) również by działał.

Demo: http://ideone.com/WA5Tk

+0

Zastanawiam się tylko, czy słyszeliście jakieś opinie o sile tych funkcji. Myślę, że wyglądają dobrze, mogą nawet używać ich samemu ... ale to jest trochę ponad mną, szczerze mówiąc ... – Shackrock

+0

Napisałem je sam po przeszukaniu i znalezieniu innych (podobnych) funkcji. Wydają się być silni, nie do końca pewni, jak silni, szczerze mówiąc. –

+0

Więc musimy przechowywać IV, aby odszyfrować dane? – xendi

2

Można utworzyć IV z mcrypt_create_iv(), stosując odpowiedni rozmiar dla trybu szyfrowania.

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

Następnie przekaż go do mcrypt_cbc() jako opcjonalnego piątego parametru. Jedyne zmiany Zrobiłem tutaj do swoich pierwotnych funkcji mają przechodzić w $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

W szyfrowaniu używa 'MCRYPT_RIJNDAEL_192', więc upewnij się, że używasz go w' mcrypt_get_iv_size', aby upewnić się, że wektor inicjujący jest odpowiedniej długości. –

+1

Naprawiono @Rocket. Skopiuj/wklej błąd. –

Powiązane problemy