You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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")
}

关键修改说明

  1. Cipher模式对齐:将AES/CBC/PKCS5Padding替换为AES/CTR/NoPadding,完全匹配Dart端encrypt库的默认AES配置
  2. 保留必要逻辑:移除了Kotlin端的加密函数(若不需要可保留),仅保留与解密相关的核心逻辑

运行修改后的代码,即可正确解密Dart端加密的字符串。

内容的提问来源于stack exchange,提问作者Sol

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 00:38:17