2012-07-16 165 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