2012-11-12 69 views
7

Tôi đã có chức năng mã hóa hoạt động đúng cách tuy nhiên tôi không thể tìm ra cách để có được chức năng giải mã để cung cấp đầu ra phù hợp.Mã hóa/giải mã PHP với TripleDes, PKCS7 và ECB

Đây là chức năng mã hóa của tôi:

function Encrypt($data, $secret) 
{  
    //Generate a key from a hash 
    $key = md5(utf8_encode($secret), true); 

    //Take first 8 bytes of $key and append them to the end of $key. 
    $key .= substr($key, 0, 8); 

    //Pad for PKCS7 
    $blockSize = mcrypt_get_block_size('tripledes', 'ecb'); 
    $len = strlen($data); 
    $pad = $blockSize - ($len % $blockSize); 
    $data .= str_repeat(chr($pad), $pad); 

    //Encrypt data 
    $encData = mcrypt_encrypt('tripledes', $key, $data, 'ecb'); 

    return base64_encode($encData); 

} 

Đây là chức năng giải mã của tôi:

function Decrypt($data, $secret) 
{ 
    $text = base64_decode($data); 

    $data = mcrypt_decrypt('tripledes', $secret, $text, 'ecb'); 

    $block = mcrypt_get_block_size('tripledes', 'ecb'); 
    $pad = ord($data[($len = strlen($data)) - 1]); 

    return substr($data, 0, strlen($data) - $pad); 
} 

Ngay bây giờ tôi đang sử dụng một chìa khóa của test và tôi đang cố gắng để mã hóa 1234567. Tôi nhận được đầu ra base64 từ mã hóa mà tôi đang tìm kiếm, nhưng khi tôi giải mã nó sẽ không trả về gì cả (một vùng trống).

Tôi không thạo nhiều về mã hóa/giải mã nên mọi trợ giúp đều được đánh giá cao !!

+2

Tôi khuyên bạn nên thay thế 3DES bằng AES, ECB bằng CBC và thêm MAC. – CodesInChaos

+0

Cảm ơn bạn đã giới thiệu @CodesInChaos. Tôi không thể thay đổi các chi tiết cụ thể như vậy và phải sử dụng những gì tôi có mặc dù nó có thể kém an toàn hơn. –

Trả lời

14

Cảm ơn bất kỳ ai đã xem xét vấn đề của tôi. Tôi nghĩ rằng tôi đã giải quyết nó và đây là giải pháp đầy đủ của tôi. Hy vọng rằng nó giúp người khác có vấn đề tương tự:

function Encrypt($data, $secret) 
{  
    //Generate a key from a hash 
    $key = md5(utf8_encode($secret), true); 

    //Take first 8 bytes of $key and append them to the end of $key. 
    $key .= substr($key, 0, 8); 

    //Pad for PKCS7 
    $blockSize = mcrypt_get_block_size('tripledes', 'ecb'); 
    $len = strlen($data); 
    $pad = $blockSize - ($len % $blockSize); 
    $data .= str_repeat(chr($pad), $pad); 

    //Encrypt data 
    $encData = mcrypt_encrypt('tripledes', $key, $data, 'ecb'); 

    return base64_encode($encData); 

} 

Và đây là chức năng giải mã mới.

function Decrypt($data, $secret) 
{ 

    //Generate a key from a hash 
    $key = md5(utf8_encode($secret), true); 

    //Take first 8 bytes of $key and append them to the end of $key. 
    $key .= substr($key, 0, 8); 

    $data = base64_decode($data); 

    $data = mcrypt_decrypt('tripledes', $key, $data, 'ecb'); 

    $block = mcrypt_get_block_size('tripledes', 'ecb'); 
    $len = strlen($data); 
    $pad = ord($data[$len-1]); 

    return substr($data, 0, strlen($data) - $pad); 
} 

Tôi phải thêm cùng một mã để tạo khóa ở định dạng đúng trước khi tôi chạy hàm mycrypt_decrypt.

+1

Rất hữu ích, cảm ơn! –

+1

Cảm ơn bạn rất nhiều! –

+1

$ block không bao giờ được sử dụng trong hàm Decrypt – omarjebari

Các vấn đề liên quan