• AES加密与解密(秘钥)


    转载地址:https://blog.csdn.net/lichuangcsdn/article/details/80842338

      1 package com.snsoft.modules.biz.test;
      2 
      3 import org.slf4j.Logger;
      4 import org.slf4j.LoggerFactory;
      5 import sun.misc.BASE64Decoder;
      6 import sun.misc.BASE64Encoder;
      7 import tk.mybatis.mapper.util.StringUtil;
      8 
      9 import javax.crypto.Cipher;
     10 import javax.crypto.KeyGenerator;
     11 import javax.crypto.SecretKey;
     12 import javax.crypto.spec.SecretKeySpec;
     13 import java.io.IOException;
     14 import java.security.SecureRandom;
     15 
     16 /**
     17  * AES加密解密
     18  *
     19  * @author lichuang
     20  * @since 2018-03-23
     21  */
     22 public class SecurityUtil {
     23 
     24     private static final Logger logger = LoggerFactory.getLogger(SecurityUtil.class);
     25 
     26     private static final String ENCODING = "UTF-8";
     27 
     28     private static final String PASSWORD = "46EBA22EF5204DD5B110A1F730513965"; // 加密秘钥
     29 
     30     /**
     31      * AES加密
     32      *
     33      * @param content
     34      *            明文
     35      * @return 密文
     36      */
     37     public static String encryptAES(String content) {
     38         if (StringUtil.isEmpty(content)) {
     39             throw new RuntimeException("明文不能为空!");
     40         }
     41         byte[] encryptResult = encrypt(content, PASSWORD);
     42         String encryptResultStr = parseByte2HexStr(encryptResult);
     43         // BASE64位加密
     44         encryptResultStr = ebotongEncrypto(encryptResultStr);
     45         return encryptResultStr;
     46     }
     47 
     48     /**
     49      * AES解密
     50      *
     51      * @param encryptResultStr
     52      *            密文
     53      * @return 明文
     54      */
     55     public static String decryptAES(String encryptResultStr) {
     56         if (StringUtil.isEmpty(encryptResultStr)) {
     57             throw new RuntimeException("密文不能为空");
     58         }
     59         // BASE64位解密
     60         try {
     61             String decrpt = ebotongDecrypto(encryptResultStr);
     62             byte[] decryptFrom = parseHexStr2Byte(decrpt);
     63             byte[] decryptResult = decrypt(decryptFrom, PASSWORD);
     64             return new String(decryptResult);
     65         } catch (Exception e) { // 当密文不规范时会报错,可忽略,但调用的地方需要考虑
     66             return null;
     67         }
     68     }
     69 
     70     /**
     71      * 加密字符串
     72      */
     73     private static String ebotongEncrypto(String str) {
     74         BASE64Encoder base64encoder = new BASE64Encoder();
     75         String result = str;
     76         if (str != null && str.length() > 0) {
     77             try {
     78                 byte[] encodeByte = str.getBytes(ENCODING);
     79                 result = base64encoder.encode(encodeByte);
     80             } catch (Exception e) {
     81                 e.printStackTrace();
     82             }
     83         }
     84         // base64加密超过一定长度会自动换行 需要去除换行符
     85         return result.replaceAll("
    ", "").replaceAll("
    ", "").replaceAll("
    ", "");
     86     }
     87 
     88     /**
     89      * 解密字符串
     90      */
     91     private static String ebotongDecrypto(String str) {
     92         BASE64Decoder base64decoder = new BASE64Decoder();
     93         try {
     94             byte[] encodeByte = base64decoder.decodeBuffer(str);
     95             return new String(encodeByte);
     96         } catch (IOException e) {
     97             logger.error("IO 异常",e);
     98             return str;
     99         }
    100     }
    101 
    102     /**
    103      * 加密
    104      *
    105      * @param content
    106      *            需要加密的内容
    107      * @param password
    108      *            加密密码
    109      * @return
    110      */
    111     private static byte[] encrypt(String content, String password) {
    112         try {
    113             KeyGenerator kgen = KeyGenerator.getInstance("AES");
    114             // 注意这句是关键,防止linux下 随机生成key。用其他方式在Windows上正常,但Linux上会有问题
    115             SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG");
    116             secureRandom.setSeed(password.getBytes());
    117             kgen.init(128, secureRandom);
    118             // kgen.init(128, new SecureRandom(password.getBytes()));
    119             SecretKey secretKey = kgen.generateKey();
    120             byte[] enCodeFormat = secretKey.getEncoded();
    121             SecretKeySpec key = new SecretKeySpec(enCodeFormat, "AES");
    122             Cipher cipher = Cipher.getInstance("AES");// 创建密码器
    123             byte[] byteContent = content.getBytes("utf-8");
    124             cipher.init(Cipher.ENCRYPT_MODE, key);// 初始化
    125             byte[] result = cipher.doFinal(byteContent);
    126             return result; // 加密
    127         } catch (Exception e) {
    128             logger.error("加密异常", e);
    129         }
    130         return null;
    131     }
    132 
    133     /**
    134      * 解密
    135      *
    136      * @param content
    137      *            待解密内容
    138      * @param password
    139      *            解密密钥
    140      * @return
    141      */
    142     private static byte[] decrypt(byte[] content, String password) {
    143         try {
    144             KeyGenerator kgen = KeyGenerator.getInstance("AES");
    145             // 防止linux下 随机生成key
    146             SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG");
    147             secureRandom.setSeed(password.getBytes());
    148             kgen.init(128, secureRandom);
    149             // kgen.init(128, new SecureRandom(password.getBytes()));
    150             SecretKey secretKey = kgen.generateKey();
    151             byte[] enCodeFormat = secretKey.getEncoded();
    152             SecretKeySpec key = new SecretKeySpec(enCodeFormat, "AES");
    153             Cipher cipher = Cipher.getInstance("AES");// 创建密码器
    154             cipher.init(Cipher.DECRYPT_MODE, key);// 初始化
    155             byte[] result = cipher.doFinal(content);
    156             return result; // 加密
    157         } catch (Exception e) {
    158             logger.error("解密异常", e);
    159         }
    160         return null;
    161     }
    162 
    163     /**
    164      * 将二进制转换成16进制
    165      *
    166      * @param buf
    167      * @return
    168      */
    169     private static String parseByte2HexStr(byte buf[]) {
    170         StringBuffer sb = new StringBuffer();
    171         for (int i = 0; i < buf.length; i++) {
    172             String hex = Integer.toHexString(buf[i] & 0xFF);
    173             if (hex.length() == 1) {
    174                 hex = '0' + hex;
    175             }
    176             sb.append(hex.toUpperCase());
    177         }
    178         return sb.toString();
    179     }
    180 
    181     /**
    182      * 将16进制转换为二进制
    183      *
    184      * @param hexStr
    185      * @return
    186      */
    187     private static byte[] parseHexStr2Byte(String hexStr) {
    188         if (hexStr.length() < 1)
    189             return null;
    190         byte[] result = new byte[hexStr.length() / 2];
    191         for (int i = 0; i < hexStr.length() / 2; i++) {
    192             int high = Integer.parseInt(hexStr.substring(i * 2, i * 2 + 1), 16);
    193             int low = Integer.parseInt(hexStr.substring(i * 2 + 1, i * 2 + 2), 16);
    194             result[i] = (byte) (high * 16 + low);
    195         }
    196         return result;
    197     }
    198 
    199     public static void main(String[] args) {
    200         express();
    201     }
    202 
    203     /**
    204      * 测试
    205      */
    206     private static void express() {
    207         System.out.println("加密解密试试:");
    208         String content = "你好北京";
    209         System.out.println("原内容为:" + content);
    210         String encryContent = encryptAES(content);
    211         System.out.println("加密后的内容为:" + encryContent);
    212         String decryContent = decryptAES(encryContent);
    213         System.out.println("解密后的内容为:" + decryContent);
    214     }
    215 
    216 }
  • 相关阅读:
    CentOS 基本设置
    CentOS 7 编译安装 Code::Blocks
    Java和C/C++进行DES/AES密文传输(借鉴)
    VS 2010 编译 Openssl
    Crypto++ 动态链接编译与实例测试
    c++11-bind的用法
    模板编程-迭代器
    LeetCode-Swap Nodes in Pairs
    LeetCode-Generate Parentheses
    Leetcode-Letter Combinations of a Phone Number
  • 原文地址:https://www.cnblogs.com/lidar/p/11558450.html
Copyright © 2020-2023  润新知