java加解密工具类,支持RSA,AES

2018-07-20    来源:open-open

容器云强势上线!快速搭建集群,上万Linux镜像随意使用
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;
    }
     
     
}

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点!
本站所提供的图片等素材,版权归原作者所有,如需使用,请与原作者联系。

上一篇:Codeigniter 中上传视频并使用 ffmpeg 转成 FLV

下一篇:PHP封装了一个DB数据库 mysql 的类