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加密的程序不能互通.就是加密的结果不一样 ...
随机推荐
- 阿里云徐立:面向容器和 Serverless Computing 的存储创新
简介:以上为大家分享了阿里云容器存储的技术创新,包括 DADI 镜像加速技术,为容器规模化启动奠定了很好的基础,ESSD 云盘提供极致性能,CNFS 容器网络文件系统提供极致的用户体验. 作者:徐立 ...
- [FAQ] 在 Mac 系统上 yarn add canvas 安装失败的原因
当使用 yarn add 安装某个 node 库时,如果出现失败,多半是由于 nodejs 版本问题引起的. 现在我们可以使用 nvm 方便的管理不同的 nodejs 进行随时切换. $ nvm ...
- [PHP] 浅谈 Laravel Authorization 的 gates 与 policies
首先要区分 Authentication 与 Authorization,认证和授权,粗细有别. 授权(Authorization) 有两种主要方式,Gates 和 Policies. Gates 和 ...
- WPF 已知问题 开启 IsManipulationEnabled 之后触摸长按 RepeatButton 不会触发连续的 Click 事件
本文记录 WPF 的一个已知问题,在 RepeatButton 上开启 IsManipulationEnabled 漫游支持之后,将会导致触摸长按到 RepeatButton 之上时,不会收到源源不断 ...
- WPF 使用 Win10 的 WinRT 自带 Windows.Media.Ocr 实现图片转文本
世界上有很多 OCR 识别技术,本文来和大家介绍如果在 WPF 里,在运行到 win10 的设备上,通过 Windows Runtime 自带的 Windows.Media.Ocr 实现在给定的图片里 ...
- MO Memory
关于MO和OI的选拔流程 MO:省赛--联赛--国赛 省赛:各省组织,时间不同但多在4~6月.按成绩选出参加联赛选手.浙江省的省赛全称"浙江省高中数学联赛",5月进行. 联赛:旧称 ...
- 一键关闭 Win11 系统广告「GitHub 热点速览」
不知道读者中有多少人早已对 Windows 11 系统自带的广告感到厌烦,却又不知道如何关闭它们? 虽然网上有详细的关闭教程,但是都需要逐一手动操作,不是很方便.所以,今天「GitHub 热点速览」给 ...
- gorm 返回的 *DB 说明
RecordNotFound 跟在查询的后面(Find/First),bool true:没有查到记录 false:查到记录 Error 跟在修改(create/update)的后面,如果错误就会报错 ...
- 在线电子表格编辑器 Luckysheet
下载地址 不知道地址正不正经,我先用着,网上找的地址,不知道是不是可信任的,疑似官网的两个地址都打不开, https://github.com/dream-num/Luckysheet zip包 h ...
- NFS共享文件
NFS共享文件 服务端 安装NFS [root@localhost www] yum -y install nfs-utils rpcbind 创建需要共享的文件夹share [root@localh ...