mcrypt_decrypt - 奇怪的填充(不是默认的,不是null)

时间:2012-07-16 16:01:13

标签: php cryptography padding

我正在尝试使用对称解密代码如下:

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

我遇到奇怪的结果(没有人质疑)。 我不知道为什么方法mcrypt_decrypt返回解密文本,其填充符合字节值,等于填充字符数。根据php手册,该方法应使用零值字节填充其返回值。

为了澄清它,我在下面放了两个例子:

[以上调用mcrypt_decrypt pad将字符串返回长度为32]

示例1

  

plainText ='text'

     

'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

  

'12345678901234567890'

     

长度= 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}

我该怎么做才能改变它?我有使用方法rtrim(“\ 0”)删除填充的问题,因为填充不是空的。

1 个答案:

答案 0 :(得分:9)

如果要加密的字符串长度不正确,mcrypt_encrypt将使用\0填充它。加密你正在解密的字符串的人首先添加了他们自己的填充,所以PHP不需要填充它。这种类型的填充称为PKCS7 padding

要删除它,你可以尝试这样的东西(从here偷来):

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