java加解密工具类,支持RSA,AES详解编程语言

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; 
    } 
      
      
}

原创文章,作者:奋斗,如若转载,请注明出处:https://blog.ytso.com/10317.html

(0)
上一篇 2021年7月19日
下一篇 2021年7月19日

相关推荐

发表回复

登录后才能评论