CryptUtil加密工具类(Java)

CryptUtil代码如下: ```java package com.lenovo.api.util; import sun.misc.BASE64Decoder; import sun.misc.BASE64Encoder; import javax.crypto.*; import javax.crypto.spec.DESKeySpec; import javax.crypto.spec.SecretKeySpec; import java.security.Key; import java.security.MessageDigest; import java.security.SecureRandom; import java.util.Date; /** * <ul> * <li>BASE64的加密解密是双向的,可以求反解。</li> * <li>MD5、SHA以及HMAC是单向加密,任何数据加密后只会产生唯一的一个加密串,通常用来校验数据在传输过程中是否被修改。</li> * <li>HMAC算法有一个密钥,增强了数据传输过程中的安全性,强化了算法外的不可控因素。</li> * <li>DES DES-Data Encryption Standard,即数据加密算法。 DES算法的入口参数有三个:Key、Data、Mode。 * <ul> * <li>Key:8个字节共64位,是DES算法的工作密钥;</li> * <li>Data:8个字节64位,是要被加密或被解密的数据;</li> * <li>Mode:DES的工作方式,有两种:加密或解密。</li> * </ul> * </li> * <ul> * * @author * */ public class CryptUtil { private static final String KEY_MD5 = "MD5"; private static final String KEY_SHA = "SHA"; /** * MAC算法可选以下多种算法 * * <pre> * * HmacMD5 * HmacSHA1 * HmacSHA256 * HmacSHA384 * HmacSHA512 * </pre> */ public static final String KEY_MAC = "HmacMD5"; /** * BASE64解密 * * @param key * @return * @throws Exception */ public static byte[] decryptBASE64(String key) throws Exception { return (new BASE64Decoder()).decodeBuffer(key); } /** * BASE64 加密 * * @param key * @return * @throws Exception */ public static String encryptBASE64(byte[] key) throws Exception { return (new BASE64Encoder()).encodeBuffer(key); } /** * MD5加密 * * @param data * @return * @throws Exception */ public static byte[] encryptMD5(byte[] data) throws Exception { MessageDigest md5 = MessageDigest.getInstance(KEY_MD5); md5.update(data); return md5.digest(); } /** * SHA加密 * * @param data * @return * @throws Exception */ public static byte[] encryptSHA(byte[] data) throws Exception { MessageDigest sha = MessageDigest.getInstance(KEY_SHA); sha.update(data); return sha.digest(); } /** * 初始化HMAC密钥 * * @return * @throws Exception */ public static String initMacKey() throws Exception { KeyGenerator keyGenerator = KeyGenerator.getInstance(KEY_MAC); SecretKey secretKey = keyGenerator.generateKey(); return encryptBASE64(secretKey.getEncoded()); } /** * HMAC 加密 * * @param data * @param key * @return * @throws Exception */ public static byte[] encryptHMAC(byte[] data, String key) throws Exception { SecretKey secretKey = new SecretKeySpec(decryptBASE64(key), KEY_MAC); Mac mac = Mac.getInstance(secretKey.getAlgorithm()); mac.init(secretKey); return mac.doFinal(data); } /** * DES 算法 <br> * 可替换为以下任意一种算法,同时key值的size相应改变。 * * <pre> * DES key size must be equal to 56 * DESede(TripleDES) key size must be equal to 112 or 168 * AES key size must be equal to 128, 192 or 256,but 192 and 256 bits may not be available * Blowfish key size must be multiple of 8, and can only range from 32 to 448 (inclusive) * RC2 key size must be between 40 and 1024 bits * RC4(ARCFOUR) key size must be between 40 and 1024 bits * </pre> */ public static final String ALGORITHM = "DES"; /** * DES 算法转换密钥<br> * * @param key * @return * @throws Exception */ private static Key toKey(byte[] key) throws Exception { SecretKey secretKey = null; if (ALGORITHM.equals("DES") || ALGORITHM.equals("DESede")) { DESKeySpec dks = new DESKeySpec(key); SecretKeyFactory keyFactory = SecretKeyFactory .getInstance(ALGORITHM); secretKey = keyFactory.generateSecret(dks); } else { // 当使用其他对称加密算法时,如AES、Blowfish等算法时,用下述代码替换上述三行代码 secretKey = new SecretKeySpec(key, ALGORITHM); } return secretKey; } /** * 对数据进行DES加密. * * @param data * 待进行DES加密的数据 * @return 返回经过DES加密后的数据 * @throws Exception * @author <a href="mailto:xiexingxing1121@126.com" * mce_href="mailto:xiexingxing1121@126.com">AmigoXie</a> Creation * date: 2007-7-31 - 下午12:06:24 */ public final static String decrypt(String data,String key) throws Exception { return new String(decrypt(hex2byte(data.getBytes()), key.getBytes())); } /** * 用指定的key对数据进行DES解密. * * @param data * 待解密的数据 * @param key * DES解密的key * @return 返回DES解密后的数据 * @throws Exception * @author <a href="mailto:xiexingxing1121@126.com" * mce_href="mailto:xiexingxing1121@126.com">AmigoXie</a> Creation * date: 2007-7-31 - 下午12:10:34 */ private static byte[] decrypt(byte[] data, byte[] key) throws Exception { // DES算法要求有一个可信任的随机数源 SecureRandom sr = new SecureRandom(); // 从原始密匙数据创建一个DESKeySpec对象 DESKeySpec dks = new DESKeySpec(key); // 创建一个密匙工厂,然后用它把DESKeySpec对象转换成 // 一个SecretKey对象 SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(ALGORITHM); SecretKey securekey = keyFactory.generateSecret(dks); // Cipher对象实际完成解密操作 Cipher cipher = Cipher.getInstance(ALGORITHM); // 用密匙初始化Cipher对象 cipher.init(Cipher.DECRYPT_MODE, securekey, sr); // 现在,获取数据并解密 // 正式执行解密操作 return cipher.doFinal(data); } public static byte[] hex2byte(byte[] b) { if ((b.length % 2) != 0) { throw new IllegalArgumentException("长度不是偶数"); } byte[] b2 = new byte[b.length / 2]; for (int n = 0; n < b.length; n += 2) { String item = new String(b, n, 2); b2[n / 2] = (byte) Integer.parseInt(item, 16); } return b2; } /** * 对用DES加密过的数据进行解密. * * @param data * DES加密数据 * @return 返回解密后的数据 * @throws Exception * @author <a href="mailto:xiexingxing1121@126.com" * mce_href="mailto:xiexingxing1121@126.com">AmigoXie</a> Creation * date: 2007-7-31 - 下午12:07:54 */ public final static String encrypt(String data,String key) throws Exception { return byte2hex(encrypt(data.getBytes(), key.getBytes())); } public 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(); } private static byte[] encrypt(byte[] data, byte[] key) throws Exception { // DES算法要求有一个可信任的随机数源 SecureRandom sr = new SecureRandom(); // 从原始密匙数据创建DESKeySpec对象 DESKeySpec dks = new DESKeySpec(key); // 创建一个密匙工厂,然后用它把DESKeySpec转换成 // 一个SecretKey对象 SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(ALGORITHM); SecretKey securekey = keyFactory.generateSecret(dks); // Cipher对象实际完成加密操作 Cipher cipher = Cipher.getInstance(ALGORITHM); // 用密匙初始化Cipher对象 cipher.init(Cipher.ENCRYPT_MODE, securekey, sr); // 现在,获取数据并加密 // 正式执行加密操作 return cipher.doFinal(data); } public String getMD5(String vars) throws Exception { // 首先用生成一个MessageDigest类,确定计算方法 MessageDigest md5 = MessageDigest.getInstance("MD5"); // 添加要进行加密的信息 md5.update(vars.getBytes("UTF-8")); // 开始进行加密 byte[] digesta = md5.digest(); BASE64Encoder base64 = new BASE64Encoder(); return base64.encode(digesta); } public static String getSHA(String vars) throws Exception { // 首先用生成一个MessageDigest类,确定计算方法 MessageDigest md5 = MessageDigest.getInstance("SHA-1"); // 添加要进行加密的信息 md5.update(vars.getBytes("UTF-8")); // 开始进行加密 byte[] digesta = md5.digest(); BASE64Encoder base64 = new BASE64Encoder(); return base64.encode(digesta); } } ```