Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 269|回复: 0

[默认分类] JAVA 实现AES加密的两种方法

[复制链接]
  • TA的每日心情
    开心
    2021-12-13 21:45
  • 签到天数: 15 天

    [LV.4]偶尔看看III

    发表于 2018-7-6 11:35:58 | 显示全部楼层 |阅读模式

      写在前面的话:

        1.建议加密后将密文转为16进制的字符串(便于观看)。


         2.以下的两种加密的方法密钥不限定长度。

    1. /**
    2. *AES加密解密工具类
    3. *@author M-Y
    4. */
    5. public class AESUtil {
    6.       private static final Logger logger = Logger.getLogger(AESUtil.class);
    7.       private static final String defaultCharset = "UTF-8";
    8.       private static final String KEY_AES = "AES";
    9.       private static final String KEY = "123456";
    10.     /**
    11.      * 加密
    12.      *
    13.      * @param data 需要加密的内容
    14.      * @param key 加密密码
    15.      * @return
    16.      */
    17.     public static String encrypt(String data, String key) {
    18.         return doAES(data, key, Cipher.ENCRYPT_MODE);
    19.     }
    20.     /**
    21.      * 解密
    22.      *
    23.      * @param data 待解密内容
    24.      * @param key 解密密钥
    25.      * @return
    26.      */
    27.     public static String decrypt(String data, String key) {
    28.         return doAES(data, key, Cipher.DECRYPT_MODE);
    29.     }
    30.     /**
    31.      * 加解密
    32.      *
    33.      * @param data 待处理数据
    34.      * @param password  密钥
    35.      * @param mode 加解密mode
    36.      * @return
    37.      */
    38.     private static String doAES(String data, String key, int mode) {
    39.         try {
    40.             if (StringUtils.isBlank(data) || StringUtils.isBlank(key)) {
    41.                 return null;
    42.             }
    43.             //判断是加密还是解密
    44.             boolean encrypt = mode == Cipher.ENCRYPT_MODE;
    45.             byte[] content;
    46.             //true 加密内容 false 解密内容
    47.             if (encrypt) {
    48.                 content = data.getBytes(defaultCharset);
    49.             } else {
    50.                 content = parseHexStr2Byte(data);
    51.             }
    52.             //1.构造密钥生成器,指定为AES算法,不区分大小写
    53.             KeyGenerator kgen = KeyGenerator.getInstance(KEY_AES);
    54.             //2.根据ecnodeRules规则初始化密钥生成器
    55.             //生成一个128位的随机源,根据传入的字节数组
    56.             kgen.init(128, new SecureRandom(key.getBytes()));
    57.             //3.产生原始对称密钥
    58.             SecretKey secretKey = kgen.generateKey();
    59.             //4.获得原始对称密钥的字节数组
    60.             byte[] enCodeFormat = secretKey.getEncoded();
    61.             //5.根据字节数组生成AES密钥
    62.             SecretKeySpec keySpec = new SecretKeySpec(enCodeFormat, KEY_AES);
    63.             //6.根据指定算法AES自成密码器
    64.             Cipher cipher = Cipher.getInstance(KEY_AES);// 创建密码器
    65.             //7.初始化密码器,第一个参数为加密(Encrypt_mode)或者解密解密(Decrypt_mode)操作,第二个参数为使用的KEY
    66.             cipher.init(mode, keySpec);// 初始化
    67.             byte[] result = cipher.doFinal(content);
    68.             if (encrypt) {
    69.                 //将二进制转换成16进制
    70.                 return parseByte2HexStr(result);
    71.             } else {
    72.                 return new String(result, defaultCharset);
    73.             }
    74.         } catch (Exception e) {
    75.             logger.error("AES 密文处理异常", e);
    76.         }
    77.         return null;
    78.     }
    79.     /**
    80.      * 将二进制转换成16进制
    81.      *
    82.      * @param buf
    83.      * @return
    84.      */
    85.     public static String parseByte2HexStr(byte buf[]) {
    86.         StringBuilder sb = new StringBuilder();
    87.         for (int i = 0; i < buf.length; i++) {
    88.             String hex = Integer.toHexString(buf[i] & 0xFF);
    89.             if (hex.length() == 1) {
    90.                 hex = "0" + hex;
    91.             }
    92.             sb.append(hex.toUpperCase());
    93.         }
    94.         return sb.toString();
    95.     }
    96.     /**
    97.      * 将16进制转换为二进制
    98.      *
    99.      * @param hexStr
    100.      * @return
    101.      */
    102.     public static byte[] parseHexStr2Byte(String hexStr) {
    103.         if (hexStr.length() < 1) {
    104.             return null;
    105.         }
    106.         byte[] result = new byte[hexStr.length() / 2];
    107.         for (int i = 0; i < hexStr.length() / 2; i++) {
    108.             int high = Integer.parseInt(hexStr.substring(i * 2, i * 2 + 1), 16);
    109.             int low = Integer.parseInt(hexStr.substring(i * 2 + 1, i * 2 + 2), 16);
    110.             result[i] = (byte) (high * 16 + low);
    111.         }
    112.         return result;
    113.     }
    114.     public static void main(String[] args) throws Exception {  
    115.         String content = "{"repairPhone":"18547854787","customPhone":"12365478965","captchav":"58m7"}";  
    116.         System.out.println("加密前:" + content);  
    117.         System.out.println("加密密钥和解密密钥:" + KEY);  
    118.         String encrypt = encrypt(content, KEY);  
    119.         System.out.println("加密后:" + encrypt);  
    120.         String decrypt = decrypt(encrypt, KEY);  
    121.         System.out.println("解密后:" + decrypt);  
    122.     }  
    123. }
    复制代码
    输出结果:
    1. 加密前:{"repairPhone":"18547854787","customPhone":"12365478965","captchav":"58m7"}加密密钥和解密密钥:123456加密后:2A3D75862E69BF61DFAD94017E930227A715C8E533AA1A12361D6BE6E190EC5EE77AA66CAC8005A643BFB26134EE60398C30104B1F7FB3CC6B78795368A86D8215B88A5C80D9C2E4936EEEB0DECA7A88解密后:{"repairPhone":"18547854787","customPhone":"12365478965","captchav":"58m7"}
    复制代码
    方法二:替换AESUtil 类中的doAES方法并加上以下成员



    1.     private static final String KEY_MD5 = "MD5";
    2.     private static MessageDigest md5Digest;
    3.     static {
    4.         try {
    5.             md5Digest = MessageDigest.getInstance(KEY_MD5);
    6.         } catch (NoSuchAlgorithmException e) {
    7.             //
    8.         }
    9.     }
    复制代码
    doAES方法:


    1. /**
    2.      * 加解密
    3.      *
    4.      * @param data
    5.      * @param key
    6.      * @param mode
    7.      * @return
    8.      */
    9.     private static String doAES(String data, String key, int mode) {
    10.         try {
    11.             if (StringUtils.isBlank(data) || StringUtils.isBlank(key)) {
    12.                 return null;
    13.             }
    14.             boolean encrypt = mode == Cipher.ENCRYPT_MODE;
    15.             byte[] content;
    16.             //true 加密内容 false 解密内容
    17.             if (encrypt) {
    18.                 content = data.getBytes(defaultCharset);
    19.             } else {
    20.                  content = parseHexStr2Byte(data);
    21.             }
    22.             SecretKeySpec keySpec = new SecretKeySpec(md5Digest.digest(key.getBytes(defaultCharset)), KEY_AES);//构造一个密钥
    23.             Cipher cipher = Cipher.getInstance(KEY_AES);// 创建密码器
    24.             cipher.init(mode, keySpec);// 初始化
    25.             byte[] result = cipher.doFinal(content);//加密或解密
    26.             if (encrypt) {
    27.                 return parseByte2HexStr(result);
    28.             } else {
    29.                 return new String(result, defaultCharset);
    30.             }
    31.         } catch (Exception e) {
    32.             logger.error("AES 密文处理异常", e);
    33.         }
    34.         return null;
    35.     }
    复制代码

    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2025-2-24 05:24 , Processed in 0.357793 second(s), 37 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc.

    快速回复 返回顶部 返回列表