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

Android Kotlin中DESede字符串解密失败问题求助

问题分析与修复方案

核心错误点

你的解密逻辑存在两个关键问题:

  • Base64解码对象错误:解密时传入的plainText是加密后生成的Base64字符串,但原代码错误地将该字符串转成字节数组后再解码,正确做法是直接用这个字符串做Base64解码。
  • 字节数组转字符串方式错误:解密得到的明文字节数组直接调用toString(),会返回字节数组的对象标识(类似[B@xxxxxx),而非真实明文内容,必须通过指定字符集的方式转换为字符串。

修正后的完整代码

import java.nio.charset.StandardCharsets
import javax.crypto.Cipher
import javax.crypto.SecretKeySpec
import javax.crypto.spec.IvParameterSpec
import android.util.Base64

fun doCipher(plainText: String, ci: String, operation: String): String? {
    val key = ci.substring(0,24)
    val initializationVector = ci.takeLast(8)
    var password: String? = null
    // 统一指定UTF-8字符集,避免默认字符集差异问题
    val tdesKeyData = key.toByteArray(StandardCharsets.UTF_8)
    val myIV = initializationVector.toByteArray(StandardCharsets.UTF_8)
    
    try {
        val c3des = Cipher.getInstance("DESede/CBC/PKCS5Padding")
        val myKey = SecretKeySpec(tdesKeyData, "DESede")
        val ivspec = IvParameterSpec(myIV)
        
        if (operation == "E") {
            val plaintextBytes = plainText.toByteArray(StandardCharsets.UTF_8)
            c3des.init(Cipher.ENCRYPT_MODE, myKey, ivspec)
            val cipherText = c3des.doFinal(plaintextBytes)
            password = Base64.encodeToString(cipherText, Base64.DEFAULT)
        } else {
            // 修正1:直接使用输入的Base64字符串解码
            val cipherBytes = Base64.decode(plainText, Base64.DEFAULT)
            c3des.init(Cipher.DECRYPT_MODE, myKey, ivspec)
            val plaintextBytes = c3des.doFinal(cipherBytes)
            // 修正2:通过UTF-8字符集将字节数组转为明文字符串
            password = String(plaintextBytes, StandardCharsets.UTF_8)
        }
    } catch (e: Exception) {
        e.printStackTrace()
    }
    return password
}

额外优化说明

  • 所有字符串与字节数组的转换都明确指定StandardCharsets.UTF_8,避免不同环境下默认字符集不一致导致的乱码。
  • 移除了原代码中冗余的ivspec异常捕获块,因为initializationVector固定取8位,不会抛出初始化异常。

内容的提问来源于stack exchange,提问作者Ahmet Yılmaz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 03:55:20