Dart AES加密数据在Kotlin解密时遇BadPaddingException的解决方法
问题解决:Kotlin兼容Dart AES解密的调整方案
问题根源
Dart端使用的encrypt库中,Encrypter(AES(key))默认采用AES/SIC(CTR)/NoPadding模式(SIC是CTR模式的别名),而你的Kotlin代码错误使用了AES/CBC/PKCS5Padding模式,两者加密逻辑不匹配,导致解密时出现填充验证异常。
修改后的Kotlin解密代码
import java.nio.charset.StandardCharsets import java.security.MessageDigest import java.util.* import javax.crypto.Cipher import javax.crypto.SecretKey import javax.crypto.spec.IvParameterSpec import javax.crypto.spec.SecretKeySpec object CryptoService { private const val keyString = "ABCdefg1234!!" private fun generateKey(): SecretKey { val keyBytes = MessageDigest.getInstance("SHA-256").digest(keyString.toByteArray(StandardCharsets.UTF_8)) return SecretKeySpec(keyBytes, "AES") } fun decryptString(encoded: String): String { val key = generateKey() val combinedBytes = Base64.getUrlDecoder().decode(encoded) val iv = combinedBytes.sliceArray(0 until 16) val encryptedBytes = combinedBytes.sliceArray(16 until combinedBytes.size) // 核心修改:匹配Dart端的AES模式 val cipher = Cipher.getInstance("AES/CTR/NoPadding").apply { init(Cipher.DECRYPT_MODE, key, IvParameterSpec(iv)) } val decryptedBytes = cipher.doFinal(encryptedBytes) return String(decryptedBytes, StandardCharsets.UTF_8) } } fun main() { println(CryptoService.decryptString("FzaO3XI3ZVtUDAdM1So357dhQwg37fh0vzVr6jkPDaY=")) // 输出:abcdef println("end") }
关键修改说明
- Cipher模式对齐:将
AES/CBC/PKCS5Padding替换为AES/CTR/NoPadding,完全匹配Dart端encrypt库的默认AES配置 - 保留必要逻辑:移除了Kotlin端的加密函数(若不需要可保留),仅保留与解密相关的核心逻辑
运行修改后的代码,即可正确解密Dart端加密的字符串。
内容的提问来源于stack exchange,提问作者Sol
相关产品推荐
相关产品推荐

