2012-11-12 124 views
7

我有我的加密功能正常工作,但我無法弄清楚如何獲得正確的輸出解密功能。PHP使用TripleDes,PKCS7和ECB加密/解密

這裏是我的加密功能:

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

} 

這裏是我的解密功能:

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

現在我使用的test的關鍵,我試圖加密1234567。我從我正在尋找的加密中獲得base64輸出,但是當我去解密時,它不會返回任何內容(空白區域)。

我不是很熟悉加密/解密,所以任何幫助非常感謝!

+2

我建議用AES和ECB替換3DES並添加MAC。 – CodesInChaos

+0

感謝您的建議@CodesInChaos。我無法改變這樣的細節,並且必須使用我所擁有的,儘管它可能不太安全。 –

回答

14

感謝任何看過我的問題的人。我想我已經解決了,這是我的完整解決方案。希望它可以幫助別人誰有類似的問題:

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

} 

這裏是新的解密功能。

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

我必須在運行mycrypt_decrypt函數之前添加相同的代碼,以正確的格式生成密鑰。

+1

非常有幫助,謝謝! –

+1

非常感謝! –

+1

Decrypt函數中永遠不會使用$ block – omarjebari