我在 Kotlin 中使用“CBC”模式和“PKCS5Padding”填充实现了“AES”加密和解密。我注意到在解密 cipherInputStream.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)
}
最佳答案
最近我遇到了类似的问题。
问题出在定义如下的 CipherInputStream 类的内部缓冲区
private byte[] ibuffer = new byte[512];
显着提高解密速度的是将此缓冲区大小增加到 8192。所以我只是将粘贴的原始 CipherInputStream 类复制到我自己的类并修改了缓冲区大小。
有趣的是这个 ibuffer 字段上面的注释。
the size 512 bytes is somewhat randomly chosen */
希望对你有帮助
关于android - 与 Android 上的加密相比,解密要慢得多,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44993005/