Java CryptoCipher不消耗所有输入字节

时间:2017-02-09 21:52:51

标签: java encryption apache-commons

我试图将使用Chilkat的专有解密库转换为Apache的公共密码。我有2个示例加密输入我正在使用。第一个是16个字节,第二个是96个字节。第一个很好用,但在第二个上,CryptoCipher似乎没有消耗最后16个字节。

这里是设置和解密以及输出的一些示例代码:

--16
encln 16
consume 0
finish 13

这为2个输入产生了这2个输出:

短输入:

--96
encln 96
consume 80
finish 3

长输入:

                <div class="panel-group" id="accordion">
                    <div class="panel panel-default">
                        <div class="panel-heading" data-toggle="collapse"  data-parent="#accordion">
                            <h2 class="panel-title">
                                <h4>this is a title</h4>
                            </h2>
                        </div>
                        <div class="panel-collapse collapse" data-toggle="collapse">
                            <table>
                                <tbody>
                                       //There's a bunch of stuff in this table
                                </tbody>
                            </table>
                        </div>
                    </div>
                </div>

正如你所看到的那样,它只消耗80个字节的输入...由于较短的输入产生了正确的输出,与Chilkat产生的相比,我不知道在哪里接近这个让它与更长的输入一起工作。

1 个答案:

答案 0 :(得分:4)

crypt.update()crypt.doFinal(..)返回的数字是解密的字节数,而不是操作消耗的字节数。当您的数据被填充(或者至少将其指定为 PKCS5Padded )时,您的加密数据将始终比解密版本大一些。使用 PSCS5 AES ,填充将添加1到16个字节的填充到最接近的16个字节的多个字节,即 AES 的块大小。

在第一个示例中,13个字节的清除数据具有3个字节的填充,提供16个字节的加密数据(或一个完整的AES块)。在第二个示例中,您有83个字节的清除数据和13个字节的填充(提供6个16字节的AES块)。