3

我正在尝试使用带有以下代码的对称解密:

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

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

为了澄清这一点,我在下面放置了两个示例:

[以上mcrypt_decryptpad 的调用返回字符串长度为 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

'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") 方法删除填充时遇到问题,因为填充不是空值。

4

1 回答 1

9

如果要加密的字符串长度不正确,mcrypt_encrypt将用\0s 填充。加密您正在解密的字符串的人首先添加了自己的填充,因此 PHP 不必填充它。这种类型的填充称为PKCS7 padding.

要删除它,你可以尝试这样的事情(从这里偷走):

$strPad = ord($returnText[strlen($returnText)-1]);
$returnText = substr($returnText, 0, -$strPad);
于 2012-07-16T16:04:49.103 回答