Java与.NET DES加密解密互转[转载]

Wesley13
• 阅读 696

项目需要在两个系统间采用DES加密,一个系统为Java开发的,另外一个.NET开发的

在网上找了很多写法但加密出的数据两个系统都无法匹配,

在做了小修改以后终于可以用了,已经测试过

上代码

Java代码:
import javax.crypto.Cipher; 
import javax.crypto.SecretKey; 
import javax.crypto.SecretKeyFactory; 
import javax.crypto.spec.DESKeySpec; 
import javax.crypto.spec.IvParameterSpec; 


public class Des { 
private byte[] desKey;
    
    
//解密数据 
public static String decrypt(String message,String key)
throws Exception { 
        
byte[] bytesrc =convertHexString(message); 
Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding"); 
DESKeySpec desKeySpec = new DESKeySpec(key.getBytes("UTF-8"));
SecretKeyFactory keyFactory = 
SecretKeyFactory.getInstance("DES"); 
SecretKey secretKey = keyFactory.generateSecret(desKeySpec); 
IvParameterSpec iv = new IvParameterSpec(
key.getBytes("UTF-8")); 
        
cipher.init(Cipher.DECRYPT_MODE, secretKey, iv);
        
byte[] retByte = cipher.doFinal(bytesrc); 
return new String(retByte); 
} 
    
public static byte[] encrypt(String message, String key) 
throws Exception {
Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding"); 
        
DESKeySpec desKeySpec = new DESKeySpec(key.getBytes("UTF-8")); 
        
SecretKeyFactory keyFactory = 
SecretKeyFactory.getInstance("DES"); 
SecretKey secretKey = keyFactory.generateSecret(desKeySpec); 
IvParameterSpec iv = 
new IvParameterSpec(key.getBytes("UTF-8")); 
cipher.init(Cipher.ENCRYPT_MODE, secretKey, iv); 
        
return cipher.doFinal(message.getBytes("UTF-8")); 
} 
    
public static byte[] convertHexString(String ss) 
{
byte digest[] = new byte[ss.length() / 2]; 
for(int i = 0; i < digest.length; i++) 
{ 
String byteString = ss.substring(2 * i, 2 * i + 2); 
int byteValue = Integer.parseInt(byteString, 16);
digest[i] = (byte)byteValue;
} 
        
return digest; 
} 
    
    
public static void main(String[] args) throws Exception 
{ 
String key = "12345678";
String value="test1234 "; 
String jiami=java.net.URLEncoder.encode(
value, "utf-8").toLowerCase();
        
System.out.println("加密数据:"+jiami); 
String a=toHexString(encrypt(jiami, key)).toUpperCase(); 
        
        
System.out.println("加密后的数据为:"+a); 
String b=java.net.URLDecoder.decode(decrypt(a,key), "utf-8") ;
System.out.println("解密后的数据:"+b); 
        
} 
    
    
public static String toHexString(byte b[]) 
{ 
StringBuffer hexString = new StringBuffer(); 
for (int i = 0; i < b.length; i++) 
{ 
String plainText = Integer.toHexString(0xff & b[i]); 
if (plainText.length() < 2) plainText = "0" + plainText;
hexString.append(plainText);
} 
        
return hexString.toString();
} 
} 


.NET代码
using System; 
using System.Data; 
using System.Configuration; 
using System.Web; 
using System.Web.Security; 
using System.Web.UI; 
using System.Web.UI.WebControls; 
using System.Web.UI.WebControls.WebParts; 
using System.Web.UI.HtmlControls; 
using System.Data.SqlClient; 
using System.Security.Cryptography; 
using System.IO;
using System.Text; 

public class TestDes{ 
//cookies加密密钥 
public static string DES_Key = "12345678"; 
    
#region DESEnCode DES加密 
public static string DESEnCode(string pToEncrypt, string sKey) 
{ 
pToEncrypt = HttpContext.Current.Server.UrlEncode(pToEncrypt); 
DESCryptoServiceProvider des = new DESCryptoServiceProvider(); 
byte[] inputByteArray = 
Encoding.GetEncoding("UTF-8").GetBytes(pToEncrypt); 
        
        
des.Key = ASCIIEncoding.ASCII.GetBytes(sKey); 
des.IV = ASCIIEncoding.ASCII.GetBytes(sKey); 
MemoryStream ms = new MemoryStream();
CryptoStream cs = new CryptoStream(
ms, des.CreateEncryptor(), CryptoStreamMode.Write); 
        
cs.Write(inputByteArray, 0, inputByteArray.Length); 
cs.FlushFinalBlock(); 
        
StringBuilder ret = new StringBuilder(); 
foreach (byte b in ms.ToArray()) 
{ 
ret.AppendFormat("{0:X2}", b); 
} 
ret.ToString(); 
return ret.ToString(); 
} 
#endregion 
    
#region DESDeCode DES解密 
public static string DESDeCode(string pToDecrypt, string sKey) 
{ 
// HttpContext.Current.Response.Write(
//     pToDecrypt + "<br>" + sKey);
// HttpContext.Current.Response.End(); 
DESCryptoServiceProvider des = new DESCryptoServiceProvider(); 
        
byte[] inputByteArray = new byte[pToDecrypt.Length / 2]; 
for (int x = 0; x < pToDecrypt.Length / 2; x++) 
{ 
int i = (Convert.ToInt32(pToDecrypt.Substring(
x * 2, 2), 16)); 
inputByteArray[x] = (byte)i; 
} 
        
des.Key = ASCIIEncoding.ASCII.GetBytes(sKey); 
des.IV = ASCIIEncoding.ASCII.GetBytes(sKey); 
MemoryStream ms = new MemoryStream(); 
CryptoStream cs = new CryptoStream(
ms, des.CreateDecryptor(), CryptoStreamMode.Write); 
cs.Write(inputByteArray, 0, inputByteArray.Length); 
cs.FlushFinalBlock(); 
        
StringBuilder ret = new StringBuilder(); 
        
        
return HttpContext.Current.Server.UrlDecode(
System.Text.Encoding.Default.GetString(ms.ToArray()));
} 
#endregion 
    
public TestDes() 
{ 
// 
// TODO: 在此处添加构造函数逻辑 
// 
} 
}
点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
4个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
3年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Stella981 Stella981
3年前
Docker 部署SpringBoot项目不香吗?
  公众号改版后文章乱序推荐,希望你可以点击上方“Java进阶架构师”,点击右上角,将我们设为★“星标”!这样才不会错过每日进阶架构文章呀。  !(http://dingyue.ws.126.net/2020/0920/b00fbfc7j00qgy5xy002kd200qo00hsg00it00cj.jpg)  2
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
10个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这