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

如何在Android Studio Kotlin中实现与.NET TripleDESCryptoServiceProvider一致的加解密

3DES加解密C#到Kotlin适配方案

核心匹配要点(完全对齐C#逻辑)

  • C#中Encoding.Unicode对应*UTF-16小端(UTF-16LE)*编码,字节序不能出错
  • 密钥生成逻辑:原始密钥字符串先转UTF-16LE字节,再计算MD5哈希得到16字节密钥
  • 3DES参数固定为ECB模式、PKCS7填充(C#默认填充规则)
  • 16字节MD5结果适配3DES要求:将16字节密钥按「前16字节+前8字节」规则拼接为24字节3DES标准密钥
  • Base64编码使用无换行格式,对齐C#Convert.ToBase64String默认逻辑

Kotlin实现代码

import android.util.Base64
import java.nio.charset.Charset
import java.security.MessageDigest
import javax.crypto.Cipher
import javax.crypto.spec.SecretKeySpec

object TripleDesUtil {
    // 与C#端完全一致的原始密钥
    private const val ORIGIN_KEY = "123456789"
    // 对应C# Encoding.Unicode 的UTF-16LE编码
    private val CHARSET_UTF16LE = Charset.forName("UTF-16LE")

    // 生成完全对齐C#逻辑的3DES密钥
    private fun generateDesKey(): SecretKeySpec {
        // 1. 原始密钥转UTF-16LE字节数组
        val keyBytes = ORIGIN_KEY.toByteArray(CHARSET_UTF16LE)
        // 2. 计算MD5哈希得到16字节中间密钥
        val md5 = MessageDigest.getInstance("MD5")
        val md5Key = md5.digest(keyBytes)
        // 3. 16字节扩展为24字节3DES标准密钥(前16位+前8位)
        val desKey = md5Key.copyOf(24)
        System.arraycopy(md5Key, 0, desKey, 16, 8)
        return SecretKeySpec(desKey, "DESede")
    }

    // 加密方法
    fun encrypt(message: String): String {
        val cipher = Cipher.getInstance("DESede/ECB/PKCS7Padding")
        cipher.init(Cipher.ENCRYPT_MODE, generateDesKey())
        val inputBytes = message.toByteArray(CHARSET_UTF16LE)
        val encryptBytes = cipher.doFinal(inputBytes)
        // 无换行Base64编码
        return Base64.encodeToString(encryptBytes, Base64.NO_WRAP)
    }

    // 解密方法
    fun decrypt(encryptStr: String): String {
        val cipher = Cipher.getInstance("DESede/ECB/PKCS7Padding")
        cipher.init(Cipher.DECRYPT_MODE, generateDesKey())
        val encryptBytes = Base64.decode(encryptStr, Base64.NO_WRAP)
        val decryptBytes = cipher.doFinal(encryptBytes)
        return String(decryptBytes, CHARSET_UTF16LE)
    }
}

效果验证

调用TripleDesUtil.encrypt("My message") 输出结果为 bRhsN5v76jrQcl54VrTKIAtsTAK0Hq3B,与C#端完全一致;
调用TripleDesUtil.decrypt("bRhsN5v76jrQcl54VrTKIAtsTAK0Hq3B") 输出结果为 My message,解密逻辑正常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.11 18:27:00