javax.crypto.BadPaddingException:错误:1e000065:密码函数:OPENSSL_internal:BAD_DECRYPT

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)