【发布时间】:2019-06-01 00:59:38
【问题描述】:
我读过一篇关于密码方法 update() 和 dofinal() 之间区别的文章。 这是关于如果我们要加密 4 字节数组会发生什么,当密码的块大小例如为 8 字节时。如果我们在这里调用更新,它将返回 null。我的问题是:如果我们用 4 字节数组调用 doFinal() 进行加密,缓冲区大小为 8 字节,返回时会收到多少字节的编码数据?
【问题讨论】:
标签: security cryptography padding
我读过一篇关于密码方法 update() 和 dofinal() 之间区别的文章。 这是关于如果我们要加密 4 字节数组会发生什么,当密码的块大小例如为 8 字节时。如果我们在这里调用更新,它将返回 null。我的问题是:如果我们用 4 字节数组调用 doFinal() 进行加密,缓冲区大小为 8 字节,返回时会收到多少字节的编码数据?
【问题讨论】:
标签: security cryptography padding
update():一次又一次地提供数据,使您能够加密长文件、流。
dofinal():将请求的填充方案应用于数据,如果请求和必要,然后加密。 ECB 和 CBC 模式需要填充,但 CTR 模式不需要。如果 NOPADDING 使用了某些库可能secretly pad,在其他库中您必须自己处理填充。
调用时,dofinal()带有4字节数据,如果没有设置NOPADDING,会被填充然后加密。
来自 Java 文档;
update(byte[] input)
继续多部分加密或解密操作(取决于此密码的初始化方式),处理另一个数据部分。doFinal()
完成多部分加密或解密操作,具体取决于此密码的初始化方式。【讨论】:
update 可能不会缓存任何明文,或者它可能会缓存一块明文以用于 CTR 模式。对于 GCM 模式等认证模式,在doFinal 期间也会生成认证标签值。更奇怪的是,GCM模式在解密过程中也需要缓存数据,不会因为那个标签值而直接解密。对于 RSA,update 方法将缓存尽可能多的数据,直到您调用 doFinal,同时所有密文一次返回。
doFinal 也确实如此,但是如果缓冲区中有任何剩余字节(在最终处理之后 - doFinal 可能会接受额外的输入),它将抛出 IllegalBlockSizeException, 异常而不是返回零字节。