import java.security.Key; import java.security.KeyPair; import java.security.KeyPairGenerator; import java.security.spec.KeySpec; import javax.crypto.Cipher; import javax.crypto.KeyGenerator; import javax.crypto.SecretKey; import javax.crypto.SecretKeyFactory; import javax.crypto.spec.DESKeySpec; import javax.crypto.spec.DESedeKeySpec; import javax.crypto.spec.SecretKeySpec; /** * 加解密统一接口,支持流行的对称和非对称算法 * 目前可以使用3DES,AES,RSA进行加解密 * @author luis.chen * @version $Id: EncryptUtil.java, v 0.1 2014年6月17日 上午11:08:28 luis.chen Exp $ */ public class EncryptUtil { public static void main(String args[]){ String plainText = "我是一只小小鸟"; try { System.out.println("开始使用AES加密...."); //使用AES加密 byte[] asKey = getDefaultKey(EncryptAlgorithm.AES); String encStr = testSymmEncry(plainText,asKey,EncryptAlgorithm.AES); System.out.println("AES加密之后:"+encStr); //使用AES解密 String decStr = testSymmDecry(encStr,asKey,EncryptAlgorithm.AES); System.out.println("AES解密之后:"+decStr); System.out.println("开始使用RSA加密...."); KeyPair kp = getDefaultKeyPair(EncryptAlgorithm.RSA); String rsaEncStr = testAsymmEncry(plainText,kp.getPublic(),EncryptAlgorithm.RSAWithPadding); System.out.println("RSA加密之后:"+rsaEncStr); //使用RSA解密 String desDecStr = testAsymmDecry(rsaEncStr,kp.getPrivate(),EncryptAlgorithm.RSAWithPadding); System.out.println("RSA解密之后:"+desDecStr); } catch (Exception e) { e.printStackTrace(); } } public static String testSymmEncry(String plainText,byte[] key,EncryptAlgorithm alg) throws Exception{ /*测试对称加密方法的应用场景类*/ byte[] encResult = encryt(EncryptStringUtils.getEncByteFromStr(plainText),key,alg); String encStr = EncryptStringUtils.byte2hex(encResult); return encStr; } public static String testAsymmEncry(String plainText,Key key,EncryptAlgorithm alg) throws Exception{ /*测试非对称加密方法的应用场景类*/ // byte[] encResult = encryt(EncryptStringUtils.getEncByteFromStr(plainText),key,alg); byte[] encResult = encryt(plainText.getBytes(),key,alg); String encStr = EncryptStringUtils.byte2hex(encResult); return encStr; } public static String testSymmDecry(String ciperText, byte[] key,EncryptAlgorithm alg) throws Exception{ /*测试解密方法的应用场景类*/ byte[] decResult = decryt(EncryptStringUtils.getDecByteFromStr(ciperText),key,alg); String decStr = new String(decResult); return decStr; } public static String testAsymmDecry(String ciperText, Key key,EncryptAlgorithm alg) throws Exception{ /*测试非对称解密方法的应用场景类*/ byte[] decResult = decryt(EncryptStringUtils.getDecByteFromStr(ciperText),key,alg); String decStr = new String(decResult); return decStr; } /** * 对称加密方法 * @param plainText 明文的16进制字节数组 * @param encrytKey 16进制的密钥数组 * @param alg 加密算法的枚举 * @return 加密结果,返回加密后的字节数组 * @throws Exception * */ public static byte[] encryt(byte[] plainText, byte[] encrytKey,EncryptAlgorithm alg) throws Exception{ Key k = toKey(encrytKey,alg); return encryt(plainText,k,alg); } /** * 非对称加密方法 * @param plainText 明文的16进制字节数组 * @param key 通过KeyPair获得的公钥 * @param alg 加密算法的枚举 * @return 加密结果,返回加密后的字节数组 * @throws Exception * */ public static byte[] encryt(byte[] plainText, Key key,EncryptAlgorithm alg) throws Exception{ Cipher cipher = Cipher.getInstance(alg.getAlgorithm()); cipher.init(Cipher.ENCRYPT_MODE, key); return cipher.doFinal(plainText); } /** * 对称加密解密方法 * @param ciperText 密文的16进制字节数组 * @param decrytKey 16进制的密钥数组 * @param alg 加密算法的枚举 * @return 解密结果,返回解密后的字节数组 * @throws Exception * */ public static byte[] decryt(byte[] ciperText, byte[] decrytKey,EncryptAlgorithm alg) throws Exception{ Key k = toKey(decrytKey,alg); return decryt(ciperText,k,alg); } /** * 非对称加密解密方法 * @param ciperText 密文的16进制字节数组 * @param key 通过keypair得到的非对称加密私钥 * @param alg 加密算法的枚举 * @return 解密结果,返回解密后的字节数组 * @throws Exception * */ public static byte[] decryt(byte[] ciperText, Key key,EncryptAlgorithm alg) throws Exception{ Cipher cipher = Cipher.getInstance(alg.getAlgorithm()); cipher.init(Cipher.DECRYPT_MODE, key); return cipher.doFinal(ciperText); } /** * 获取对称加密算法算法的密钥 * @param alg 加密算法枚举 * @return 16进制的密钥数组 * @throws * */ public static byte[] getDefaultKey(EncryptAlgorithm alg) throws Exception{ KeyGenerator keygen = KeyGenerator.getInstance(alg.getAlgorithm()); SecretKey deskey = keygen.generateKey(); return deskey.getEncoded(); } /** * 获取非对称加密算法的密钥 * @param alg 加密算法枚举 * @return 16进制的密钥数组 * @throws * */ public static KeyPair getDefaultKeyPair(EncryptAlgorithm alg) throws Exception{ KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance(alg.getAlgorithm()); //密钥位数 keyPairGen.initialize(1024); //密钥对 KeyPair keyPair = keyPairGen.generateKeyPair(); return keyPair; } /** * 通过key的字节数组和特定的算法得到用于加解密的密钥对象 * @param key 密钥数组 * @param alg 加解密算法的枚举 * @return KEY * @throws Exception */ private static Key toKey(byte[] key, EncryptAlgorithm alg) throws Exception { SecretKeySpec spec = new SecretKeySpec(key,alg.getAlgorithm()); if(alg.getAlgorithm().indexOf("DES") > -1 ){ KeySpec desKey = null; SecretKeyFactory keyFactory = null; if("DES".equals(alg.getAlgorithm())){ desKey = new DESKeySpec(key); keyFactory = SecretKeyFactory.getInstance(alg.getAlgorithm()); } else{ desKey = new DESedeKeySpec(key); keyFactory = SecretKeyFactory.getInstance(EncryptAlgorithm.ThreeDES.getAlgorithm()); }// 将DESKeySpec对象转换成SecretKey对象 SecretKey securekey = keyFactory.generateSecret(desKey); return securekey; } return spec; } }