2012-07-16 166 views
3

我試圖使用對稱解密的代碼如下:mcrypt_decrypt - 奇怪的填充(不違約,不空)

$encrypted = base64_decode($encryptedBase64String); 
$returnText = mcrypt_decrypt(MCRYPT_RIJNDAEL_256, key, $encrypted, MCRYPT_MODE_CBC, iv); 

而且我遇到奇怪的結果(因爲沒有人質疑)。 我不知道爲什麼方法mcrypt_decrypt返回解密的文本,填充字節值等於填充的字符數。根據PHP手冊,該方法應該填充零值字節的返回值。

爲了闡明它,我已經把下面兩個例子:

[以上的mcrypt_decrypt焊盤調用返回字符串的32長度]

例1

明文= '文​​本'

'text'的長度是4,所以填充大小是28個字符(32 - 4)

所以我接收returnText爲:

{\116\101\120\116\28\28\28\28\28\28\28\28\28\28\28\28\28\28\28\28\28\28\28\28\28\28\28\28\28\28\28\28\28\28\28\28} 

例2

'123456789'

長度= 20

{\49\50\51\52\53\54\55\56\57\48\49\50\51\52\53\54\55\56\57\48\12\12\12\12\12\12\12\12\12\12\12\12} 

我能做些什麼來改變它?由於填充不是null,因此使用方法rtrim(「\ 0」)刪除填充問題。

+0

注意的Rijndael-256是不是已經被標準化爲AES算法,對於兼容性,你應該嘗試使用Rijndael- 128,可能帶有256位密鑰(128位是塊大小,而不是AES的密鑰大小)。 – 2012-07-16 19:13:57

回答

9

如果要加密的字符串不是正確的長度,mcrypt_encrypt將填充\0 s。無論誰加密你正在解密的字符串,都會首先添加他們自己的填充,所以PHP不必填充它。這種填充類型稱爲PKCS7 padding

要刪除它,你可以嘗試這樣的事情(從here被盜):

$strPad = ord($returnText[strlen($returnText)-1]); 
$returnText = substr($returnText, 0, -$strPad); 
+0

現在它按我的預期工作!智能代碼片段以及有關填充系統知識的有用鏈接。謝謝! – Bronek 2012-07-16 16:43:54

+0

不客氣。我在自己的代碼中使用這種填充類型,所以我認識到它:P – 2012-07-16 16:47:13