/** * Alipay.com Inc. * Copyright (c) 2004-2020 All Rights Reserved. */ package com.alipay.easysdk.kernel.util; import com.alipay.easysdk.kernel.AlipayConstants; import org.bouncycastle.util.encoders.Base64; import javax.crypto.Cipher; import javax.crypto.spec.IvParameterSpec; import javax.crypto.spec.SecretKeySpec; /** * 加密工具 */ public class AES { private static final String AES_ALG = "AES"; private static final String AES_CBC_PCK_ALG = "AES/CBC/PKCS5Padding"; private static final byte[] AES_IV = initIV(); /** * AES加密 * * @param plainText 明文 * @param key 对称密钥 * @return 密文 */ public static String encrypt(String plainText, String key) { try { Cipher cipher = Cipher.getInstance(AES_CBC_PCK_ALG); IvParameterSpec iv = new IvParameterSpec(AES_IV); cipher.init(Cipher.ENCRYPT_MODE, new SecretKeySpec(Base64.decode(key.getBytes()), AES_ALG), iv); byte[] encryptBytes = cipher.doFinal(plainText.getBytes(AlipayConstants.DEFAULT_CHARSET)); return new String(Base64.encode(encryptBytes)); } catch (Exception e) { throw new RuntimeException("AES加密失败,plainText=" + plainText + ",keySize=" + key.length() + "。" + e.getMessage(), e); } } /** * 密文 * * @param cipherText 密文 * @param key 对称密钥 * @return 明文 */ public static String decrypt(String cipherText, String key) { try { Cipher cipher = Cipher.getInstance(AES_CBC_PCK_ALG); IvParameterSpec iv = new IvParameterSpec(AES_IV); cipher.init(Cipher.DECRYPT_MODE, new SecretKeySpec(Base64.decode(key.getBytes()), AES_ALG), iv); byte[] cleanBytes = cipher.doFinal(Base64.decode(cipherText.getBytes())); return new String(cleanBytes, AlipayConstants.DEFAULT_CHARSET); } catch (Exception e) { throw new RuntimeException("AES解密失败,cipherText=" + cipherText + ",keySize=" + key.length() + "。" + e.getMessage(), e); } } /** * 初始向量的方法,全部为0 * 这里的写法适合于其它算法,AES算法IV值一定是128位的(16字节) */ private static byte[] initIV() { try { Cipher cipher = Cipher.getInstance(AES_CBC_PCK_ALG); int blockSize = cipher.getBlockSize(); byte[] iv = new byte[blockSize]; for (int i = 0; i < blockSize; ++i) { iv[i] = 0; } return iv; } catch (Exception e) { int blockSize = 16; byte[] iv = new byte[blockSize]; for (int i = 0; i < blockSize; ++i) { iv[i] = 0; } return iv; } } }