我正在尝试将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 =
答案 0 :(得分:0)
填充/取消填充例程看起来正确。它没有提供的是防止填充值高于块大小的保护。
如果使用错误密钥解密密文,或者密文被破坏(对于短密文密文,即使IV不正确),结果将是具有看似随机数据的(填充)明文。因此,在取消填充不正确的结果期间,最后一个字节可以包含任何随机值。
为防止此类故障,请在密文上使用MAC值,最好使用不同的密钥。目前,问题不太可能是(un)填充例程。
答案 1 :(得分:0)
解决了它。 base64编码数据中的“+”符号在通过http传输时被转换为空格,从而产生不同的值。
我所做的是客户端将二进制数据编码为base64并通过urlencode()函数传递。 PHP方使用 rawurldecode 处理数据,因此它将忽略“+”符号。