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. 阿里云徐立:面向容器和 Serverless Computing 的存储创新

    ​简介:以上为大家分享了阿里云容器存储的技术创新,包括 DADI 镜像加速技术,为容器规模化启动奠定了很好的基础,ESSD 云盘提供极致性能,CNFS 容器网络文件系统提供极致的用户体验. 作者:徐立 ...

  2. [FAQ] 在 Mac 系统上 yarn add canvas 安装失败的原因

      当使用 yarn add 安装某个 node 库时,如果出现失败,多半是由于 nodejs 版本问题引起的. 现在我们可以使用 nvm 方便的管理不同的 nodejs 进行随时切换. $ nvm ...

  3. [PHP] 浅谈 Laravel Authorization 的 gates 与 policies

    首先要区分 Authentication 与 Authorization,认证和授权,粗细有别. 授权(Authorization) 有两种主要方式,Gates 和 Policies. Gates 和 ...

  4. WPF 已知问题 开启 IsManipulationEnabled 之后触摸长按 RepeatButton 不会触发连续的 Click 事件

    本文记录 WPF 的一个已知问题,在 RepeatButton 上开启 IsManipulationEnabled 漫游支持之后,将会导致触摸长按到 RepeatButton 之上时,不会收到源源不断 ...

  5. WPF 使用 Win10 的 WinRT 自带 Windows.Media.Ocr 实现图片转文本

    世界上有很多 OCR 识别技术,本文来和大家介绍如果在 WPF 里,在运行到 win10 的设备上,通过 Windows Runtime 自带的 Windows.Media.Ocr 实现在给定的图片里 ...

  6. MO Memory

    关于MO和OI的选拔流程 MO:省赛--联赛--国赛 省赛:各省组织,时间不同但多在4~6月.按成绩选出参加联赛选手.浙江省的省赛全称"浙江省高中数学联赛",5月进行. 联赛:旧称 ...

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

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

  8. gorm 返回的 *DB 说明

    RecordNotFound 跟在查询的后面(Find/First),bool true:没有查到记录 false:查到记录 Error 跟在修改(create/update)的后面,如果错误就会报错 ...

  9. 在线电子表格编辑器 Luckysheet

    下载地址 不知道地址正不正经,我先用着,网上找的地址,不知道是不是可信任的,疑似官网的两个地址都打不开, https://github.com/dream-num/Luckysheet zip包  h ...

  10. NFS共享文件

    NFS共享文件 服务端 安装NFS [root@localhost www] yum -y install nfs-utils rpcbind 创建需要共享的文件夹share [root@localh ...