C#.NET与JAVA互通之DES加密V2024
注意点:
1.由于密钥、明文、密文的输入输出参数,都是byte数组(byte[]),所以:字符串转byte数组(byte[])环节,双方要约定好编码。
2. KEY 和 IV 从字符串转byte数组(byte[])时,双方要约定好编码,一般是UTF8。
3.明文从字符串转byte数组(byte[])时,双方要约定好编码,一般是UTF8,.NET 这边要注意:不能用 Encoding.Default。
4.加密后的结果,从byte数组(byte[])转字符串时,双方要约定好编码,一般是Base64字符串。
5.NET 的PKCS7Padding 对应 JAVA 的:PKCS5Padding
一、 .NET DES
先看工具类:DesUtil
using System;
using System.Security.Cryptography;
using System.Text; namespace CommonUtils
{
/// <summary>
/// 工具类,2024-06-16,runliuv。
/// </summary>
public class DesUtil
{
public static byte[] DesEncryptCBC(byte[] plainText, byte[] Key, byte[] IV)
{
byte[] encrypted; using (DESCryptoServiceProvider desAlg = new DESCryptoServiceProvider())
{
desAlg.Key = Key;
desAlg.IV = IV;
desAlg.Mode = CipherMode.CBC;
desAlg.Padding = PaddingMode.PKCS7; using (ICryptoTransform encryptor = desAlg.CreateEncryptor())
{
encrypted= encryptor.TransformFinalBlock(plainText, 0, plainText.Length);
}
} return encrypted;
} public static byte[] DesDecryptCBC(byte[] cipherText, byte[] Key, byte[] IV)
{
byte[] plaintext = null; using (DESCryptoServiceProvider desAlg = new DESCryptoServiceProvider())
{
desAlg.Key = Key;
desAlg.IV = IV;
desAlg.Mode = CipherMode.CBC;
desAlg.Padding = PaddingMode.PKCS7; using (ICryptoTransform decryptor = desAlg.CreateDecryptor())
{
plaintext = decryptor.TransformFinalBlock(cipherText, 0, cipherText.Length);
}
} return plaintext;
}
/// <summary>
/// DES CBC 加密
/// </summary>
/// <param name="plainText">明文</param>
/// <param name="Key">密钥</param>
/// <param name="IV"></param>
/// <returns></returns>
public static string DesEncryptCBC(string plainText, string Key, string IV)
{
byte[] yy= DesEncryptCBC(Encoding.UTF8.GetBytes(plainText), Encoding.UTF8.GetBytes(Key), Encoding.UTF8.GetBytes(IV));
string xx=Convert.ToBase64String(yy);
return xx;
}
/// <summary>
/// DES CBC 解密
/// </summary>
/// <param name="cipherText">密文</param>
/// <param name="Key">密钥</param>
/// <param name="IV"></param>
/// <returns></returns>
public static string DesDecryptCBC(string cipherText, string Key, string IV)
{
byte[] yy = DesDecryptCBC(Convert.FromBase64String(cipherText), Encoding.UTF8.GetBytes(Key), Encoding.UTF8.GetBytes(IV));
string xx = Encoding.UTF8.GetString(yy);
return xx;
}
}
}
.NET 使用这个工具类,做DES CBC 加密 :
static void TestDesCbc()
{
Console.WriteLine("-- Test Cbc --");
string aesKey = "12345678";// DES 密钥长度是8位
string aesIV = "abcdefgh";// DES IV长度是8位 string orgStr = "hello .net 2024-06-10";
string encryptedStr = DesUtil.DesEncryptCBC(orgStr, aesKey, aesIV);
Console.WriteLine("加密字符串:" + encryptedStr); //自加,自解
string decryptedStr = DesUtil.DesDecryptCBC(encryptedStr, aesKey, aesIV);
Console.WriteLine("自加,自解:" + decryptedStr);
}
.NET 输出结果 :
-- Test Cbc --
加密字符串:yxEOkYM81hdv0bC1EwgCdE1JSsFyW70A
自加,自解:hello .net 2024-06-10
结束 。

