C#.NET与JAVA互通之DES加密V2024
 
配置视频:
 
 
环境:
.NET Framework 4.6 控制台程序
JAVA这边:JDK8 (1.8) 控制台程序
 

注意点:

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的更多相关文章

  1. Java与.NET DES加密解密互转

    上代码: Java代码: import javax.crypto.Cipher; import javax.crypto.SecretKey; import javax.crypto.SecretKe ...

  2. 【Java】通过DES加密和解密工具,对字符串进行加密和解密操作

    分享一个非常不错的字符串加密和解密的程序. 可以指定不同的密钥对同一字符串进行不同的加密操作,增强加密性能. Java代码如下: package com.app; import java.securi ...

  3. java 简单的des加密示例

    1.加密结果 包含 : 对int加密 .对string加密.对byte[]加密. 10-09 18:33:32.484 7617-7617/com.example.tt.downtest D/Ciph ...

  4. PHP 识别 java 8位 des 加密和 解密方式

    代码及使用说明: <?php /** *PHP 识别 java 8位密钥的加密和解密方式 *@desc 加密方式 通用 */ class DES { var $key; var $iv; //偏 ...

  5. C#与Java互通AES算法加密解密

    /// <summary>AES加密</summary> /// <param name="text">明文</param> /// ...

  6. .NET与Java互通AES算法加密解密

    /// <summary>AES加密</summary> /// <param name="text">明文</param> /// ...

  7. 关于Objective-c和Java下DES加密保持一致的方式

    转载自:http://www.cnblogs.com/janken/archive/2012/04/05/2432930.html 最近做了一个移动项目,是有服务器和客户端类型的项目,客户端是要登录才 ...

  8. Android DES加密的CBC模式加密解密和ECB模式加密解密

    DES加密共有四种模式:电子密码本模式(ECB).加密分组链接模式(CBC).加密反馈模式(CFB)和输出反馈模式(OFB). CBC模式加密: import java.security.Key; i ...

  9. C# DES加密类,16位的加密。

    这个加密类是与java写的DES加密不同时,自己写的,最后与Java的加密相同了,解决了加密后不同的问题. 可以直接调用里面的加密和解密的方法. using System; using System. ...

  10. Android和java平台 DES加密解密互通程序及其不能互通的原因

    网上的demo一搜一大堆,但是,基本上都是一知半解(包括我).为什么呢?我在尝试分别在两个平台加密的时候,竟然发现Android DES 加密和java DES加密的程序不能互通.就是加密的结果不一样 ...

随机推荐

  1. [Gin] gin-jwt 中间件的请求流程与使用思路

    gin-jwt 中间件是对 jwt-go 的封装以适应 gin 框架.gin-jwt 对不同的请求流程有不同的 handler: 登录请求流程 是用 LoginHandler. 需要 jwt 令牌的后 ...

  2. C++多态与虚拟:运算符重载(Operator Overloading)

    运算符重载:与function overloading异曲同工的是,C++提供所谓的Operator overloading.所谓operators是像  +(加)-(減)*(乘)/(除)>&g ...

  3. LabView之MQTT协议使用

    一.MQTT概述 MQTT协议是一种消息列队传输协议,采用订阅.发布机制,订阅者只接收自己已经订阅的数据,非订阅数据则不接收,既保证了必要的数据的交换,又避免了无效数据造成的储存与处理.因此在工业物联 ...

  4. 简说Python之循环语句

    目录 Python的运算逻辑 Python条件语句 Python循环语句 Python while循环 Python for 循环 条件语句和循环语句是程序常用的一种基础语法,从语言上来说,能说清楚的 ...

  5. 一键关闭 Win11 系统广告「GitHub 热点速览」

    不知道读者中有多少人早已对 Windows 11 系统自带的广告感到厌烦,却又不知道如何关闭它们? 虽然网上有详细的关闭教程,但是都需要逐一手动操作,不是很方便.所以,今天「GitHub 热点速览」给 ...

  6. fastposter v2.9.1 程序员必备海报生成器

    fastposter v2.9.1 程序员必备海报生成器 fastposter海报生成器是一款快速开发海报的工具.只需上传一张背景图,在对应的位置放上组件(文字.图片.二维.头像)即可生成海报. 点击 ...

  7. threejs的坐标渲染和着色

    点击查看代码 function createBasic() { // 目标:了解顶点坐标绘制正方形 // 1. 准备 BufferGemotry 缓冲几何图形 // 2. 准备 32 位浮点数的数组, ...

  8. ansible使用详解

    ansible执行,用户主机配置 免密同一个同一个用户执行命令 1 能免密登录的[root@mcw1 ~]$ ansible 10.0.0.132 -m shell -a "hostname ...

  9. 利用FileReader进行二进制文件传输

    一.读取本地二进制文件,上传(数据库文件为例) 二进制文件读取的时候应当直接读取成字节数组,以免在调试时造成误解.比如数据库文件里面的有些字段是utf8编码,因此,采用utf-8编码读出来也能看到一些 ...

  10. Spring6 对 集成MyBatis 开发运用(附有详细的操作步骤)

    1. Spring6 对 集成MyBatis 开发运用(附有详细的操作步骤) @ 目录 1. Spring6 对 集成MyBatis 开发运用(附有详细的操作步骤) 每博一文案 2. 大概的实现步骤概 ...