我正在尝试将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。
working: cjg1RYWxlc8bDH2de43t0bv1ug36i8ayjWDQTela938= (垫长: 8) 不工作: 9wWI+MyYj5ZVj2sC4xr7EgOsgNSoeTZW1yM8ddmqg18= (垫长: 122)
上面提到的衬垫长度是使用下面的
$pad = ord($data[strlen($data) - 1]);我使用mcrypt_enrypt加密字符串“密码”。我为mcrypt使用的密钥是
lGbsVE+qVO1P2ue0iCjrTPMU5hKX9aHE7r1aUUeqFag=
发布于 2014-06-07 12:05:46
填充/取消填充例程看起来是正确的。它没有提供一个防止填充值高于块大小的保护措施。
如果使用错误的密钥对密文进行解密,或者密码文本已损坏(对于短大小的密文,即使IV不正确),则结果将是一个(填充的)明文,该明文具有看似随机的数据。因此,在不正确结果的解填充过程中,最后一个字节可以具有任意随机值。
为了防止这样的故障,请在密文上使用MAC值,最好使用不同的密钥。目前,问题不太可能是(联合国)填充例程。
https://stackoverflow.com/questions/24095929
复制相似问题