项目需要在两个系统间采用DES加密,一个系统为Java开发的,另外一个.NET开发的
在网上找了很多写法但加密出的数据两个系统都无法匹配,
在做了小修改以后终于可以用了,已经测试过
上代码
1Java代码: 2import javax.crypto.Cipher; 3import javax.crypto.SecretKey; 4import javax.crypto.SecretKeyFactory; 5import javax.crypto.spec.DESKeySpec; 6import javax.crypto.spec.IvParameterSpec; 7 8 9public class Des { 10private byte[] desKey; 11 12 13//解密数据 14public static String decrypt(String message,String key) 15throws Exception { 16 17byte[] bytesrc =convertHexString(message); 18Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding"); 19DESKeySpec desKeySpec = new DESKeySpec(key.getBytes("UTF-8")); 20SecretKeyFactory keyFactory = 21SecretKeyFactory.getInstance("DES"); 22SecretKey secretKey = keyFactory.generateSecret(desKeySpec); 23IvParameterSpec iv = new IvParameterSpec( 24key.getBytes("UTF-8")); 25 26cipher.init(Cipher.DECRYPT_MODE, secretKey, iv); 27 28byte[] retByte = cipher.doFinal(bytesrc); 29return new String(retByte); 30} 31 32public static byte[] encrypt(String message, String key) 33throws Exception { 34Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding"); 35 36DESKeySpec desKeySpec = new DESKeySpec(key.getBytes("UTF-8")); 37 38SecretKeyFactory keyFactory = 39SecretKeyFactory.getInstance("DES"); 40SecretKey secretKey = keyFactory.generateSecret(desKeySpec); 41IvParameterSpec iv = 42new IvParameterSpec(key.getBytes("UTF-8")); 43cipher.init(Cipher.ENCRYPT_MODE, secretKey, iv); 44 45return cipher.doFinal(message.getBytes("UTF-8")); 46} 47 48public static byte[] convertHexString(String ss) 49{ 50byte digest[] = new byte[ss.length() / 2]; 51for(int i = 0; i < digest.length; i++) 52{ 53String byteString = ss.substring(2 * i, 2 * i + 2); 54int byteValue = Integer.parseInt(byteString, 16); 55digest[i] = (byte)byteValue; 56} 57 58return digest; 59} 60 61 62public static void main(String[] args) throws Exception 63{ 64String key = "12345678"; 65String value="test1234 "; 66String jiami=java.net.URLEncoder.encode( 67value, "utf-8").toLowerCase(); 68 69System.out.println("加密数据:"+jiami); 70String a=toHexString(encrypt(jiami, key)).toUpperCase(); 71 72 73System.out.println("加密后的数据为:"+a); 74String b=java.net.URLDecoder.decode(decrypt(a,key), "utf-8") ; 75System.out.println("解密后的数据:"+b); 76 77} 78 79 80public static String toHexString(byte b[]) 81{ 82StringBuffer hexString = new StringBuffer(); 83for (int i = 0; i < b.length; i++) 84{ 85String plainText = Integer.toHexString(0xff & b[i]); 86if (plainText.length() < 2) plainText = "0" + plainText; 87hexString.append(plainText); 88} 89 90return hexString.toString(); 91} 92} 93 94 95.NET代码 96using System; 97using System.Data; 98using System.Configuration; 99using System.Web; 100using System.Web.Security; 101using System.Web.UI; 102using System.Web.UI.WebControls; 103using System.Web.UI.WebControls.WebParts; 104using System.Web.UI.HtmlControls; 105using System.Data.SqlClient; 106using System.Security.Cryptography; 107using System.IO; 108using System.Text; 109 110public class TestDes{ 111//cookies加密密钥 112public static string DES_Key = "12345678"; 113 114#region DESEnCode DES加密 115public static string DESEnCode(string pToEncrypt, string sKey) 116{ 117pToEncrypt = HttpContext.Current.Server.UrlEncode(pToEncrypt); 118DESCryptoServiceProvider des = new DESCryptoServiceProvider(); 119byte[] inputByteArray = 120Encoding.GetEncoding("UTF-8").GetBytes(pToEncrypt); 121 122 123des.Key = ASCIIEncoding.ASCII.GetBytes(sKey); 124des.IV = ASCIIEncoding.ASCII.GetBytes(sKey); 125MemoryStream ms = new MemoryStream(); 126CryptoStream cs = new CryptoStream( 127ms, des.CreateEncryptor(), CryptoStreamMode.Write); 128 129cs.Write(inputByteArray, 0, inputByteArray.Length); 130cs.FlushFinalBlock(); 131 132StringBuilder ret = new StringBuilder(); 133foreach (byte b in ms.ToArray()) 134{ 135ret.AppendFormat("{0:X2}", b); 136} 137ret.ToString(); 138return ret.ToString(); 139} 140#endregion 141 142#region DESDeCode DES解密 143public static string DESDeCode(string pToDecrypt, string sKey) 144{ 145// HttpContext.Current.Response.Write( 146// pToDecrypt + "<br>" + sKey); 147// HttpContext.Current.Response.End(); 148DESCryptoServiceProvider des = new DESCryptoServiceProvider(); 149 150byte[] inputByteArray = new byte[pToDecrypt.Length / 2]; 151for (int x = 0; x < pToDecrypt.Length / 2; x++) 152{ 153int i = (Convert.ToInt32(pToDecrypt.Substring( 154x * 2, 2), 16)); 155inputByteArray[x] = (byte)i; 156} 157 158des.Key = ASCIIEncoding.ASCII.GetBytes(sKey); 159des.IV = ASCIIEncoding.ASCII.GetBytes(sKey); 160MemoryStream ms = new MemoryStream(); 161CryptoStream cs = new CryptoStream( 162ms, des.CreateDecryptor(), CryptoStreamMode.Write); 163cs.Write(inputByteArray, 0, inputByteArray.Length); 164cs.FlushFinalBlock(); 165 166StringBuilder ret = new StringBuilder(); 167 168 169return HttpContext.Current.Server.UrlDecode( 170System.Text.Encoding.Default.GetString(ms.ToArray())); 171} 172#endregion 173 174public TestDes() 175{ 176// 177// TODO: 在此处添加构造函数逻辑 178// 179} 180}