【发布时间】:2019-06-22 10:13:16
【问题描述】:
我们有一个 android 应用程序,它通过 HTTP-Streams 解密和加密大型(最大 100MB)文件。
因此,我们使用CipherInputStreams 和CipherOutputStreams,它们适用于AES/CBC/PKCS7Padding。我们最近切换到AES/GCM/NoPadding。现在,对于大约 50MB 以上的文件,加密和解密的速度是不可接受的。
调试android源代码,发现问题:https://android.googlesource.com/platform/libcore/+/master/ojluni/src/main/java/javax/crypto/CipherInputStream.java#112
此方法具有字节缓冲区“oBuffer”,它被重新分配并增加了 512 位,直到它可以容纳整个消息(参见行:https://android.googlesource.com/platform/libcore/+/master/ojluni/src/main/java/javax/crypto/CipherInputStream.java#121)
我知道有关此方法的注释,其中指出在 AEAD 密码中必须缓冲整个消息。这是一个问题,因为我们无法将整个消息保存到内存缓冲区中。另一个问题是 oBuffer 会不断重新分配。
是否有任何解决方案可以将 GCM 与流式 API 结合使用?
【问题讨论】:
-
将文件分成几部分。问题出在身份验证标签计算上。
-
谢谢。但是如果将文件拆分为多个部分,则可以更改这些部分,例如一个部分可以加倍或左移,或者可以更改部分的顺序。在我看来,这将违反数据完整性的目标。
标签: android cryptography google-cloud-messaging