1. 程式人生 > 其它 >Java實現AES加密

Java實現AES加密

生成祕鑰簡單粗暴

這邊AES祕鑰預設為128位,獲得無政策許可權後可為192或256,因此對應字元為16位,直接生成16位的祕鑰

import java.io.UnsupportedEncodingException;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.security.interfaces.RSAPrivateKey;
import java.security.interfaces.RSAPublicKey; import java.util.Base64; import java.util.HashMap; import java.util.Map; import java.util.Random; /** * @ClassName: SecretKeyUtils * 各祕鑰生成 * @author zhupig3028 * @date 2022年5月10日 */ public class SecretKeyUtils { /** AES祕鑰 */ private static
final String AES_ALGORITHM = "AES"; /** 3DES祕鑰 */ private static final String DES_ALGORITHM = "DESede"; /** 祕鑰生成來源 */ public static final String ALLCHAR = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; /** * 生成AES金鑰物件 * @throws NoSuchAlgorithmException
*/ public static String generateAESKey() throws NoSuchAlgorithmException, UnsupportedEncodingException { StringBuffer sb = new StringBuffer(); Random random = new Random(); for (int i = 0; i < 16; i++) { sb.append(ALLCHAR.charAt(random.nextInt(ALLCHAR.length()))); } return sb.toString(); } /** * 生成3DES金鑰物件 */ public static String generate3DESKey() { StringBuffer sb = new StringBuffer(); Random random = new Random(); for (int i = 0; i < 24; i++) { sb.append(ALLCHAR.charAt(random.nextInt(ALLCHAR.length()))); } return sb.toString(); } /** * 隨機生成RSA祕鑰 * @throws NoSuchAlgorithmException */ public static Map<String,String > genKeyPair() throws NoSuchAlgorithmException { HashMap<String, String> stringStringHashMap = new HashMap<>(); // KeyPairGenerator類用於生成公鑰和私鑰對,基於RSA演算法生成物件 KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("RSA"); // 初始化金鑰對生成器,金鑰大小為96-1024位 keyPairGen.initialize(1024,new SecureRandom()); // 生成一個金鑰對,儲存在keyPair中 KeyPair keyPair = keyPairGen.generateKeyPair(); // 得到私鑰 RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate(); // 得到公鑰 RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic(); String publicKeyString = new String(Base64.getEncoder().encodeToString(publicKey.getEncoded())); // 得到私鑰字串 String privateKeyString = new String(Base64.getEncoder().encodeToString((privateKey.getEncoded()))); // 將公鑰和私鑰儲存到Map //0表示公鑰 stringStringHashMap.put("0",publicKeyString); //1表示私鑰 stringStringHashMap.put("1",privateKeyString); return stringStringHashMap; } }

Java實現AES加解密

import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;

import java.util.Base64;
/**

* @ClassName: AESUtils  

* @Description: AES 對稱演算法加密/解密工具類

* @author zhupig3028

* @date 2022年5月10日  
  

*/
public class AESUtils {


    /**
     * 加解密統一編碼方式
     */
    private final static String ENCODING = "utf-8";

    /**
     * 加解密方式
     */
    private final static String ALGORITHM  = "AES";

    /**
     *加密模式及填充方式
     */
    private final static String PATTERN = "AES/ECB/pkcs5padding";

    /**
     * AES加密
     * @param plainText
     * @param key
     * @return
     * @throws Exception
     */
    public static String encrypt(String plainText, String key) throws Exception {
        if (key == null) {
            System.out.print("Key為空null");
            return null;
        }
        // 判斷Key是否為16位
        if (key.length() != 16) {
            System.out.print("Key長度不是16位");
            return null;
        }
        SecretKey secretKey = new SecretKeySpec(key.getBytes(ENCODING), ALGORITHM);
        // AES加密採用pkcs5padding填充
        Cipher cipher = Cipher.getInstance(PATTERN);
        //用密匙初始化Cipher物件
        cipher.init(Cipher.ENCRYPT_MODE, secretKey);
        //執行加密操作
        byte[] encryptData = cipher.doFinal(plainText.getBytes(ENCODING));
        return Base64.getEncoder().encodeToString(encryptData);
    }


    /**
     * AES解密
     * @param plainText
     * @param key
     * @return
     * @throws Exception
     */
    public static String decrypt(String plainText, String key) throws Exception {
        SecretKey secretKey = new SecretKeySpec(key.getBytes(ENCODING), ALGORITHM);
        // 獲取 AES 密碼器
        Cipher cipher = Cipher.getInstance(PATTERN);
        // 初始化密碼器(解密模型)
        cipher.init(Cipher.DECRYPT_MODE, secretKey);
        // 解密資料, 返回明文
        byte[] encryptData = cipher.doFinal(Base64.getDecoder().decode(plainText));
        return new String(encryptData,ENCODING);
    }


}