.NET 简要说明:
加密:
public static string DesEncryptCBC(string plainText, string Key, string IV)
{
byte[] yy= DesEncryptCBC(Encoding.UTF8.GetBytes(plainText), Encoding.UTF8.GetBytes(Key), Encoding.UTF8.GetBytes(IV));
string xx=Convert.ToBase64String(yy);
return xx;
}
Encoding.UTF8.GetBytes(plainText),明文字符串转byte数组 使用UTF8。
Encoding.UTF8.GetBytes(Key), Encoding.UTF8.GetBytes(IV),KEY 和 IV 转byte数组 使用UTF8。
public static byte[] DesEncryptCBC(byte[] plainText, byte[] Key, byte[] IV)
{
byte[] encrypted; using (DESCryptoServiceProvider desAlg = new DESCryptoServiceProvider())
{
desAlg.Key = Key;
desAlg.IV = IV;
desAlg.Mode = CipherMode.CBC;
desAlg.Padding = PaddingMode.PKCS7; using (ICryptoTransform encryptor = desAlg.CreateEncryptor())
{
encrypted= encryptor.TransformFinalBlock(plainText, 0, plainText.Length);
}
} return encrypted;
}
创建一个DESCryptoServiceProvider对象,指定KEY 和 IV,指定 加密模式和 PADDING。
创建加密器对象:desAlg.CreateEncryptor()。
使用 TransformFinalBlock 算出加密结果。
string xx=Convert.ToBase64String(yy); 加密后的结果转字符串时,使用Base64字符串。
解密:
public static string DesDecryptCBC(string cipherText, string Key, string IV)
{
byte[] yy = DesDecryptCBC(Convert.FromBase64String(cipherText), Encoding.UTF8.GetBytes(Key), Encoding.UTF8.GetBytes(IV));
string xx = Encoding.UTF8.GetString(yy);
return xx;
}
Convert.FromBase64String(cipherText),由于加密结果集转字符串时用的base64,所以密文转byte数组时,就要用Convert.FromBase64String。

KEY 和 IV 就不用多说了。
public static byte[] DesDecryptCBC(byte[] cipherText, byte[] Key, byte[] IV)
{
byte[] plaintext = null; using (DESCryptoServiceProvider desAlg = new DESCryptoServiceProvider())
{
desAlg.Key = Key;
desAlg.IV = IV;
desAlg.Mode = CipherMode.CBC;
desAlg.Padding = PaddingMode.PKCS7; using (ICryptoTransform decryptor = desAlg.CreateDecryptor())
{
plaintext = decryptor.TransformFinalBlock(cipherText, 0, cipherText.Length);
}
} return plaintext;
}
创建一个DESCryptoServiceProvider对象,指定KEY 和 IV,指定 模式和 PADDING。
创建解密器对象:desAlg.CreateDecryptor()。
使用 TransformFinalBlock 解密出结果。
string xx = Encoding.UTF8.GetString(yy); 加密时,明文转byte[] 时用的UTF8,那解密出的明文结果,转byte数组时,也得用UTF8。

可以说,解密与加密是相反的。

