PHP PKCS7填充错误

时间:2014-06-07 09:49:19

标签: php encryption padding mcrypt pkcs#7

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

https://gist.github.com/Halama/5956871

块大小预计为16个字节。 数据是“密码”,长度为8个字节。 获取填充后,它会将其附加到要加密的数据的末尾。

$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 + MyYj5ZVj2sC4xr7EgOsgNSoeTZW1yM8ddmqg18 =(打击垫长度:   122)

使用此

检索上述垫长度
$pad = ord($data[strlen($data) - 1]);

我正在使用mcrypt_enrypt来加密字符串“password”。我用于mcrypt的密钥是

  

lGbsVE + qVO1P2ue0iCjrTPMU5hKX9aHE7r1aUUeqFag =

2 个答案:

答案 0 :(得分:0)

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

如果使用错误密钥解密密文,或者密文被破坏(对于短密文密文,即使IV不正确),结果将是具有看似随机数据的(填充)明文。因此,在取消填充不正确的结果期间,最后一个字节可以包含任何随机值。

为防止此类故障,请在密文上使用MAC值,最好使用不同的密钥。目前,问题不太可能是(un)填充例程。

答案 1 :(得分:0)

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

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