AES加密与解密(秘钥)
时间:2019-09-20
本文章向大家介绍AES加密与解密(秘钥),主要包括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("\r\n", "").replaceAll("\r", "").replaceAll("\n", ""); 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 }
原文地址:https://www.cnblogs.com/lidar/p/11558450.html
- Python机器学习的练习一:简单线性回归
- Dubbo源码解析 —— zookeeper连接
- 浣熊检测器实例, 如何用TensorFlow的Object Detector API来训练你的物体检测器
- 用Keras进行深度学习模式的正则化方法:Dropout
- 用深度学习硬件的闲置时间,来挖比特币
- 深度学习:如何理解tensorflow文本蕴含的原理
- 重磅!腾讯与科大讯飞技术共创,Google ProtoBuf进入TARS家族!
- 深度学习与R语言
- 在Keras中展示深度学习模式的训练历史记录
- 分析漏洞利用工具包 Archie和Astrum工具包
- 手游热更新方案xLua开源:Unity3D下Lua编程解决方案
- 如何为Keras中的深度学习模型建立Checkpoint
- Dubbo 源码解析 —— Zookeeper 创建节点
- 熔断器 Hystrix 源码解析 —— 断路器 HystrixCircuitBreaker
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- R语言中回归和分类模型选择的性能指标
- R语言 线性混合效应模型实战案例
- R语言中敏感性和特异性、召回率和精确度作为选型标准的华夫图案例
- R语言中的多类别问题的绩效衡量:F1-score 和广义AUC
- Dart语言基础Map、List、Set操作合辑
- 2.2.2 类反射场景与使用 -《SSM深入解析与项目实战》
- 每天手撕一道算法-64. 最小路径和
- Flutter 1.20 下的 Hybrid Composition 深度解析
- Flutter 1.17 对列表图片的优化解析
- SQL注入常用函数和关键字总结
- 用遗传算法求解函数
- javafx框架tornadofx实战-益智游戏-找出指定的内容1
- Qt音视频开发8-ffmpeg保存裸流
- PyTorch6:nn.Linear&常用激活函数
- Python制作图片验证码?也就三行代码罢了