2015-02-06 79 views
2

我試圖做一個加密/解密例程使用mcrypt但它似乎攪亂數據即時嘗試加密。mcrypt搞亂數據

赫雷什的代碼:

$data = 'Some important data'; 
    $key = "mycryptKey"; 
    $cipher = "rijndael-128"; 

    $encryptedData = mcrypt_encrypt($cipher, $key, $data, MCRYPT_MODE_ECB); 
    $decryptedData = mcrypt_decrypt($cipher, $key, $encryptedData, MCRYPT_MODE_ECB); 

    var_dump($data); //string 'Some important data' (length=19) 
    var_dump($encryptedData); //string '™ì{*¾xv-&n5’Œü½Ýëc®n)mSƒ7]' (length=32) 
    var_dump($decryptedData); //string 'Some important data�������������' (length=32) 

它保持在原來的字符串的末尾添加這些字符。 我在How do you Encrypt and Decrypt a PHP String?看到一個例子,但它沒有工作

那就是實際測試。關鍵和我使用的數據在這裏

編輯

我意識到,@jonhopkins意見後,認爲mcrypt的被填充後$數據內容有些「\ 0」字貼一樣,所以我使用'strtok'解密後清理它:

$decryptedData = \strtok(mcrypt_decrypt($cipher, $key, $encryptedData, MCRYPT_MODE_ECB), "\0"); 
var_dump($decryptedData); //string 'Some important data' (length=19) 
+2

如果我不得不猜測,我猜測加密方法會自動填充字符串。 IIRC rijndael-128要求其輸入的長度爲16的倍數,所以'mcrypt_encrypt'填充0到32字節,但我認爲'mcrypt_decrypt'無法確定原始長度,因此它將離開這些額外的字節。 – jonhopkins 2015-02-06 03:34:46

+0

你是天才@jonhopkins!但是繼承人另一個問題:如果我傳遞給mcrypt之前必須修改它,如何返回相同的數據? – CarlosCarucce 2015-02-06 03:50:48

+0

這是一個很好的問題,我希望我知道答案......我甚至不能100%確定發生了什麼事情。但如果我能找到任何我會讓你知道的。編輯:http://stackoverflow.com/q/20507050這可能會幫助 – jonhopkins 2015-02-06 03:54:39

回答

1

你在這裏丟失的是填充;要加密的數據必須先補齊:

$data = pkcs7_pad($data, 16); 

同樣,解密後,你需要扭轉填充:使用

$decryptedData = pkcs7_unpad($decryptedData, 16); 

功能:

function pkcs7_unpad($data) 
{ 
    return substr($data, 0, -ord($data[strlen($data) - 1])); 
} 

function pkcs7_pad($data, $size) 
{ 
    $length = $size - strlen($data) % $size; 
    return $data . str_repeat(chr($length), $length); 
} 

此外,這是重要的請注意,mcrypt擴展名比較老,維護不好;我建議改用OpenSSL。完整的示例請參閱我的earlier answer