2014-01-13 44 views
3

我知道PHP的mcrypt_decrypt已經有一百萬個帖子,但是我找不到與我的結果相同的結果。我有一對簡單的加密/解密函數,我想用它來對數據執行雙向加密。奇怪的是,對於我提供給函數的任意隨機字符串的大約4%,它不會成功解密。例如,如果我創建一個從0到9999的「for循環」,並對這些數字的字符串版本進行加密和解密,每次都會失敗相同的值,這些值取決於我傳遞給函數的鍵。我可以傳遞任何關鍵字,雖然失敗的特定值將會改變,但失敗的值的百分比將保持大致不變。PHP Mcrypt - Decrypt函數對於字符串的一小部分不起作用

我已經嘗試過沒有IV參數的ECB模式,並且我嘗試了使用IV參數的CBC模式,並且它會得到相同的結果。

這裏是ECB模式我的加密功能:

function mc_encrypt($string, $mc_key) { 
    $passcrypt = trim(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $mc_key, trim($string), MCRYPT_MODE_ECB)); 
    $encode = base64_encode($passcrypt); 

    return $encode; 
} 

這裏是ECB模式我的解密功能:

function mc_decrypt($string, $mc_key) { 
    $decoded = base64_decode($string); 
    $decrypted = trim(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $mc_key, trim($decoded), MCRYPT_MODE_ECB)); 

    return $decrypted; 
} 

CBC模式的版本是一樣的,只不過它採用的mcrypt_create_iv ()函數在加密中創建IV,並將其作爲解密參數傳入。

我的「ABC」作爲測試加密密鑰服務器上使用這些功能,如果我從0到300運行,下面的值將不能正確解密:

4,6,70,145,151 ,176,237,254,275

如果我將我的加密密鑰更改爲其他值,它將會正確地返回哪些值,但不會更改值返回的頻率。

任何建議???

在此先感謝!

+2

+1用於故障排除嘗試,因爲這是friggin'怪異的結果。 – BrianHall

回答

5

我剛剛從你的代碼中調用了兩個trim()調用,它可以工作。基本上,mcrypt_encrypt可能會返回帶有空尾字節(\ 0)的答案,需要保留這些答案。另外,出於同樣的原因,請勿將$ encoded參數修剪爲mcrypt_decrypt。當修整來自mcrypt_decrypt的響應時,僅使用rtrim

function mc_encrypt($string, $mc_key) { 
    $passcrypt = mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $mc_key, trim($string), MCRYPT_MODE_ECB); 
    $encode = base64_encode($passcrypt); 

    return $encode; 
} 

function mc_decrypt($string, $mc_key) { 
    $decoded = base64_decode($string); 
    $decrypted = rtrim(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $mc_key, $decoded, MCRYPT_MODE_ECB)); 

    return $decrypted; 
} 
+1

填充將結束。所以應該使用rtrim()而不是trim()。 – ManuelH

+0

@ManuelH,你說得對,mcrypt_decrypt響應應該使用rtrim(),而不是修剪,現在正在更新。 – Jay

+1

你是冠軍,我的朋友。 – TonyTheJet