与Android上的加密相比,解密速度要慢得多

与Android上的加密相比,解密速度要慢得多,android,encryption,cryptography,kotlin,Android,Encryption,Cryptography,Kotlin,我在Kotlin中使用“CBC”模式和“PKCS5Padding”填充实现了“AES”加密和解密。我注意到在解密cipheriputstream.read(buffer)时,每次只读取512字节,而不是8192字节的完整缓冲区大小。为什么呢?加密时使用整个缓冲区 这些是我正在使用的常量, private val TRANSFORMATION = "AES/CBC/PKCS5Padding" private var SECRET_KEY_FAC_ALGORITHM = "PBKDF2WithHma

我在Kotlin中使用“CBC”模式和“PKCS5Padding”填充实现了“AES”加密和解密。我注意到在解密
cipheriputstream.read(buffer)
时,每次只读取512字节,而不是8192字节的完整缓冲区大小。为什么呢?加密时使用整个缓冲区

这些是我正在使用的常量,

private val TRANSFORMATION = "AES/CBC/PKCS5Padding"
private var SECRET_KEY_FAC_ALGORITHM = "PBKDF2WithHmacSHA1"
private val SECRET_KEY_SPEC_ALGORITHM = "AES"

private val cipher = Cipher.getInstance(TRANSFORMATION)
private val random = SecureRandom()

private val KEY_BITS_LENGTH = 256
private val IV_BYTES_LENGTH = cipher.blockSize
private val SALT_BYTES_LENGTH = KEY_BITS_LENGTH / 8
private val ITERATIONS = 10000
解密代码

cis = CipherInputStream(input, cipher)
val buffer = ByteArray(8192)

var read = cis.read(buffer)
while (read > -1) {
    fos.write(buffer, 0, read)
    read = cis.read(buffer)
}
fos.write(iv)
fos.write(salt)

cos = CipherOutputStream(fos, cipher)
val buffer = ByteArray(8192)

var read = input.read(buffer)
while (read > -1) {
    cos.write(buffer, 0, read)
    read = input.read(buffer)
}
加密代码

cis = CipherInputStream(input, cipher)
val buffer = ByteArray(8192)

var read = cis.read(buffer)
while (read > -1) {
    fos.write(buffer, 0, read)
    read = cis.read(buffer)
}
fos.write(iv)
fos.write(salt)

cos = CipherOutputStream(fos, cipher)
val buffer = ByteArray(8192)

var read = input.read(buffer)
while (read > -1) {
    cos.write(buffer, 0, read)
    read = input.read(buffer)
}

最近我也遇到了类似的问题

问题是CipherInputStream类的内部缓冲区,其定义如下

private byte[] ibuffer = new byte[512];
显著提高解密速度的是将缓冲区大小增加到8192。所以我只是将粘贴的原始CipherInputStream类复制到我自己的类中,并修改了缓冲区大小

有趣的是在这个ibuffer字段上面的评论

512字节的大小是随机选择的*/


希望它有帮助

我刚刚通过更改
ibuffer
的长度大小实现了这个类。(仅使用更改的值复制粘贴)

在解密一个超过30MB的文件时,它对我的情况非常有效。希望有人能找到一些瑕疵,虽然我的案子做得很好


Edit:很抱歉,我没有注意到上面的答案也是这么说的。为他人保留,以防他们只是需要从某处复制。谢谢。

使用
input.available()
是个坏主意,因为它可能无法到达流的末尾,此时您将生成不完整的明文。只需保留
else
-块的内容,并删除
if else
Updated my implementation您没有显示加密代码。AES解密通常比加密慢一点。也不清楚“慢得多”是什么意思。“…解密<代码>cipherInputStream.read(buffer)只读取512字节…而不是完整的缓冲区大小…这是为什么?”-设备资源有限,而且将数据“块”或“块”到磁盘扇区大小并不少见。使用磁盘扇区可以高效地处理内存和文件流。8192字节并不坏,但要避免大的分配。它避免了内存压力和操作系统消息,比如
onLowMemory()
@jww我也添加了加密代码。我尝试调试加密和解密过程,发现在加密时,
read
是8192,这是完整的缓冲区大小,但在解密时,
read
仅为512,尽管实际缓冲区大小为8192。为什么会有这样的差异?