JAVA_AES_的加解密
AES实对称加密算法,只要一个秘钥secretKey
AES在CBC模式下需要秘钥secretKey和初始向量iv两个参数才能加解密
iv有16个byte,secretKey有128bit、192bit、256bit三种
import java.security.SecureRandom; import java.util.Arrays; import java.util.Base64; import java.util.UUID; import javax.crypto.Cipher; import javax.crypto.KeyGenerator; import javax.crypto.SecretKey; import javax.crypto.spec.IvParameterSpec; import javax.crypto.spec.SecretKeySpec; public class AesMian { public static void main(String[] args) throws Exception{ // TODO Auto-generated method stub //AES加密是需要把secretKey和iv都保存好,当然这只是在CBC模式下面 String secretKey = "kuFPnF7Jm7T/X/x8pi0mzg=="; String uuid = UUID.randomUUID().toString(); byte[] iv = Arrays.copyOf(uuid.getBytes(), 16); String data = "aabbccddeeffgg"; byte[] miwen = aesEncrypt(data.getBytes(), secretKey, iv); System.out.println(encryptBASE64(miwen)); byte[] mingwen = aesDecrypt(miwen, secretKey, iv); System.out.println(new String(mingwen)); } //AES加密 private static byte[] aesEncrypt(byte[] data, String secretKey, byte[] iv) throws Exception { Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); cipher.init(Cipher.ENCRYPT_MODE, strToSecretKey(secretKey), new IvParameterSpec(iv)); return cipher.doFinal(data); } //AES解密 private static byte[] aesDecrypt(byte[] data, String secretKey, byte[] iv) throws Exception { Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); cipher.init(Cipher.DECRYPT_MODE, strToSecretKey(secretKey), new IvParameterSpec(iv)); return cipher.doFinal(data); } //从秘钥字符串转换到secretKey private static SecretKey strToSecretKey(String str) { SecretKey secretKey = new SecretKeySpec(decryptBASE64(str),"AES"); return secretKey; } //字节数组到文件字符串 public static String encryptBASE64(byte[] bytes) { return Base64.getEncoder().encodeToString(bytes); } //文件字符串到字节数组 public static byte[] decryptBASE64(String str) { return Base64.getDecoder().decode(str); } /*下面生成密钥的过程中指定了固定的种子,每次生成出来的密钥都是一样的。 还有一种形式,我们可以通过不指定SecureRandom对象的种子, 即不调用其setSeed方法,这样每次生成出来的密钥都可能是不一样的。*/ public static SecretKey geneKey() throws Exception { //获取一个密钥生成器实例 KeyGenerator keyGenerator = KeyGenerator.getInstance("AES"); SecureRandom random = new SecureRandom(); random.setSeed("123456".getBytes());//设置加密用的种子,密钥 keyGenerator.init(random); SecretKey secretKey = keyGenerator.generateKey(); return secretKey; } //生成秘钥方法2 private SecretKey geneKey2() throws Exception { //获取一个密钥生成器实例 KeyGenerator keyGenerator = KeyGenerator.getInstance("AES"); SecureRandom random = new SecureRandom(); keyGenerator.init(random); SecretKey secretKey = keyGenerator.generateKey(); return secretKey; } //生成秘钥方法3 private SecretKey geneKey3() throws Exception { //获取一个密钥生成器实例 KeyGenerator keyGenerator = KeyGenerator.getInstance("AES"); keyGenerator.init(128); SecretKey secretKey = keyGenerator.generateKey(); return secretKey; } }