key 是MD5加密以后,截取前8位,iv 也是一样的。
public static void initKey() { try { strKey = MD5Utils.getMD5(keyName.getBytes("ASCII")).substring(0, 8) .toUpperCase(); strIv = MD5Utils.getMD5(keyName.getBytes("ASCII")).substring(0, 8) .toUpperCase(); } catch (UnsupportedEncodingException e) { // TODO Auto-generated catch block e.printStackTrace(); } }
加密方法
/** * DES 加密 * * @param message * 要加密的字符串 * @param key * 密钥 * @return * @throws Exception */ public static String encrypt(String message) throws Exception { initKey(); SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES"); Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding"); DESKeySpec desKeySpec = new DESKeySpec(strKey.getBytes("ASCII")); SecretKey secretKey = keyFactory.generateSecret(desKeySpec); IvParameterSpec iv = new IvParameterSpec(strKey.getBytes("ASCII")); cipher.init(Cipher.ENCRYPT_MODE, secretKey, iv); byte[] se = cipher.doFinal(message.getBytes()); return toHexString(se); }
解密方法
/** * DES 解密 * * @param message * 要加密的字符串 * @param key * 密钥 * @return * @throws Exception */ public static byte[] decrypt(String message) throws Exception { initKey(); SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES"); Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding"); DESKeySpec desKeySpec = new DESKeySpec(strKey.getBytes("ASCII")); SecretKey secretKey = keyFactory.generateSecret(desKeySpec); IvParameterSpec iv = new IvParameterSpec(strKey.getBytes("ASCII")); cipher.init(Cipher.DECRYPT_MODE, secretKey, iv); byte[] bytesrc = convertHexString(message);// convertHexString(message); byte[] retByte = cipher.doFinal(bytesrc); return retByte; }
字符串转byte[]
/** * String 转为byte [] * * @param ss * @return */ 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; }
byte[] 转16进制字符串
/** * byte 数组转为16进制数据 * * @param b * @return */ 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(); }
附加一个md5 加密
/** * MD5 加密密钥 * * @param source * 要加密的密钥 byte[] * @return */ public static String getMD5(byte[] source) { String s = null; // 用来将字节转换成16进制表示的字符 char[] hexDigits = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' }; try { MessageDigest md = MessageDigest.getInstance("MD5"); md.update(source); // MD5的计算结果是一个128位的长整数,用字节表示为16个字节 byte[] tmp = md.digest(); // 每个字节用16进制表示的话,使用2个字符(高4位一个,低4位一个),所以表示成16进制需要32个字符 char[] str = new char[16 * 2]; int k = 0;// 转换结果中对应的字符位置 for (int i = 0; i < 16; i++) {// 对MD5的每一个字节转换成16进制字符 byte byte0 = tmp[i]; str[k++] = hexDigits[byte0 >>> 4 & 0xf];// 对字节高4位进行16进制转换 str[k++] = hexDigits[byte0 & 0xf]; // 对字节低4位进行16进制转换 } s = new String(str); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } return s; }
加密结果:73b1ed362d0a1e22
解密结果:123456
ps:密钥自定义
附上我自己的key iv
private final static String keyName = "zzsoftaccp2011"; // key iv 密钥名称 private static String strKey; private static String strIv;