- 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;
- }
- }
来源: http://www.phpxs.com/code/1002814/