Android Kotlin AES解密返回错误解密

时间:2019-03-22 19:50:27

标签: android encryption kotlin openssl aes

我目前在解密文件时遇到问题。问题已经使我困扰了几天。每次尝试均以BAD_DECRYPT异常结束。这就是解密代码的样子。

val factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA256")
        val spec = PBEKeySpec(Constant().SECRET_KEY.toCharArray(), Constant().SALT_KEY.toByteArray(Charset.defaultCharset()), 65536, 256)
        val tmp = factory.generateSecret(spec)
        val secret = SecretKeySpec(tmp.encoded, "AES")
        val ivKeyBytes = Constant().IV_SECRET_KEY.toByteArray()
        val finalIvs = ByteArray(16)
        val len = if (ivKeyBytes.count() > 16) 16 else ivKeyBytes.count()
        System.arraycopy(ivKeyBytes, 0, finalIvs, 0, len)
        val ivps = IvParameterSpec(finalIvs)

        val cipher = Cipher.getInstance("AES/CBC/PKCS5Padding")
        cipher.init(Cipher.DECRYPT_MODE, secret, ivps)
        return cipher.doFinal(fileData)

加密是通过我的服务器上带有openssl的任务进行的,看起来像这样

openssl enc -aes-256-cbc -md md5 -in PATH_TO_MY_FILE -out PATH_TO_MY_ENC_FILE -S "MYSALT_IN_HEX" -iv "MY_IV_IN_HEX" -k MY_KEY_PASS

我做错了什么?谁能帮我吗?

提前感谢塞巴斯蒂安

1 个答案:

答案 0 :(得分:0)

SecretKeyFactory的算法似乎不正确。您正在使用没有pbkdf2标志和md5哈希的openssl。我认为相应的算法应为充气城堡提供商的“ PBEWITHMD5AND256BITAES-CBC-OPENSSL”。

您还需要从文件中提取密文-它以Salted__字符串开头,然后是salt,然后是密文。

通过这些更改,解密对我来说很好:

    Security.addProvider(BouncyCastleProvider())
    val factory = SecretKeyFactory.getInstance("PBEWITHMD5AND256BITAES-CBC-OPENSSL", "BC")
    val salt = Arrays.copyOfRange(fileData, 8, 16)
    val spec = PBEKeySpec(Constant().SECRET_KEY.toCharArray(), salt, 65536, 256)
    ...
    val ct = Arrays.copyOfRange(fileData, 16, fileData.size)
    return cipher.doFinal(ct)