zoukankan      html  css  js  c++  java
  • AES加密,解决了同步问题,和随机密钥和固定密钥,多端通信加密不一致解决办法

    1、密钥随机生成。

    import java.security.InvalidAlgorithmParameterException;
    import java.security.InvalidKeyException;
    import java.security.NoSuchAlgorithmException;
    import java.security.SecureRandom;
    import java.security.spec.AlgorithmParameterSpec;
    
    import javax.crypto.BadPaddingException;
    import javax.crypto.Cipher;
    import javax.crypto.IllegalBlockSizeException;
    import javax.crypto.KeyGenerator;
    import javax.crypto.NoSuchPaddingException;
    import javax.crypto.SecretKey;
    import javax.crypto.spec.IvParameterSpec;
    
    
    /** 
    * @ClassName: AESUtil 
    * @Description: 对cookie进行加密解密
    * @author 
    * @date 2015-9-23 上午9:07:18 
    *  
    */
    public class AesUtils {
        
        public static final String logalrithm = "AES/CBC/PKCS5Padding";
        
        private static byte[] keyValue = new byte[] {        
            22,25,-35,-45,25,98,-55,-45,10,20,-45,25,
            26,-95,25,-65,-11,-99,85,45,-62,10,-0,11,
            -35,48,-98,65,-32,14,-78,25,36,-56,-45,-45,
            12,15,-35,-75,15,-14,62,-25,33,-45,55,68,-88
        };
        private static byte[] iv = new byte[] {                
            -12,35,-25,65,45,-87,95,-22,-15,45,55,-66,32,5-4,84,55
        };
        private static SecretKey key;                        
        private static AlgorithmParameterSpec paramSpec;                         
        
        static{        
            KeyGenerator kgen;
            try {
                kgen = KeyGenerator.getInstance("AES");
                kgen.init(128, new SecureRandom(keyValue));
                key = kgen.generateKey();
                paramSpec = new IvParameterSpec(iv);
            } catch (NoSuchAlgorithmException e) {
                e.printStackTrace();
            }
        }
    
        
        /** 
        * @Title: encrypt 
        * @Description: 加密,使用指定数据源生成密钥,使用用户数据作为算法参数进行AES加密
        * @return String    返回类型 
        * @param msg 加密的数据
        * @return
        * @date 2015-9-23 上午9:09:20 
        * @throws 
        */
        public static String encrypt(String msg) {
            String str = "";
            try {    
                Cipher ecipher = Cipher.getInstance(logalrithm);
                ecipher.init(Cipher.ENCRYPT_MODE, key, paramSpec);
                str = asHex(ecipher.doFinal(msg.getBytes()));
            } catch (BadPaddingException e) {
                e.printStackTrace();
            } catch (InvalidKeyException e) {
                e.printStackTrace();
            } catch (InvalidAlgorithmParameterException e) {
                e.printStackTrace();
            } catch (IllegalBlockSizeException e) {
                e.printStackTrace();
            } catch (NoSuchAlgorithmException e) {
                e.printStackTrace();
            } catch (NoSuchPaddingException e) {
                e.printStackTrace();
            }
            return str;
        }
        
        
        /** 
        * @Title: decrypt 
        * @Description: 解密,对生成的16进制的字符串进行解密
        * @return String    返回类型 
        * @author WUWeidong   
        * @param value
        * @return
        * @date 2015-9-23 上午9:10:01 
        * @throws 
        */
        public static String decrypt(String value) {
            try {
                Cipher ecipher = Cipher.getInstance(logalrithm);
                ecipher.init(Cipher.DECRYPT_MODE, key, paramSpec);
                return new String(ecipher.doFinal(asBin(value)));
            } catch (BadPaddingException e) {
                e.printStackTrace();
            } catch (InvalidKeyException e) {
                e.printStackTrace();
            } catch (InvalidAlgorithmParameterException e) {
                e.printStackTrace();
            } catch (IllegalBlockSizeException e) {
                e.printStackTrace();
            } catch (NoSuchAlgorithmException e) {
                e.printStackTrace();
            } catch (NoSuchPaddingException e) {
                e.printStackTrace();
            }
            return "";
        }
    
        
        /** 
        * @Title: asHex 
        * @Description: 将字节数组转换成16进制字符串
        * @return String    返回类型 
        * @param buf
        * @return
        * @date 2015-9-23 上午9:10:25 
        * @throws 
        */
        private static String asHex(byte[] buf) {
            StringBuffer strbuf = new StringBuffer(buf.length * 2);
            int i;
            for (i = 0; i < buf.length; i++) {
                if (((int) buf[i] & 0xff) < 0x10){
                    strbuf.append("0");
                }
                strbuf.append(Long.toString((int) buf[i] & 0xff, 16));
            }
            return strbuf.toString();
        }
    
       
        /** 
        * @Title: asBin 
        * @Description: 将16进制字符串转换成字节数组
        * @return byte[]    返回类型 
        * @author WUWeidong   
        * @param src
        * @return
        * @date 2015-9-23 上午9:10:52 
        * @throws 
        */
        private static byte[] asBin(String src) {
            if (src.length() < 1){
                return null;
            }
            byte[] encrypted = new byte[src.length() / 2];
            for (int i = 0; i < src.length() / 2; i++) {
                int high = Integer.parseInt(src.substring(i * 2, i * 2 + 1), 16);
                int low = Integer.parseInt(src.substring(i * 2 + 1, i * 2 + 2), 16);
                encrypted[i] = (byte) (high * 16 + low);
            }
            return encrypted;
        }
        
        public static void main(String[] args) {
            String msg="897807300";
            System.out.println(encrypt(msg));
            System.out.println(decrypt(encrypt(msg)));
        }
    }

    2、密钥固定,加密通信的时候可以使用

    package com.cmcc.omp.securityplatform.base;
    import java.io.UnsupportedEncodingException;
    import java.security.InvalidAlgorithmParameterException;
    import java.security.InvalidKeyException;
    import java.security.Key;
    import java.security.NoSuchAlgorithmException;
    
    import javax.crypto.BadPaddingException;
    import javax.crypto.Cipher;
    import javax.crypto.IllegalBlockSizeException;
    import javax.crypto.NoSuchPaddingException;
    import javax.crypto.spec.IvParameterSpec;
    import javax.crypto.spec.SecretKeySpec;
    
    
    /** 
    * @ClassName: AESUtil 
    * @Description: 对cookie进行加密解密
    * @date 2015-9-23 上午9:07:18 
    *  
    */
    public class AesUtils {
        
        public static final String logalrithm = "AES/CBC/PKCS5Padding";
        public static final String bm = "utf-8";  
        private static byte[] keyValue = new byte[] {        
            22,-35,-45,25,98,-55,-45,10,35,-45,25,26,-95,25,-35,48
        };
        private static byte[] iv = new byte[] {                
            -12,35,-25,65,45,-87,95,-22,-15,45,55,-66,32,5-4,84,55
        };
        
        private static Key keySpec;
        private static IvParameterSpec ivSpec;                     
    
        static{        
            keySpec = new SecretKeySpec(keyValue, "AES");
            ivSpec = new IvParameterSpec(iv);     
        }    
        
        /** 
        * @Title: encrypt 
        * @Description: 加密,使用指定数据源生成密钥,使用用户数据作为算法参数进行AES加密
        * @return String    返回类型 
        * @param msg 加密的数据
        * @return
        * @date 2015-9-23 上午9:09:20 
        * @throws 
        */
        public static String encrypt(String msg) {
            byte[] encryptedData = null;
            try {
                Cipher ecipher = Cipher.getInstance(logalrithm);
                ecipher.init(Cipher.ENCRYPT_MODE, keySpec, ivSpec);
                encryptedData = ecipher.doFinal(msg.getBytes(bm));  
            } catch (IllegalBlockSizeException | BadPaddingException e) {
                e.printStackTrace();
            } catch (NoSuchAlgorithmException e) {
                e.printStackTrace();
            } catch (NoSuchPaddingException e) {
                e.printStackTrace();
            } catch (InvalidKeyException e) {
                e.printStackTrace();
            } catch (InvalidAlgorithmParameterException e) {
                e.printStackTrace();
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            }
            return asHex(encryptedData);
        }
        
        
        /** 
        * @Title: decrypt 
        * @Description: 解密,对生成的16进制的字符串进行解密
        * @return String    返回类型    
        * @param value
        * @return
        * @date 2015-9-23 上午9:10:01 
        * @throws 
        */
        public static String decrypt(String value) {
            try {
                Cipher ecipher = Cipher.getInstance(logalrithm);
                ecipher.init(Cipher.DECRYPT_MODE, keySpec, ivSpec);
                return new String(ecipher.doFinal(asBin(value)));
            } catch (BadPaddingException e) {
                System.out.println("解密错误:"+value);
                e.printStackTrace();
            } catch (IllegalBlockSizeException e) {
                System.out.println("解密错误:"+value);
                e.printStackTrace();
            } catch (NoSuchAlgorithmException e) {
                e.printStackTrace();
            } catch (NoSuchPaddingException e) {
                e.printStackTrace();
            } catch (InvalidKeyException e) {
                e.printStackTrace();
            } catch (InvalidAlgorithmParameterException e) {
                e.printStackTrace();
            }
            return "";
        }
    
        
        /** 
        * @Title: asHex 
        * @Description: 将字节数组转换成16进制字符串
        * @return String    返回类型  
        * @param buf
        * @return
        * @date 2015-9-23 上午9:10:25 
        * @throws 
        */
        private static String asHex(byte[] buf) {
            StringBuffer strbuf = new StringBuffer(buf.length * 2);
            int i;
            for (i = 0; i < buf.length; i++) {
                if (((int) buf[i] & 0xff) < 0x10){
                    strbuf.append("0");
                }
                strbuf.append(Long.toString((int) buf[i] & 0xff, 16));
            }
            return strbuf.toString();
        }
    
       
        /** 
        * @Title: asBin 
        * @Description: 将16进制字符串转换成字节数组
        * @return byte[]    返回类型 
        * @param src
        * @return
        * @date 2015-9-23 上午9:10:52 
        * @throws 
        */
        private static byte[] asBin(String src) {
            if (src.length() < 1){
                return null;
            }
            byte[] encrypted = new byte[src.length() / 2];
            for (int i = 0; i < src.length() / 2; i++) {
                int high = Integer.parseInt(src.substring(i * 2, i * 2 + 1), 16);
                int low = Integer.parseInt(src.substring(i * 2 + 1, i * 2 + 2), 16);
                encrypted[i] = (byte) (high * 16 + low);
            }
            return encrypted;
        }
        
        public static void main(String[] args) {
            String userid = "897807300@qq.com";
            String token = "8aa8690f65f080aee595d8781e7044a7eacda7a86520786db0838136554920b6";
            System.out.println(encrypt(userid));
            System.out.println(decrypt(encrypt(userid)));
        }
        
    }
  • 相关阅读:
    搭建非域AlwaysOn win2016+SQL2016
    从0开始搭建SQL Server AlwaysOn 第四篇(配置异地机房节点)
    从0开始搭建SQL Server AlwaysOn 第二篇(配置故障转移集群)
    从0开始搭建SQL Server AlwaysOn 第三篇(配置AlwaysOn)
    从0开始搭建SQL Server AlwaysOn 第一篇(配置域控)
    四、基于Windows 2012配置SQL Server 2014 AlwaysOn
    三、安装SQLserver 2014(For AlwaysOn)
    二、 Windows 2012配置故障转移(For SQLServer 2014 AlwaysOn)
    Mybatis-SQL语句构建器类及日志
    Mybatis-JavaAPI
  • 原文地址:https://www.cnblogs.com/wuweidong/p/5952902.html
Copyright © 2011-2022 走看看