1 package com.mall.common; 2 3 import java.security.Key; 4 import java.security.Security; 5 import javax.crypto.Cipher; 6 7 8 public class DesUtils { 9 10 public static final String ALGORITHM = "DES"; 11 private static final String DEFAULT_KEY = "eCpBr.C8"; //8位 12 13 14 public static Key getKey(String strKey) throws Exception { 15 Security.addProvider(new com.sun.crypto.provider.SunJCE()); 16 return getKey(strKey.getBytes()); 17 } 18 19 20 /** 21 * 从指定字符串生成密钥,密钥所需的字节数组长度为8位 不足8位时后面补0,超出8位只取前8位 22 * 23 * @param arrBTmp 构成该字符串的字节数组 24 * @return 生成的密钥 25 * @throws Exception 26 */ 27 private static Key getKey(byte[] arrBTmp) throws Exception { 28 // 创建一个空的8位字节数组(默认值为0) 29 byte[] arrB = new byte[8]; 30 // 将原始字节数组转换为8位 31 for (int i = 0; i < arrBTmp.length && i < arrB.length; i++) { 32 arrB[i] = arrBTmp[i]; 33 } 34 // 生成密钥 35 Key key; 36 key = new javax.crypto.spec.SecretKeySpec(arrB, "DES"); 37 return key; 38 } 39 40 41 /** 42 * 根据密匙进行DES加密 43 * 44 * @param key 45 * 密匙 46 * @param info 47 * 要加密的信息 48 * @return String 加密后的信息 49 */ 50 public static String encrypt(Key key, String srcString) throws Exception{ 51 // 定义要生成的密文 52 byte[] cipherByte = null; 53 54 // 得到加密/解密器 55 Cipher c1 = Cipher.getInstance(ALGORITHM); 56 // 用指定的密钥和模式初始化Cipher对象 57 // 参数:(ENCRYPT_MODE, DECRYPT_MODE, WRAP_MODE,UNWRAP_MODE) 58 c1.init(Cipher.ENCRYPT_MODE, key); 59 // 对要加密的内容进行编码处理, 60 cipherByte = c1.doFinal(srcString.getBytes()); 61 62 // 返回密文的十六进制形式 63 return byte2hex(cipherByte); 64 } 65 66 public static String defaultEncrypt(String srcString) throws Exception{ 67 return encrypt(getKey(DEFAULT_KEY),srcString); 68 } 69 70 71 /** 72 * 根据密匙进行DES解密 73 * 74 * @param key 75 * 密匙 76 * @param sInfo 77 * 要解密的密文 78 * @return String 返回解密后信息 79 */ 80 public static String decrypt(Key key, String encryptedString) throws Exception{ 81 82 byte[] cipherByte = null; 83 // 得到加密/解密器 84 Cipher c1 = Cipher.getInstance(ALGORITHM); 85 // 用指定的密钥和模式初始化Cipher对象 86 c1.init(Cipher.DECRYPT_MODE, key); 87 // 对要解密的内容进行编码处理 88 cipherByte = c1.doFinal(hex2byte(encryptedString)); 89 90 // return byte2hex(cipherByte); 91 return new String(cipherByte); 92 } 93 94 95 public static String defaultDecrypt(String encryptedString) throws Exception{ 96 return decrypt(getKey(DEFAULT_KEY),encryptedString); 97 } 98 99 100 /** 101 * 将二进制转化为16进制字符串 102 * 103 * @param b 104 * 二进制字节数组 105 * @return String 106 */ 107 public static String byte2hex(byte[] b) { 108 109 if(null==b){ 110 return null; 111 } 112 113 StringBuffer hs = new StringBuffer(""); 114 String stmp = ""; 115 for (int n = 0; n < b.length; n++) { 116 stmp = (java.lang.Integer.toHexString(b[n] & 0XFF)); 117 if (stmp.length() == 1) { 118 hs.append("0").append(stmp); 119 } else { 120 hs.append(stmp); 121 } 122 } 123 return hs.toString().toUpperCase(); 124 } 125 /** 126 * 十六进制字符串转化为2进制 127 * 128 * @param hex 129 * @return 130 */ 131 public static byte[] hex2byte(String hex) throws Exception { 132 if (null== hex || hex.length() % 2 != 0) { 133 System.out.println("[ERROR]DESUtil:string to hex is null or invalid length!"); 134 throw new Exception(); 135 } 136 char[] arr = hex.toCharArray(); 137 byte[] b = new byte[hex.length() / 2]; 138 for (int i = 0, j = 0, l = hex.length(); i < l; i++, j++) { 139 String swap = "" + arr[i++] + arr[i]; 140 int byteint = Integer.parseInt(swap, 16) & 0xFF; 141 b[j] = new Integer(byteint).byteValue(); 142 } 143 return b; 144 } 145 public static void main(String[] args) throws Exception{ 146 //F7A2744E551B356BC8C758ED4D28F5A0 147 //加密 148 System.out.println(DesUtils.encrypt(DesUtils.getKey(DEFAULT_KEY),"I LOVE You Chou Lan Lan")); 149 //解密 150 System.out.println(DesUtils.decrypt(DesUtils.getKey(DEFAULT_KEY),"5A591E309C34621AF7FFDBB429EEE0E18561D84A28B20DB6")); 151 } 152 153 }