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

Bro*_*nek 3 php cryptography padding

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

$encrypted = base64_decode($encryptedBase64String);
$returnText = mcrypt_decrypt(MCRYPT_RIJNDAEL_256, key, $encrypted, MCRYPT_MODE_CBC, iv);
Run Code Online (Sandbox Code Playgroud)

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

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

[以上呼叫mcrypt_decrypt垫返回长度为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}
Run Code Online (Sandbox Code Playgroud)

例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}
Run Code Online (Sandbox Code Playgroud)

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

Roc*_*mat 9

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

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

$strPad = ord($returnText[strlen($returnText)-1]);
$returnText = substr($returnText, 0, -$strPad);
Run Code Online (Sandbox Code Playgroud)