/* ================================================================== * Created [2009-4-27 下午11:32:55] by Jon.King * ================================================================== * TSS * ================================================================== * mailTo:jinpujun@hotmail.com * Copyright (c) Jon.King, 2009-2012 * ================================================================== */ package com.jinhe.tss.core.util; import java.security.InvalidKeyException; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import javax.crypto.BadPaddingException; import javax.crypto.Cipher; import javax.crypto.IllegalBlockSizeException; import javax.crypto.NoSuchPaddingException; import javax.crypto.SecretKey; import javax.crypto.spec.SecretKeySpec; import com.jinhe.tss.core.exception.BusinessException; import com.thoughtworks.xstream.core.util.Base64Encoder; /** * 信息加/解密工具类 * * @author Jon.King 2008-8-18 */ public class InfoEncoder { private static String ALGORITHM = "Blowfish"; private Cipher getCipher(int Cipher_MODE) { SecretKey deskey = new SecretKeySpec("jinhe-tss".getBytes(), ALGORITHM); try { Cipher cipher = Cipher.getInstance(ALGORITHM); cipher.init(Cipher_MODE, deskey); return cipher; } catch (NoSuchAlgorithmException e) { throw new BusinessException("没有此加/解密算法,加密器初始化失败", e); } catch (NoSuchPaddingException e) { throw new BusinessException("加/解密器初始化失败", e); } catch (InvalidKeyException e) { throw new BusinessException("非法的加/解密密匙,加密失败", e); } } /** * 将字符串加密 * * @param datasource * 要加密的数据 * @return 返回加密后的 byte 数组 * @throws Exception */ public String createEncryptor(String datasource) { byte[] encryptorData; try { encryptorData = getCipher(Cipher.ENCRYPT_MODE).doFinal(datasource.getBytes()); } catch (BadPaddingException ex) { throw new BusinessException("非法的加密数据,加密失败:" + datasource, ex); } catch (IllegalBlockSizeException ex) { throw new BusinessException("加密字符串字节数不对,加密失败:" + datasource, ex); } return new Base64Encoder().encode(encryptorData).replaceAll("\\s", ""); } /** * <p> * 将字符串解密 * </p> * * @param datasource * 要解密的数据 * @return 返回加密后的 byte[] */ public String createDecryptor(String datasource) { byte[] decryptorData = new Base64Encoder().decode(datasource); byte[] createDecryptor; try { createDecryptor = getCipher(Cipher.DECRYPT_MODE).doFinal(decryptorData); } catch (BadPaddingException ex) { throw new BusinessException("非法的解密数据,解密失败:" + datasource, ex); } catch (IllegalBlockSizeException ex) { throw new BusinessException("解密字符串字节数不对,解密失败:" + datasource, ex); } return new String(createDecryptor); } private static final String MESSAGE_DIGEST_TYPE = "MD5"; /** * 加密:MD5 * * @param str * @return */ public static String string2MD5(String str) { try { MessageDigest alga = MessageDigest.getInstance(MESSAGE_DIGEST_TYPE); alga.update(str.getBytes()); byte[] digesta = alga.digest(); return byte2hex(digesta); } catch (NoSuchAlgorithmException ex) { return str; } } /** * 二行制转字符串 * * @param b * @return */ private static String byte2hex(byte[] b) { String hs = ""; String stmp = ""; for (int n = 0; n < b.length; n++) { stmp = (Integer.toHexString(b[n] & 0XFF)); if (stmp.length() == 1) hs = hs + "0" + stmp; else hs = hs + stmp; } return hs.toUpperCase(); } }