zoukankan      html  css  js  c++  java
  • 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;  
          }  
    }
  • 相关阅读:
    RMI几种公布和引用服务的方式
    mysql 多日志表结果集合拼接存储过程
    USRP通信的结构体和常量(上位机、下位机共用)
    Flash Builder4破解步骤
    leetcode 217 Contains Duplicate 数组中是否有反复的数字
    关于权限表的基本设计
    Objective-C之成魔之路【7-类、对象和方法】
    vs2008C1902程序数据库管理不匹配
    配置hadoop集群一
    BZOJ 2338 HNOI2011 数矩形 计算几何
  • 原文地址:https://www.cnblogs.com/erdanyang/p/10780331.html
Copyright © 2011-2022 走看看