我正在尝试使用对称解密代码如下:
$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”)删除填充的问题,因为填充不是空的。
答案 0 :(得分:9)
如果要加密的字符串长度不正确,mcrypt_encrypt
将使用\0
填充它。加密你正在解密的字符串的人首先添加了他们自己的填充,所以PHP不需要填充它。这种类型的填充称为PKCS7 padding
。
要删除它,你可以尝试这样的东西(从here偷来):
$strPad = ord($returnText[strlen($returnText)-1]);
$returnText = substr($returnText, 0, -$strPad);