JAVA_AES_的加解密

AES实对称加密算法,只要一个秘钥secretKey

AES在CBC模式下需要秘钥secretKey和初始向量iv两个参数才能加解密

iv有16个byte,secretKey有128bit、192bit、256bit三种

AES算法漫画详解

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

 

posted @ 2019-04-27 21:01  海平面下的我们  阅读(250)  评论(0编辑  收藏  举报