• AES对称加密算法


    AES对称加密算法

    import org.apache.tomcat.util.codec.binary.Base64;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.util.StringUtils;
    
    import javax.crypto.Cipher;
    import javax.crypto.spec.SecretKeySpec;
    
    public class AesUtils {
    
        private static Logger logger = LoggerFactory.getLogger(AesUtils.class);
        private static final String AES_ALG = "AES";
        /**
         * AES算法
         */
        private static final String AES_CBC_PCK_ALG = "AES/ECB/PKCS5Padding";
        
        public static final String CHARSET_UTF8 = "UTF-8";
    
        /**
         * AES加密
         *
         * @param srcContent
         * @return
         * @throws Exception
         */
        public static String aesEncryptContent(String srcContent,String AES_KEY) {
            try{
                //如果为空不加密
                if(StringUtils.isEmpty(srcContent)){
                    return srcContent;
                }
                String aesStr =  aesEncrypt(srcContent,AES_KEY,CHARSET_UTF8);
                return aesStr;
            }catch (Exception e){
                e.printStackTrace();
                logger.error("AES加密失败,srcContent为{}",srcContent);
                throw new RuntimeException("AES加密失败");
            }
        }
    
        /**
         * AES解密
         *
         * @param aesContent
         * @return
         * @throws Exception
         */
        public static String aesDecryptContent(String aesContent,String AES_KEY){
            try{
                //如果为空不加密
                if(StringUtils.isEmpty(aesContent)){
                    return aesContent;
                }
                String srcStr = aesDecrypt(aesContent,AES_KEY,CHARSET_UTF8);
                return srcStr;
            }catch (Exception e){
                e.printStackTrace();
                logger.error("AES解密失败,aesContent为{}",aesContent);
                throw new RuntimeException("AES解密失败");
            }
    
        }
    
        /**
         * AES加密
         *
         * @param content
         * @param aesKey
         * @param charset
         * @return
         */
        private static String aesEncrypt(String content, String aesKey, String charset)
                throws Exception {
                Cipher cipher = Cipher.getInstance(AES_CBC_PCK_ALG);
                cipher.init(Cipher.ENCRYPT_MODE,
                        new SecretKeySpec(aesKey.getBytes(), AES_ALG));
    
                byte[] encryptBytes = cipher.doFinal(content.getBytes(charset));
                return new String(Base64.encodeBase64(encryptBytes));
        }
    
        /**
         * AES解密
         *
         * @param content
         * @param key
         * @param charset
         * @return
         */
        private static String aesDecrypt(String content, String key, String charset)
                throws Exception {
            Cipher cipher = Cipher.getInstance(AES_CBC_PCK_ALG);
            cipher.init(Cipher.DECRYPT_MODE, new SecretKeySpec(key.getBytes(),
                    AES_ALG));
    
            byte[] cleanBytes = cipher.doFinal(Base64.decodeBase64(content.getBytes()));
            return new String(cleanBytes, charset);
        }
    
        /**
         * 输出:
         * 加密后字符串为:6Lmstq5QDY7n06cU/ygZYg==
         * 解密后字符串为:测试123
         *
         * @param args
         * @throws Exception
         */
        public static void main(String[] args) throws Exception{
            try {
                //32位,否则报错:java.security.InvalidKeyException: Invalid AES key length: 27 bytes
                String myAESKey = "testkey123testkey123testkey12345";
                String srcstr = "测试123";
                String enc = aesEncryptContent(srcstr,myAESKey);
                System.out.println("加密后字符串为:"+enc);
                String src = aesDecryptContent(enc,myAESKey);
                System.out.println("解密后字符串为:"+src);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    
    }
  • 相关阅读:
    java内存溢出
    jstack命令使用
    JVM问题排查步骤
    c++指针常量和常量指针
    c++ 通讯录
    冒泡排序
    翻转数组
    敲桌子
    求一个100-999之间的水仙花数
    elasticsearch 模板的使用
  • 原文地址:https://www.cnblogs.com/oktokeep/p/16769552.html
Copyright © 2020-2023  润新知