PHP PKCS7填充错误

PHP PKCS7填充错误,php,encryption,padding,mcrypt,pkcs#7,Php,Encryption,Padding,Mcrypt,Pkcs#7,我正在尝试将PKCS7填充应用于我的PHP代码。我从这个要点中导出了我的代码 块大小预计为16字节。 数据是长度为8字节的密码。 在获得pad之后,它会将其附加到要加密的数据的末尾 $blockSize = mcrypt_get_block_size(MCRYPT_RIJNDAEL_128, $thisMCRYPT_MODE_CBCmode); $pad = $blockSize - (strlen($data) % $blockSize); $data = $data . str_repeat

我正在尝试将PKCS7填充应用于我的PHP代码。我从这个要点中导出了我的代码

块大小预计为16字节。 数据是长度为8字节的密码。 在获得pad之后,它会将其附加到要加密的数据的末尾

$blockSize = mcrypt_get_block_size(MCRYPT_RIJNDAEL_128, $thisMCRYPT_MODE_CBCmode);
$pad = $blockSize - (strlen($data) % $blockSize);
$data = $data . str_repeat(chr($pad), $pad);
问题是有很多情况下数据无法解密

下面提供的是base64编码的样本数据。解码样本的前16个字节表示IV

工作:cjg1RYWxlc8bDH2de43t0bv1ug36i8ayjWDQTela938=焊盘长度:8

不工作:9wWI+MYJ5ZVJ2SC4XR7EGOSGNSOETZW1YM8DDMQG18=焊盘长度: 122

上面提到的焊盘长度是使用此

$pad = ord($data[strlen($data) - 1]);
我正在使用mcrypt_enrypt加密字符串密码。我为mcrypt使用的键是

lGbsVE+QVO1P2UE0ICJRTMPU5HKX9HE7R1AUUEQFAG=


填充/取消添加例程看起来是正确的。它没有提供的是防止填充值高于块大小的保护

如果使用错误的密钥对密文进行解密,或者如果密文已损坏,并且对于短大小的密文,即使IV不正确,结果将是包含看似随机数据的填充明文。因此,最后一个字节可以在添加错误结果的过程中具有任意随机值


为了防止此类故障,请在密文上使用MAC值,最好使用不同的密钥。目前,问题不太可能是取消添加例程。

解决了它。通过http传输时,base64编码数据中的+符号将转换为空格,从而产生不同的值


我所做的是客户端将二进制数据编码到base64,并通过urlencode函数传递它。PHP端使用rawurldecode处理数据,因此它将忽略+符号。

失败?您指的是使用错误的键。。密文被破坏了吗?或者您指的是高于块大小失败的填充值?我在问题中提到的关键是正确的。这是我在加密两个样本时使用的同一个密钥。您使用的填充/取消添加方案似乎相当常见。除非我大错特错,否则只有当最后一个字节的值为122时,才能得到这个错误的结果。这应该很容易检查。请注意,如果明文包含00个有值字符,我不能100%确定会发生什么。