我目前在解密文件时遇到问题。问题已经使我困扰了几天。每次尝试均以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
我做错了什么?谁能帮我吗?
提前感谢塞巴斯蒂安
答案 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)