gpt4 book ai didi

Android AES 加密在 Cipher.doFinal 之后丢失字节

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:10:26 27 4
gpt4 key购买 nike

我正在尝试加密来自 glide 的输入流。

我将输入流转换为一个字节数组,并将其传递到我的加密方法中:

fun encrypt(input: ByteArray): ByteArray {

Log.e("TAG", "inputsize: ${input.size}")

val iv = ByteArray(KeyStoreHelper.IV_SIZE)
val secureRandom = SecureRandom()
secureRandom.nextBytes(iv)

val c = Cipher.getInstance(KeyStoreHelper.AES_MODE)
c.init(Cipher.ENCRYPT_MODE, getKey(), GCMParameterSpec(KeyStoreHelper.GCM_SIZE, iv))
Log.e("TAG", "outputsize: ${c.getOutputSize(input.size)}")
val encodedBytes = c.doFinal(input)

Log.e("TAG", "encodedBytesSize: ${encodedBytes.size}")

val byteBuffer = ByteBuffer.allocate( iv.size + encodedBytes.size)
byteBuffer.put(iv)
byteBuffer.put(encodedBytes)

Log.e("TAG", "byteBuffer: ${byteBuffer.array().size}")


return byteBuffer.array()
}

日志如下所示:

inputsize: 750683 
outputsize: 750699
encodedBytesSize: 95339
byteBuffer: 95351

如您所见,加密的图像字节数组太小了,我不明白为什么 - 如果我尝试加密字符串或更小的图像(大约 100kb-200kb),它就像一个魅力。

谢谢你帮助我!

亲切的问候汤姆

最佳答案

看起来你遇到了一个错误,奇怪的是在一个不合逻辑的位置:95339 是一个质数。您几乎会认为某些开发人员故意留下该值,以防他忘记或测试测试团队。

但是,对于如此大量的信息,将所有数据都缓存在内存中并不是一个好主意,即使对于 GCM 也是如此。您应该尝试改用流媒体。您可以使用 CipherOutputStream 执行加密,使用 CipherInputStream 进行解密。您可以将这些流连接到其他流,例如 FileOutputStreamFileInputStream 以直接读取/写入文件系统。也可以将 IV 写入这些底层流。

请注意,不同提供商处理 GCM 的方式可能存在很大差异。正如您所注意到的,与 Android keystore 关联的那个是为安全而构建的 - 无论如何是 key - 而不是速度。 GCM 的其他实现可能不会显示此错误。请注意,可用的提供程序可能因不同的 Java(-esk) 平台和这些平台的版本而异。

关于Android AES 加密在 Cipher.doFinal 之后丢失字节,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54944627/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com