二、JAVA DES
还是简要封装个工具类DesUtil。
package org.runliuv; import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.util.Base64; public class DesUtil { private static final String charset = "UTF-8"; public static String DesEncryptCBC(String content, String key, String iv)
throws Exception { //明文
byte[] contentBytes = content.getBytes(charset); //DES KEY
byte[] keyBytes = key.getBytes(charset);
SecretKeySpec keySpec = new SecretKeySpec(keyBytes, "DES"); //DES IV
byte[] initParam = iv.getBytes(charset);
IvParameterSpec ivParameterSpec = new IvParameterSpec(initParam); Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, keySpec, ivParameterSpec);
byte[] byEnd = cipher.doFinal(contentBytes); //加密后的byte数组转BASE64字符串
String strEnd = Base64.getEncoder().encodeToString(byEnd);
return strEnd;
} /**
* 解密
* @param content
* @param key
* @param iv
* @return
* @throws Exception
*/
public static String DesDecryptCBC(String content, String key, String iv)
throws Exception {
//反向解析BASE64字符串为byte数组
byte[] encryptedBytes = Base64.getDecoder().decode(content); //DES KEY
byte[] keyBytes = key.getBytes(charset);
SecretKeySpec keySpec = new SecretKeySpec(keyBytes, "DES"); //DES IV
byte[] initParam = iv.getBytes(charset);
IvParameterSpec ivParameterSpec = new IvParameterSpec(initParam); Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");
cipher.init(Cipher.DECRYPT_MODE, keySpec, ivParameterSpec);
byte[] byEnd = cipher.doFinal(encryptedBytes); //加密后的byte数组直接转字符串
String strEnd = new String(byEnd, charset);
return strEnd;
} }
JAVA 使用工具类进行 DES CBC 加密,解密:
System.out.println("-- Test Cbc --");
String aesKey = "12345678";// DES 密钥长度是8位
String aesIV = "abcdefgh";// DES IV长度是8位
String orgStr = "hello JAVA 2024-06-10";
System.out.println("待加密字符串:" + orgStr);
String encryptedStr = DesUtil.DesEncryptCBC(orgStr, aesKey, aesIV);
System.out.println("加密后:" + encryptedStr);
//自加,自解
String decryptedStr = DesUtil.DesDecryptCBC(encryptedStr, aesKey, aesIV);
System.out.println("自加,自解:" + decryptedStr);
效果:
-- Test Cbc --
待加密字符串:hello JAVA 2024-06-10
加密后:VkxvjXu1YKvQJF8MPnFvXhFzJgZI4j9I
自加,自解:hello JAVA 2024-06-10

三、.NET 加 JAVA 解
先用.NET 对"hello .net 2024-06-10",这个字符串加密,KEY是"12345678",IV为“abcdefgh”,加密结果为:
yxEOkYM81hdv0bC1EwgCdE1JSsFyW70A
将这个串复制到JAVA代码,进行解密:
String NETStr ="yxEOkYM81hdv0bC1EwgCdE1JSsFyW70A";
System.out.println(".NET 加密后的串:" + NETStr);
String decryptedStr = DesUtil.DesDecryptCBC(NETStr, aesKey, aesIV);
System.out.println("JAVA解密:" + decryptedStr);
输出结果 :
-- Test Cbc --
.NET 加密后的串:yxEOkYM81hdv0bC1EwgCdE1JSsFyW70A
JAVA解密:hello .net 2024-06-10

