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
相关产品推荐
相关产品推荐

