【问题标题】:difference between the methods update() and dofinal() in cipher密码中方法 update() 和 dofinal() 之间的区别
【发布时间】:2019-06-01 00:59:38
【问题描述】:

我读过一篇关于密码方法 update() 和 dofinal() 之间区别的文章。 这是关于如果我们要加密 4 字节数组会发生什么,当密码的块大小例如为 8 字节时。如果我们在这里调用更新,它将返回 null。我的问题是:如果我们用 4 字节数组调用 doFinal() 进行加密,缓冲区大小为 8 字节,返回时会收到多少字节的编码数据?

【问题讨论】:

    标签: security cryptography padding


    【解决方案1】:
    • update():一次又一次地提供数据,使您能够加密长文件、流。

    • dofinal():将请求的填充方案应用于数据,如果请求和必要,然后加密。 ECB 和 CBC 模式需要填充,但 CTR 模式不需要。如果 NOPADDING 使用了某些库可能secretly pad,在其他库中您必须自己处理填充。

    调用时,dofinal()带有4字节数据,如果没有设置NOPADDING,会被填充然后加密。

    来自 Java 文档;

    • update(byte[] input) 继续多部分加密或解密操作(取决于此密码的初始化方式),处理另一个数据部分。
    • doFinal() 完成多部分加密或解密操作,具体取决于此密码的初始化方式。

    【讨论】:

    • 如果我们使用例如 NoPadding?它会被加密并返回 4 个字节吗?
    • 不,你不能。没有填充意味着告诉密码我将处理填充。没有完整的块,块密码就无法运行。但真的取决于图书馆。有些可能secretly pad
    • 请注意可能存在实现差异。例如,update 可能不会缓存任何明文,或者它可能会缓存一块明文以用于 CTR 模式。对于 GCM 模式等认证模式,在doFinal 期间也会生成认证标签值。更奇怪的是,GCM模式在解密过程中也需要缓存数据,不会因为那个标签值而直接解密。对于 RSA,update 方法将缓存尽可能多的数据,直到您调用 doFinal,同时所有密文一次返回。
    • @MaartenBodewes 这些知识需要转化为答案。
    • 对于没有填充的 ECB 和 CBC 模式,很可能最多缓存一个明文块。一旦一个块已满,它将被加密/解密并返回。因此更新可能不返回数据或返回一个或多个数据块。 doFinal 也确实如此,但是如果缓冲区中有任何剩余字节(在最终处理之后 - doFinal 可能会接受额外的输入),它将抛出 IllegalBlockSizeException, 异常而不是返回零字节。
    猜你喜欢
    • 2010-09-24
    • 1970-01-01
    • 2012-06-04
    • 2016-09-06
    • 1970-01-01
    • 1970-01-01
    • 2017-04-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多