java~和.net相通的DES-ECB加解密技术
起因
首先,对于一个公司,即有.net又有java开发来说,加解密是需要相互打通的,因为,根据莫非定律你迟早会有“.net加密让java解密“的情况。
.net实现
public static string Encrypt(SymmetricAlgorithm algorithm, string plaintext, string key)
{
TripleDESCryptoServiceProvider tripleDes = new TripleDESCryptoServiceProvider();
MD5CryptoServiceProvider hashMD5 = new MD5CryptoServiceProvider();
algorithm.Key = hashMD5.ComputeHash(ASCIIEncoding.ASCII.GetBytes(key));
algorithm.Mode = CipherMode.ECB;
Console.WriteLine("IV=" + Convert.ToBase64String(algorithm.IV));
ICryptoTransform transformer = algorithm.CreateEncryptor();
byte[] Buffer = ASCIIEncoding.ASCII.GetBytes(plaintext);
byte[] result = transformer.TransformFinalBlock(Buffer, 0, Buffer.Length);
return Convert.ToBase64String(result);
}
.net和java的几个不同
- byte类型对于.net是(0255),而java来说它是有符号的,是(-128127)
- 对于DES来说,默认的java支持的密钥是8字节,而.net里algorithm.Key是16个字节,所以用原生Java的des是不能和.net互通的
java实现
需要第三方包bcprov-jdk15on
<dependency>
<groupId>org.bouncycastle</groupId>
<artifactId>bcprov-jdk15on</artifactId>
<version>1.64</version>
<scope>compile</scope>
</dependency>
实现与.net互通的加密过程
private static final String ALGORITHM = "DESede";
private static final String CIPHER_TRANSFER = "DESede/ECB/PKCS5Padding";
private static final String ENCODING = "UTF-8";
static {
init();
}
public static void init() {
BouncyCastleProvider bouncyCastleProvider = new BouncyCastleProvider();
Security.addProvider(bouncyCastleProvider);
}
/**
* 初始化key.
*
* @param key
*/
@SneakyThrows
static SecretKey getSecretKey(String key) {
MessageDigest md5 = MessageDigest.getInstance("MD5");
byte[] bkeys = md5.digest(key.getBytes());
SecretKey secretKey = new SecretKeySpec(bkeys, ALGORITHM);
return secretKey;
}
/**
* 字符串加密.
*
* @param plainText
* @param key
* @return
* @throws Exception
*/
@SneakyThrows
public static String encryptToBase64(String plainText, String key) {
SecretKey secretKey = getSecretKey(key);
Cipher cipher = Cipher.getInstance(CIPHER_TRANSFER);
cipher.init(Cipher.ENCRYPT_MODE, secretKey);
byte[] result = cipher.doFinal(plainText.getBytes(ENCODING));
String s1 = Base64.encodeBase64String(result);
return s1;
}
上面代码,主要是对于key的生成要注意,使用了与.net相同的md5对原始key进行的加密,保存它是16个字节。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
· C++代码改造为UTF-8编码问题的总结
· 【.NET】调用本地 Deepseek 模型
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
2012-02-23 解决COOKIES存储中文乱码的问题
2012-02-23 MVC中一个表单实现多个提交按钮(一个action搞定添删改)