2011-09-16 49 views
5

Ok, tôi đã cố gắng tạo các phương pháp mã hóa/giải mã của riêng mình bằng cách sử dụng PHP mcrypt và khi tôi đăng chúng một lúc, một số đã gọi chúng là "thùng rác". Họ đã đề cập đến những điều về "Initialization Vectors" và như vậy. Về cơ bản, làm thế nào tôi có thể làm cho các phương pháp mã hóa tốt hơn:phương pháp mã hóa PHP đúng mã hóa 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); 
} 

Tôi muốn này để làm việc tốt nhất họ có thể ngoại trừ tôi một con vịt trong một thế giới hoàn toàn mới khi nói đến mcrypt, bất cứ đề nghị được hoan nghênh, cảm ơn!

Trả lời

3

Đây là đoạn trích các hàm mcrypt tôi sử dụng. Chúng sử dụng mcrypt_genericmdecrypt_generic, sẽ được sử dụng theo 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); 
} 

Tôi cũng không biết nhiều về số mcrypt, vì vậy, tôi chỉ cần loại chúng lại với nhau. Tôi md5 phím nên luôn luôn có 32 ký tự (độ dài khóa tối đa) và tôi tính toán ngẫu nhiên "Vector khởi tạo".

Sử dụng PKCS7 Padding thì tốt hơn vì bạn có thể có chuỗi kết thúc bằng khoảng trắng (như trim sẽ loại bỏ điều đó), cũng mã hóa hiệu quả hơn khi chuỗi có độ dài nhất định.

Tôi đang sử dụng AES 256 (MCRYPT_RIJNDAEL_256) tại đây, nhưng AES 192 (MCRYPT_RIJNDAEL_192) cũng sẽ hoạt động.

Demo: http://ideone.com/WA5Tk

+0

Tôi chỉ tự hỏi nếu bạn đã nghe phản hồi về sức mạnh của các chức năng này. Tôi nghĩ rằng họ trông tốt, thậm chí có thể sử dụng chúng bản thân mình ... nhưng điều này là một chút trên tôi, phải trung thực ... – Shackrock

+0

Tôi đã viết những bản thân mình sau khi tìm kiếm xung quanh và tìm kiếm khác (tương tự) chức năng. Họ có vẻ mạnh mẽ, không chắc họ mạnh mẽ như thế nào, phải trung thực. –

+0

Vì vậy, chúng ta cần lưu trữ IV để giải mã dữ liệu? – xendi

2

Bạn có thể tạo một iv với mcrypt_create_iv(), sử dụng kích thước phù hợp với chế độ mã hóa của bạn.

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

Sau đó, chuyển đến mcrypt_cbc() làm thông số thứ 5 tùy chọn. Những thay đổi duy nhất tôi đã thực hiện ở đây đối với các chức năng ban đầu của bạn là để vượt qua trong $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

Trong mã hóa, anh ta sử dụng 'MCRYPT_RIJNDAEL_192', vì vậy hãy chắc chắn rằng bạn sử dụng nó trong' mcrypt_get_iv_size' để đảm bảo Vector khởi tạo có độ dài phù hợp. –

+1

@Rocket Đã sửa lỗi. Sao chép/dán lỗi. –