我将 AES 解密密钥存储在 AndroidKeyStore 中以解密来自 SQLiteDB 的数据。不幸的是,有时我很少遇到这个错误(任何安卓设备和任何 API)。
我想知道这个错误到底是什么意思。
javax.crypto.BadPaddingException: error:1e000065:Cipher functions:OPENSSL_internal:BAD_DECRYPT
.
我在哪里可以找到这些
error:*
的列表?
Android 中的解密似乎与后端的默认 Java 代码不同。就我而言,我遇到了这个错误原因。将 IV 和 SecretKey 的值重新编码为 UTF-8。
我正在像下面那样转换 KEY 和 IV,并且导致字符串重新编码。
val ivParameterSpec = IvParameterSpec(iv.toByteArray(charset("utf-8")))
val secretKeySpec = SecretKeySpec(key.toByteArray(charset("utf-8")), "AES")
我删除了“UTF-8”部分,因为它默认转换为“UTF-8”,无需再次传递。
val ivParameterSpec = IvParameterSpec(iv.toByteArray())
val secretKeySpec = SecretKeySpec(key.toByteArray(), "AES")
(注:encryptedData的长度为128,IV和Key的长度为16,根据算法需要都可以被16整除。)
完整代码如下。
fun decrypt(encryptedData: String, iv: String, key: String): String? {
try {
//IV & Key Generation
val ivParameterSpec = IvParameterSpec(iv.toByteArray())
val secretKeySpec = SecretKeySpec(key.toByteArray(), "AES")
val c = Cipher.getInstance("AES/CBC/PKCS5PADDING")
c.init(Cipher.DECRYPT_MODE, secretKeySpec, ivParameterSpec)
val decodedValue = Base64.decode(encryptedData, Base64.URL_SAFE)
val decValue = c.doFinal(decodedValue)
return String(decValue)
} catch (ex: IllegalBlockSizeException) {
println(ex.message)
} catch (ex: BadPaddingException) {
println(ex.message)
} catch (ex: InvalidKeyException) {
println(ex.message)
} catch (ex: NoSuchAlgorithmException) {
println(ex.message)
} catch (ex: NoSuchPaddingException) {
println(ex.message)
} catch (ex: Exception) {
println(ex.message)
}
return null
}
我有同样的问题,因为我已经为
cipher
初始化了ENCRYPT_MODE
,但是在我调用doFinal
进行加密之前,我已经在另一个地方为cipher
重新初始化了相同的DECRYPT_MODE
。所以,不必有相同的race condition,那可能没问题。