android - 与 Android 上的加密相比,解密要慢得多

标签 android encryption cryptography kotlin

我在 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/

相关文章:

mysql - 将我的 MySQL 密码加密为来自 VB.net 的 MD5 哈希时遇到问题

javascript - 将自定义消息身份验证代码从 Java 转换为 JavaScript

c# - RSA解密公式的问题

android - 在android market中存储内容

android - io.realm.exceptions.RealmMigrationNeededException : Migration is required due to the following errors: - Class 'SaveMessage' has been added

android - 如何从可组合函数中获取当前 Activity ?

php - Erlang 和 PHP 之间的加密

android - 谷歌地图 : Detecting down and move events on google map

java - RSA 和 Base64 编码字节过多

c# - 哈希算法 SHA256,我的方法安全吗?如何添加盐值以使其更安全