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加密的程序不能互通.就是加密的结果不一样 ...
随机推荐
- OpenKruise v1.0:云原生应用自动化达到新的高峰
简介:OpenKruise 是针对 Kubernetes 的增强能力套件,聚焦于云原生应用的部署.升级.运维.稳定性防护等领域. 云原生应用自动化管理套件.CNCF Sandbox 项目 -- Op ...
- 【ESSD技术解读-03】阿里云块存储企业级特性之异步复制
简介: 在大数据时代,数据就是企业的核心资产,是企业的生命线.在现实世界中,灾难时有发生,当发生灾难时,容灾能力成为企业能否生存的关键.云上容灾服务,通常称为 DRaaS(灾难恢复即服务)不但能够省 ...
- Region-区域
定义Region的方式有两种: 一种是在XAML定义 RegionManager.RegionName(XAML) 一.View代码 1 <Viewbox Grid.Column="1 ...
- 尝试 IIncrementalGenerator 进行增量 Source Generator 生成代码
在加上热重载时,源代码生成 Source Generator 的默认行为会让 Visual Studio 有些为难,其原因是热重载会变更代码,变更代码触发代码生成器更新代码,代码生成器更新的代码说不定 ...
- 一个支持Sora模型文本生成视频的Web客户端
大家好,我是 Java陈序员. 最近 Open AI 又火了一把,其新推出的文本生成视频模型 -- Sora,引起了巨大的关注. Sora 目前仅仅只是发布预告视频,还未开放出具体的 API. 今天, ...
- python执行SQL语句中有格式化时是否需要加引号
import pymysqldb = pymysql.connect(host='localhost', user='root', password='123456', database='test' ...
- Unity 热更--AssetBundle学习笔记 1.0【AB包资源加载工具类的实现】
工具类封装 通过上文中对AB包加载API的了解和简单使用,对AB包资源加载的几种方法进行封装,将其写入单例类中,如代码展示. 确保每个AB资源包只加载一次: 在LoadAssetBundleManag ...
- 4.10 + (double)(rand()%10)/100.0
黑色星期四 坏消息: 没有奥赛课,所以大概率调不出来 CF1479D 好消息: 5k 回来了,调题有望 中午起床直接来的机房,有学科自习就说 氟硫氢 不知道 结果被叫回去了 而且今天班里没水了,趁着大 ...
- 快速入门一篇搞定RocketMq-实现微服务实战落地
1.RocketMq介绍 RocketMQ起源于阿里巴巴,最初是为了解决邮件系统的高可靠性和高性能而设计的.在2016年开源分布式消息中间件,并逐渐成为Apache顶级项目.现在是Apache的一个顶 ...
- Unity Linear Gamma色彩空间矫正测试
Gamma和Linear修正的问题相信网上已经有很多文章了.简单来说显示器的颜色输出不是线性的,根据硬件参数和输出颜色 信息拟合曲线是x^2.2,因此会使用一个x^0.45曲线将其拟合回线性. 因为0 ...