zoukankan      html  css  js  c++  java
  • JAVA与.NET DES加密解密

     

    项目需要在两个系统间采用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: 在此处添加构造函数逻辑  
            //  
        }  
    }
  • 相关阅读:
    Asynchttpclient开源框架下载图片和文本,于Volley和Glide开源框架的区别。
    探究Python迭代器与生成器
    Python核心编程第二版 第十一章课后答案
    Python核心编程第二版 第十章课后答案
    Python核心编程第二版 第九章课后答案
    Python核心编程第二版 第八章课后答案
    Python核心编程第二版 第七章课后答案
    Python strip()方法介绍
    Python核心编程第二版 第六章课后练习
    Python中列表元素转为数字的方法
  • 原文地址:https://www.cnblogs.com/kangao/p/14355613.html
Copyright © 2011-2022 走看看