Sha*_*ifi 11 aes android-keystore java-security-manager
我将 AES 解密密钥存储在 AndroidKeyStore 中以解密来自 SQLiteDB 的数据。不幸的是,有时我很少收到此错误(任何 android 设备和任何 API)。
我想知道这个错误到底是什么意思。
javax.crypto.BadPaddingException: error:1e000065:Cipher functions:OPENSSL_internal:BAD_DECRYPT.
我在哪里可以找到这些清单error:*?
小智 0
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")
Run Code Online (Sandbox Code Playgroud)
我删除了“UTF-8”部分,因为它默认转换为“UTF-8”,无需再次传递它。
val ivParameterSpec = IvParameterSpec(iv.toByteArray())
val secretKeySpec = SecretKeySpec(key.toByteArray(), "AES")
Run Code Online (Sandbox Code Playgroud)
(注:加密数据的长度为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
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4397 次 |
| 最近记录: |