Java与.NET DES加密解密互转

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

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

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

上代码:

Java代码:

 1 import javax.crypto.Cipher;   

 

 2  import javax.crypto.SecretKey;   
 3  import javax.crypto.SecretKeyFactory;   
 4  import javax.crypto.spec.DESKeySpec;   
 5  import javax.crypto.spec.IvParameterSpec;   
 6    
 7    
 8  public   class  Des {   
 9       private   byte [] desKey;   
10    
11         
12       // 解密数据   
13       public   static  String decrypt(String message,String key) throws Exception {   
14              
15               byte [] bytesrc  = convertHexString(message);      
16              Cipher cipher  =  Cipher.getInstance( " DES/CBC/PKCS5Padding " );       
17              DESKeySpec desKeySpec  =   new  DESKeySpec(key.getBytes( " UTF-8 " ));      
18              SecretKeyFactory keyFactory  =  SecretKeyFactory.getInstance( " DES " );      
19              SecretKey secretKey  =  keyFactory.generateSecret(desKeySpec);      
20              IvParameterSpec iv  =   new  IvParameterSpec(key.getBytes( " UTF-8 " ));   
21                     
22              cipher.init(Cipher.DECRYPT_MODE, secretKey, iv);         
23               
24               byte [] retByte  =  cipher.doFinal(bytesrc);        
25               return   new  String(retByte);    
26      }   
27    
28       public   static   byte [] encrypt(String message, String key)   
29              throws Exception {   
30          Cipher cipher  =  Cipher.getInstance( " DES/CBC/PKCS5Padding " );   
31    
32          DESKeySpec desKeySpec  =   new  DESKeySpec(key.getBytes( " UTF-8 " ));   
33    
34          SecretKeyFactory keyFactory  =  SecretKeyFactory.getInstance( " DES " );   
35          SecretKey secretKey  =  keyFactory.generateSecret(desKeySpec);   
36          IvParameterSpec iv  =   new  IvParameterSpec(key.getBytes( " UTF-8 " ));   
37          cipher.init(Cipher.ENCRYPT_MODE, secretKey, iv);   
38    
39           return  cipher.doFinal(message.getBytes( " UTF-8 " ));   
40      }   
41         
42       public   static   byte [] convertHexString(String ss)    
43      {    
44       byte  digest[]  =   new   byte [ss.length()  /   2 ];    
45       for ( int  i  =   0 ; i  <  digest.length; i ++ )    
46      {    
47      String byteString  =  ss.substring( 2   *  i,  2   *  i  +   2 );    
48       int  byteValue  =  Integer.parseInt(byteString,  16 );    
49      digest[i]  =  ( byte )byteValue;    
50      }    
51    
52       return  digest;    
53      }    
54    
55    
56       public   static   void  main(String[] args) throws Exception {   
57          String key  =   " 12345678 " ;   
58          String value = " test1234  " ;   
59          String jiami = java.net.URLEncoder.encode(value,  " utf-8 " ).toLowerCase();   
60             
61          System. out .println( " 加密数据: " + jiami);   
62          String a = toHexString(encrypt(jiami, key)).toUpperCase();   
63             
64         
65          System. out .println( " 加密后的数据为: " + a);   
66          String b = java.net.URLDecoder.decode(decrypt(a,key),  " utf-8 " ) ;   
67          System. out .println( " 解密后的数据: " + b);   
68    
69      }   
70    
71         
72       public   static  String toHexString( byte  b[]) {   
73          StringBuffer hexString  =   new  StringBuffer();   
74           for  ( int  i  =   0 ; i  <  b.length; i ++ ) {   
75              String plainText  =  Integer.toHexString( 0xff   &  b[i]);   
76               if  (plainText.length()  <   2 )   
77                  plainText  =   " 0 "   +  plainText;   
78              hexString.append(plainText);   
79          }   
80             
81           return  hexString.toString();   
82      }   
83    
84 

.NET代码

 1 using System;   

 

 2   using  System.Data;   
 3   using  System.Configuration;   
 4   using  System.Web;   
 5   using  System.Web.Security;   
 6   using  System.Web.UI;   
 7   using  System.Web.UI.WebControls;   
 8   using  System.Web.UI.WebControls.WebParts;   
 9   using  System.Web.UI.HtmlControls;   
10   using  System.Data.SqlClient;   
11   using  System.Security.Cryptography;   
12   using  System.IO;   
13   using  System.Text;   
14   public   class  TestDes{   
15        // cookies加密密钥   
16        public   static   string  DES_Key  =   " 12345678 " ;  
17    
18        #region  DESEnCode DES加密   
19        public   static   string  DESEnCode( string  pToEncrypt,  string  sKey)   
20       {   
21           pToEncrypt  =  HttpContext.Current.Server.UrlEncode(pToEncrypt);   
22           DESCryptoServiceProvider des  =   new  DESCryptoServiceProvider();   
23            byte [] inputByteArray  =  Encoding.GetEncoding( " UTF-8 " ).GetBytes(pToEncrypt);   
24     
25            
26           des.Key  =  ASCIIEncoding.ASCII.GetBytes(sKey);   
27           des.IV  =  ASCIIEncoding.ASCII.GetBytes(sKey);   
28           MemoryStream ms  =   new  MemoryStream();   
29           CryptoStream cs  =   new  CryptoStream(ms, des.CreateEncryptor(), CryptoStreamMode.Write);   
30     
31           cs.Write(inputByteArray,  0 , inputByteArray.Length);   
32           cs.FlushFinalBlock();   
33     
34           StringBuilder ret  =   new  StringBuilder();   
35            foreach  ( byte  b  in  ms.ToArray())   
36           {   
37               ret.AppendFormat( " {0:X2} " , b);   
38           }   
39           ret.ToString();   
40            return  ret.ToString();   
41       }  
42        #endregion   
43    
44        #region  DESDeCode DES解密   
45        public   static   string  DESDeCode( string  pToDecrypt,  string  sKey)   
46       {   
47            //     HttpContext.Current.Response.Write(pToDecrypt + "<br>" + sKey);   
48            //     HttpContext.Current.Response.End();   
49           DESCryptoServiceProvider des  =   new  DESCryptoServiceProvider();   
50     
51            byte [] inputByteArray  =   new   byte [pToDecrypt.Length  /   2 ];   
52            for  ( int  x  =   0 ; x  <  pToDecrypt.Length  /   2 ; x ++ )   
53           {   
54                int  i  =  (Convert.ToInt32(pToDecrypt.Substring(x  *   2 2 ),  16 ));   
55               inputByteArray[x]  =  ( byte )i;   
56           }   
57     
58           des.Key  =  ASCIIEncoding.ASCII.GetBytes(sKey);   
59           des.IV  =  ASCIIEncoding.ASCII.GetBytes(sKey);   
60           MemoryStream ms  =   new  MemoryStream();   
61           CryptoStream cs  =   new  CryptoStream(ms, des.CreateDecryptor(), CryptoStreamMode.Write);   
62           cs.Write(inputByteArray,  0 , inputByteArray.Length);   
63           cs.FlushFinalBlock();   
64     
65           StringBuilder ret  =   new  StringBuilder();   
66     
67            return  HttpContext.Current.Server.UrlDecode(System.Text.Encoding.Default.GetString(ms.ToArray()));   
68       }  
69        #endregion    
70     
71          public  TestDes()   
72       {   
73            //    
74            //  TODO: 在此处添加构造函数逻辑   
75            //    
76       }   
77  
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值