【Java工具类】(27)—AES加密工具类
Java工具类(27)—AES加密工具类
package com.awifi.cloudnative.container.common.utils;import java.io.UnsupportedEncodingException; import java.security.SecureRandom; import java.util.Random;import javax.crypto.Cipher; import javax.crypto.spec.IvParameterSpec; import javax.crypto.spec.SecretKeySpec;import com.awifi.cloudnative.container.common.content.ErrorConstants; import com.awifi.cloudnative.container.common.exception.BaseException; import org.apache.tomcat.util.codec.binary.Base64; import org.slf4j.Logger; import org.slf4j.LoggerFactory;public class AESUtil {private static final Logger LOG = LoggerFactory.getLogger(AESUtil.class);public static final String CODE_TYPE = "UTF-8";//public static final String CODE_TYPE = "gb2312";public static final String AES_TYPE = "AES/ECB/NoPadding";private static final String ENCRYPTION = "AES";private static final String IV = "0000000000000000";public static String getKey() {Random random = new SecureRandom();StringBuilder sb = new StringBuilder();for (int i = 0; i < 16; i++) {int number = random.nextInt(3);long result = 0;switch (number) {case 0:result = Math.round(new SecureRandom().nextInt(25) + 65);sb.append((char) result);break;case 1:result = Math.round(new SecureRandom().nextInt(25) + 97);sb.append(String.valueOf((char) result));break;case 2:sb.append(String.valueOf(new SecureRandom().nextInt(10)));break;}}// sb.append("123456789012345");// sb.append("\0");return sb.toString();}// public static void main(String args[]) {// //生成15位字符串 // String key = "yju5pH2e8yo6947F"; // System.out.println("aes秘钥:" + key); // String sign = "R+vmN33rjMPos3H7DnAaUxD2fkffSe6sDGOWNeBJ+lIYkC1/OpcqwcXuUNObywz/rf7lLqS5zifgXh/SG9Ej9q3QJnBJ4TdZAYeoLpffNcrncdCrVdDs3QviNfo2BJHMaD1y2uw2AfvoiK2wM0ucMThquBDw3PtlhWbRF1DM2/xmQurEhSeqNb5P9/O+BL04weXOcAD9k3EfKceohWVsdo1L4bkq6q/JtwDFJP1+hobrguqHjMwwAw+svMCC0mNeJqt/8V0R31B1iyIcMISnee6N0brqwsS5NE7UN3xnXM0ahuuOCJBfxEOUo+9Cs9Ro1hIAU2JDO5K4eXYz7RRjiwGjl4gZ32gankE+EOTL91fQm8j3mh4UB3DBZeeVFcjwCnycdtVne9t94mAjdNOWE/l1E+MwXkV77Bcs697zDXwKx9BE0rzm9C+eu3jR2V5PLhaJHNgJh5mAHurPL28FJnPqS3+xxSKhNXStZE0kC1Z4bXE+T2aI7hqdpp2DvJdPmwT1LM6/2m9yCET3ximukyiQZI0oLALf7qmprJWv6tQloG6a2JInP9+idBlyqjtQLwYgk8LhS0v6R+C4cbof5MviNjRNEbuIYksovuME2M+suHphpx4XVOKbnp0LJz8c7LR8Ds/uUC76zZ5YZGkWN2q2TQ/iAnlUw/Z9uRNtsGwuFokc2AmHmYAe6s8vbwUmJhzGvN7YeWRzycckZXRgiH7HbdoVbw9b169dg5ML84MpuAQzlcdgQH3v18kzqlPbGIm7rfNPMBou+BIteesdg7qF8aFRDQZ+y3J6/VTvMum6XuyGFmnQstcAzM2XvC6mviqQC6tmvSwSvsDVSvlj8IFuW8l8T4AWPW134POPpRm6aZVJDhpmK7LN8zs5wncHMUIcqmj9M42QHUIuBqDt3wBc7EZQLXVsexvk30eRPEl2Qc4m/YLKrC+esMrBMbvYvcdOJWryjNVN8s7w/ZfXKNXPHu9pRvNrOuh4DYPnu2b5DKFYFF/Mw8lbJ6aA2Lig2mOQiN2Kiq541ABcY4FvDmh83JvVGWCbLQtoeiChv8RE5FRgVgfnRydw4jHwXBtcy+I2NE0Ru4hiSyi+4wTYz6y4emGnHhdU4puenQsnPxzstHwOz+5QLvrNnlhkaRY3lfNtwzeoXVyhTACwWaCO5j6qYzDRM5mwOoOBJfxVliBl6Dd3wuEUyasnsDPLN3n2vd3m0EBdzADdeg60DWKeEcqtHU4zanr/94kyvS0KG96Urka8WXBw/ymcJiW782B1rdAmcEnhN1kBh6gul981ylA+F5wWtr6glfUjTHOJiBDQm8j3mh4UB3DBZeeVFcjwpfKRpQpytxKyXFEEbHj+psRI2rPhZI9zb8ma6vbGQiJJtRpmhvG3L3PPfkcxhpQFXw2ltTT/NOIr9qxMRgaDUJa0C/0venXBf5OiZZPjjpJl6Dd3wuEUyasnsDPLN3n2iA1OxR3Q3cH9CmXb/v9H/tDFPviBd1qRU6C9EK7ZT2VGJuMRk/RC7nrBmWkCTK3xGUuADYrVg9AyH1mpeMPZXYr2UNjZLFUGGb6G4DPlSx9L6uysxVWHb21wZWX0P+yfl63Vnp67GhXbqKUIKKJYVEP2tECVKPf7N2suj4uSBtn9lswgQNztj/GtylFK1Q7hW46KVdiKYheXLfu//0kasUJlWGdRrUDUeGSWpYnHnhUHFq4482yxE+WX9NKaqsspAJ834y3r4WZMw6ZkkoLy8rOPIAb2vrMw8r1YUZR4xyK6HaRPSSWLhZNmWoxm2y74NmvR1/89ppFQpUzi3OZVlf7pGpLGtFc/VrlYAxuNTuZ68SXltMX8VXqMZ/GbPDaa+exN3eDbizwptLeid52ZZIuwxOLkjmE8NbcA/rLXAVQJdSVmHnactEJf1eJnPY7jxi39hwFJsig1aCdf3Ly2dQCMYVoRtgaTn1O5VSihMHRduYHyIxTasgzNvSmSYpHSPVr6lrVfcfZzRz88n2SawQ=="; // System.out.println(decrypt(sign, key)); // String str = "{\"errorCode\":\"0\",\"errorMsg\":\"成功\"}"; // sign = encrypt(str, key); // System.out.println("加密后:" + sign); // System.out.println("解密后:" + decrypt(sign, key)); // }public AESUtil() {}/*** aes加密** @param cleartext 待加密串* @param key* @return base64后的加密串*/public static String encrypt(String cleartext, String password) {try {password = appendZero2Password(password);byte[] str = cleartext.getBytes(CODE_TYPE);str = completionCodeFor16Bytes(str);Cipher cipher = Cipher.getInstance(AES_TYPE);SecretKeySpec key = new SecretKeySpec(password.getBytes(), ENCRYPTION);// IvParameterSpec iv = new IvParameterSpec(IV.getBytes());//cipher.init(Cipher.ENCRYPT_MODE, key, vi);cipher.init(Cipher.ENCRYPT_MODE, key);byte[] encryptedData = cipher.doFinal(str);String sign = Base64.encodeBase64String(encryptedData);LOG.debug("加密后的字符串:{}", sign);return sign;} catch (Exception e) {LOG.error("AES加密失败", e);throw new BaseException(ErrorConstants.ERR_EXCEPTION_000, "AES加密失败");}// Pointer pointer = aesecb();/* byte[] dst = new byte[200];Object object = aesecb(dst);System.out.println("pointer:" + object.getClass() + "*******");return aesecb(dst) + "";return Base64.encodeBase64String(cleartext.getBytes());*/}/*** Aes解密** @param encrypted 待解密串* @param key* @return 原始数据*/public static String decrypt(String encrypted, String password) {try {password = appendZero2Password(password);byte[] byteMi = Base64.decodeBase64(encrypted);byteMi = completionCodeFor16Bytes(byteMi);SecretKeySpec key = new SecretKeySpec(password.getBytes(), ENCRYPTION);Cipher cipher = Cipher.getInstance(AES_TYPE);IvParameterSpec iv = new IvParameterSpec(IV.getBytes());// cipher.init(Cipher.DECRYPT_MODE, key, iv);cipher.init(Cipher.DECRYPT_MODE, key);byte[] decryptedData = cipher.doFinal(byteMi);return new String(decryptedData, "utf-8").trim();} catch (Exception e) {LOG.error("AES解密失败" + e.getMessage());throw new BaseException(ErrorConstants.ERR_EXCEPTION_000, "AES解密失败");}/*byte[] byteMi = Base64.decodeBase64(encrypted);byte[] dst = new byte[200];return aesecb(dst) + "";byte[] decryptedData = Base64.decodeBase64(encrypted);return new String(decryptedData).trim();*/}/*** mod16位补全** @param str 待加密串* @return 补全待加密串* @throws UnsupportedEncodingException 异常*/public static byte[] completionCodeFor16Bytes(byte[] str) throws UnsupportedEncodingException {int num = str.length;int index = 16 - num % 16;if (index == 16) {return str;}byte[] newStr = new byte[str.length + index];System.arraycopy(str, 0, newStr, 0, str.length);return newStr;}/*** mod8位补全** @param str 待加密串* @return 补全待加密串* @throws UnsupportedEncodingException 异常*/public static byte[] completionCodeFor4Bytes(byte[] str) throws UnsupportedEncodingException {int num = str.length;int index = 4 - num % 4;if (index == 4) {return str;}byte[] newStr = new byte[str.length + index];System.arraycopy(str, 0, newStr, 0, str.length);return newStr;}/*** 检验密钥并补全 \0** @return String* @throws* @author 范涌涛* @date 2020-05-12 15:22:34*/private static String appendZero2Password(String password) {if (null == password) {LOG.error("AES密钥长度错误");throw new BaseException(ErrorConstants.INNER_EXCEPTION_010, "AES密钥长度错误");}if (password.length() == 16) {return password;}StringBuilder sbBuilder = new StringBuilder(password);sbBuilder.append("\0");return sbBuilder.toString();}/** 宽带账号解密* 解密方法* @param data 要解密的数据* @param key 解密key* @param iv 解密iv* @return 解密的结果* @throws Exception*/public static String AccountdesEncrypt(String data, String key, String iv) {try {byte[] encrypted1 = new Base64().decode(data);Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding");SecretKeySpec keyspec = new SecretKeySpec(key.getBytes(), "AES");IvParameterSpec ivspec = new IvParameterSpec(iv.getBytes());cipher.init(Cipher.DECRYPT_MODE, keyspec, ivspec);byte[] original = cipher.doFinal(encrypted1);String originalString = new String(original);return originalString.trim();} catch (Exception e) {e.printStackTrace();return null;}} }
【Java工具类】(27)—AES加密工具类相关推荐
- Android加密工具类,Android AES加密工具类分享
1.AES加密工具类 java不支持PKCS7Padding,只支持PKCS5Padding.我们知道加密算法由算法+模式+填充组成,下一篇介绍iOS和Android通用的AES加密,本篇文章使用PK ...
- 带偏移量的AES加密工具
自定义的一个对称加密工具类AESUtil.java public static final String ENCRYPTION_ALGORITHM = "AES";public s ...
- java实现RSA和AES加密(一)
java实现RSA和AES加密(一) 由于公司要求接口安全升级,从自定义防篡改数据MD5加密验证,到使用RSA加密. 原始的MD5防数据篡改的方式: 将所有参数拼接起来,然后在某一字节后加入自定义的字 ...
- Java AES加密工具类
import sun.misc.BASE64Decoder; import sun.misc.BASE64Encoder; import javax.crypto.Cipher; import jav ...
- Java 开发中常用的 4 种加密方法。MD5加密工具类测试 base64加密工具类测试 SHA加密工具类测试 BCrypt加密工具类测试
一.工具类 1, md5加密工具类 2, base64加密工具类 3, Bcrypt工具类 二.加密测试 MD5加密测试 base64加密测试 SHA加密测试 BCrypt加密测试 一.工具类 1, ...
- aesmiyao php_php写的AES加密解密类分享
/** * php AES加解密类 * 如果要与java共用,则密钥长度应该为16位长度 * 因为java只支持128位加密,所以php也用128位加密,可以与java互转. * 同时AES的标准也是 ...
- Java自制简易32位加密工具
自制32位加密(java版) 闲来无事,自己制作32位建议加密工具,我把自己的思路和大家分享下: 下载加密程序链接:https://download.csdn.net/download/qickcao ...
- java实现双向RSA + AES加密
本文主要讲解在APP上如何实现双向RSA + AES加密. 先上一张主要流程图: 场景预设: 由于客户端是APP而不是网页,APP在第一次加载的时候会生成一对RSA秘钥对(我们称它为APP公钥私钥,不 ...
- Java的SHA1PRING方式AES加密对应的PHP写法
近期项目论坛,需要把网站的登陆注册用户这方面要全部走上面给的用户中心数据库的接口,接口文档中用到了AES加密,原以为用PHP的mcrypt_encrypt或者openssl_encrypt写就好了,没 ...
- android开发 java与c# 兼容AES加密
由于android客户端采用的是AES加密,服务器用的是asp.net(c#),所以就造成了不一致的加密与解密问题,下面就贴出代码,已经试验过. using System; using System. ...
最新文章
- Java数据访问对象模式
- P1634 禽兽的传染病
- UltraEdit正则表达式介绍及实例
- 160个Crackme016
- 如何利用Delphi释放所占的内存
- Q_INIT_RESOURE
- Visual Studio 2013 error MS8020 Build tools v140 cannot be found 解决系统 不同部分软件 所依赖编译器版本不同的矛盾
- HR怒甩程序员男友:不加班没上进没前途,网友:惹不起
- 《PHP、MySQL和Apache入门经典(第5版)》一2.7 基本安全规则
- mysql读取自增值失败_MySQL添加自增列失败
- 让电脑清空数据或死机,一定要执行才舒服
- Silverlight实现文件下载
- Linux:什么是 i386、i586、 i686、noarch?
- 使用qq邮箱作为程序客户端自动发送邮件
- spurious wakeup -- 多线程之虚假唤醒
- html中边距属性,CSS边距属性
- 探索 AIX 6:新特性概述(上)(转自IBM)
- Ruby ERB模板注入检测
- 华为鸿蒙未来生态,华为王成录:鸿蒙生态构建成功后,未来移动产业20年将属于中国...
- 阿里云域名实名认证操作图文详情 新人必看教程
热门文章
- SQL2005安装错误1706,安装程序找不到需要的文件。请检查……,SQL没有安装OWC11”解决方法...
- matlab fig图片读取,从Matlab .fig文件中读取数据,并重新绘图
- 《佛祖都说了些什么》读书笔记
- python--数据导入--read_excel
- python两个下划线怎么打_Python中单下划线与双下划线用法总结
- PyTorch基础(六)-- optim模块
- SQL Server中默认的数据库及作用
- winrm java客户端_Ansible for Windows:WinRM HTTPS设置
- Word文档压缩技巧,你不得不知道
- styl类型文件css,styl样式文件问题:vue重复加载