--
DES ECB 的加密模式,请自行探索。
C#.NET与JAVA互通之DES加密V2024的更多相关文章
- Java与.NET DES加密解密互转
上代码: Java代码: import javax.crypto.Cipher; import javax.crypto.SecretKey; import javax.crypto.SecretKe ...
- 【Java】通过DES加密和解密工具,对字符串进行加密和解密操作
分享一个非常不错的字符串加密和解密的程序. 可以指定不同的密钥对同一字符串进行不同的加密操作,增强加密性能. Java代码如下: package com.app; import java.securi ...
- java 简单的des加密示例
1.加密结果 包含 : 对int加密 .对string加密.对byte[]加密. 10-09 18:33:32.484 7617-7617/com.example.tt.downtest D/Ciph ...
- PHP 识别 java 8位 des 加密和 解密方式
代码及使用说明: <?php /** *PHP 识别 java 8位密钥的加密和解密方式 *@desc 加密方式 通用 */ class DES { var $key; var $iv; //偏 ...
- C#与Java互通AES算法加密解密
/// <summary>AES加密</summary> /// <param name="text">明文</param> /// ...
- .NET与Java互通AES算法加密解密
/// <summary>AES加密</summary> /// <param name="text">明文</param> /// ...
- 关于Objective-c和Java下DES加密保持一致的方式
转载自:http://www.cnblogs.com/janken/archive/2012/04/05/2432930.html 最近做了一个移动项目,是有服务器和客户端类型的项目,客户端是要登录才 ...
- Android DES加密的CBC模式加密解密和ECB模式加密解密
DES加密共有四种模式:电子密码本模式(ECB).加密分组链接模式(CBC).加密反馈模式(CFB)和输出反馈模式(OFB). CBC模式加密: import java.security.Key; i ...
- C# DES加密类,16位的加密。
这个加密类是与java写的DES加密不同时,自己写的,最后与Java的加密相同了,解决了加密后不同的问题. 可以直接调用里面的加密和解密的方法. using System; using System. ...
- Android和java平台 DES加密解密互通程序及其不能互通的原因
网上的demo一搜一大堆,但是,基本上都是一知半解(包括我).为什么呢?我在尝试分别在两个平台加密的时候,竟然发现Android DES 加密和java DES加密的程序不能互通.就是加密的结果不一样 ...
随机推荐
- Go 语言网络库 getty 的那些事
简介: Getty 维护团队不追求无意义的 benchmark 数据,不做无意义的炫技式优化,只根据生产环境需求来进行自身改进.只要维护团队在,Getty 稳定性和性能定会越来越优秀. 个人从事互联网 ...
- dotnet C# 基础 为什么 GetHashCode 推荐只取只读属性或字段做哈希值
在 C# 里面,所有的对象都继承 Object 类型,此类型有开放 GetHashCode 用于给开发者重写.此 GetHashCode 方法推荐是在重写 Equals 方法时也同时进行重写,要求两个 ...
- dotnet 5 从 IL 层面分析协变返回类型新特性
在 C# 9.0 里面添加的一个新特性是支持协变返回类型,也就说子类重写了基类的抽象或虚拟方法,可以在返回值里面返回协变的类型,也就是返回值的类型可以是继承原本子类返回值类型的子类.本文将来从 IL ...
- ClickHouse常用Sql
-- 删除字段 ALTER TABLE 表名 DROP COLUMN 字段名; -- 新增字段,和字段备注 ALTER TABLE 表名 ADD COLUMN IF NOT EXISTS 字段名 St ...
- 03. Ruby入门理解
Ruby入门学习: 视频教程 https://www.bilibili.com/video/BV1QW411F7rh?t=401&p=1 笔记 https://github.com/haima ...
- Linux中典型的文件权限问题
总结起来说,可以打个比方,目录就像一间上了锁有窗户的屋子.如果你只想看屋子里面有啥,那么只要拥有r权限,不必进入到屋子,透过屋子的窗户就能看到里面的东西:但是如果你想改变屋子里面的物件,或者从屋子里面 ...
- WEB服务与NGINX(9)-NGINX作为下载服务器的相关配置
目录 1. NGINX的目录索引功能 2. NGINX的限速功能 2.1 限制下载速度 2.2 限制单位时间内产生的http请求数 2.3 限制客户端同一时刻的并发连接数 1. NGINX的目录索引功 ...
- js文字处理两端展示中间省略号
点击查看代码 function ellipsisText(longText, displayLength) { // 确保显示长度至少包含省略号的3个字符 if (displayLength < ...
- kubernetes 之二进制方式部署
我的资料链接:https://pan.baidu.com/s/18g0sar1N-FMhzY-FCMqOog 两种集群架构图 多master需要在集群上面加个lb,所有的node都需要连接lb,lb帮 ...
- 基于uniapp+vue3自定义增强版table表格组件「兼容H5+小程序+App端」
vue3+uniapp多端自定义table组件|uniapp加强版综合表格组件 uv3-table:一款基于uniapp+vue3跨端自定义手机端增强版表格组件.支持固定表头/列.边框.斑马纹.单选/ ...