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

