AES加密、解密工具类代码如下:

  1. package com.util;
  2.  
  3. import java.io.IOException;
  4. import java.io.UnsupportedEncodingException;
  5. import java.security.InvalidKeyException;
  6. import java.security.NoSuchAlgorithmException;
  7. import java.security.SecureRandom;
  8.  
  9. import javax.crypto.BadPaddingException;
  10. import javax.crypto.Cipher;
  11. import javax.crypto.IllegalBlockSizeException;
  12. import javax.crypto.KeyGenerator;
  13. import javax.crypto.NoSuchPaddingException;
  14. import javax.crypto.SecretKey;
  15. import javax.crypto.spec.SecretKeySpec;
  16.  
  17. import sun.misc.BASE64Decoder;
  18. import sun.misc.BASE64Encoder;
  19.  
  20. /**
  21. * 利用AES对string进行加密、解密;
  22. * 非常注意:encodeRules就是秘钥,是需要自己保密的钥匙,对同一个内容不许有同样的秘钥进行加密和解密才能够正确识别;
  23. * @author admin
  24. *
  25. */
  26. public class AESUtils {
  27. /*
  28. * 加密 1.构造密钥生成器 2.根据ecnodeRules规则初始化密钥生成器 3.产生密钥 4.创建和初始化密码器 5.内容加密 6.返回字符串(非常注意:返回的字符串可能会因为过长而自动进行换行)
  29. */
  30. public static String AESEncode(String encodeRules, String content) {
  31. String result = "";
  32. try {
  33. // 1.构造密钥生成器,指定为AES算法,不区分大小写
  34. KeyGenerator keygen = KeyGenerator.getInstance("AES");
  35. // 2.根据ecnodeRules规则初始化密钥生成器
  36. // 生成一个128位的随机源,根据传入的字节数组
  37. keygen.init(128, new SecureRandom(encodeRules.getBytes()));
  38. // 3.产生原始对称密钥
  39. SecretKey original_key = keygen.generateKey();
  40. // 4.获得原始对称密钥的字节数组
  41. byte[] raw = original_key.getEncoded();
  42. // 5.根据字节数组生成AES密钥
  43. SecretKey key = new SecretKeySpec(raw, "AES");
  44. // 6.根据指定算法AES自成密码器
  45. Cipher cipher = Cipher.getInstance("AES");
  46. // 7.初始化密码器,第一个参数为加密(Encrypt_mode)或者解密解密(Decrypt_mode)操作,第二个参数为使用的KEY
  47. cipher.init(Cipher.ENCRYPT_MODE, key);
  48. // 8.获取加密内容的字节数组(这里要设置为utf-8)不然内容中如果有中文和英文混合中文就会解密为乱码
  49. byte[] byte_encode = content.getBytes("utf-8");
  50. // 9.根据密码器的初始化方式--加密:将数据加密
  51. byte[] byte_AES = cipher.doFinal(byte_encode);
  52. // 10.将加密后的数据转换为字符串
  53. // 这里用Base64Encoder中会找不到包
  54. // 解决办法:
  55. // 在项目的Build path中先移除JRE System Library,再添加库JRE System
  56. // Library,重新编译后就一切正常了。
  57. result= new String(new BASE64Encoder().encode(byte_AES));
  58. } catch (NoSuchAlgorithmException e) {
  59. e.printStackTrace();
  60. } catch (NoSuchPaddingException e) {
  61. e.printStackTrace();
  62. } catch (InvalidKeyException e) {
  63. e.printStackTrace();
  64. } catch (IllegalBlockSizeException e) {
  65. e.printStackTrace();
  66. } catch (BadPaddingException e) {
  67. e.printStackTrace();
  68. } catch (UnsupportedEncodingException e) {
  69. e.printStackTrace();
  70. }finally{
  71. return result;
  72. }
  73. }
  74.  
  75. /*
  76. * 非常注意:因为通过加密后的字符串可能会很长,并且字符串内可能有自动的换行,因此最好对字符串content进行replaceAll("\r|\n","")处理,否则会报16进制类似的异常
  77. * 解密 解密过程: 1.同加密1-4步 2.将加密后的字符串反纺成byte[]数组 3.将加密内容解密
  78. */
  79. public static String AESDncode(String encodeRules, String content) {
  80. String result = "";
  81. try {
  82. // 1.构造密钥生成器,指定为AES算法,不区分大小写
  83. KeyGenerator keygen = KeyGenerator.getInstance("AES");
  84. // 2.根据ecnodeRules规则初始化密钥生成器
  85. // 生成一个128位的随机源,根据传入的字节数组
  86. keygen.init(128, new SecureRandom(encodeRules.getBytes()));
  87. // 3.产生原始对称密钥
  88. SecretKey original_key = keygen.generateKey();
  89. // 4.获得原始对称密钥的字节数组
  90. byte[] raw = original_key.getEncoded();
  91. // 5.根据字节数组生成AES密钥
  92. SecretKey key = new SecretKeySpec(raw, "AES");
  93. // 6.根据指定算法AES自成密码器
  94. Cipher cipher = Cipher.getInstance("AES");
  95. // 7.初始化密码器,第一个参数为加密(Encrypt_mode)或者解密(Decrypt_mode)操作,第二个参数为使用的KEY
  96. cipher.init(Cipher.DECRYPT_MODE, key);
  97. // 8.将加密并编码后的内容解码成字节数组
  98. byte[] byte_content = new BASE64Decoder().decodeBuffer(content);
  99. /*
  100. * 解密
  101. */
  102. byte[] byte_decode = cipher.doFinal(byte_content);
  103. result = new String(byte_decode, "utf-8");
  104. } catch (NoSuchAlgorithmException e) {
  105. e.printStackTrace();
  106. } catch (NoSuchPaddingException e) {
  107. e.printStackTrace();
  108. } catch (InvalidKeyException e) {
  109. e.printStackTrace();
  110. } catch (IOException e) {
  111. e.printStackTrace();
  112. } catch (IllegalBlockSizeException e) {
  113. e.printStackTrace();
  114. } catch (BadPaddingException e) {
  115. e.printStackTrace();
  116. }finally{
  117. return result;
  118. }
  119. }
  120.  
  121. public static void main(String[] args) {
  122. String content = "123456";
  123. String encodeStr = AESUtils.AESEncode(StringConstant.AESKey, content);
  124. System.out.println("加密后:"+encodeStr);
  125. String decodeStr = AESUtils.AESDncode(StringConstant.AESKey, encodeStr);
  126. System.out.println("解密后:"+decodeStr);
  127. }
  128.  
  129. }

  以上代码,借鉴于他人,有些需要非常注意的地方自己做了注释,仅供自己以后参考使用。。。

AES加密、解密工具类的更多相关文章

  1. AES加密解密工具类封装(AESUtil)

    package club.codeapes.common.utils; import org.springframework.util.Base64Utils; import javax.crypto ...

  2. 自写AES加密解密工具类

    此类主要用于加密与解密,采用128位ECB模式,PKCS5Padding填充补位. 可使用方法为加密返回二进制encryptBin(content, key).加密返回十六进制encryptHex(c ...

  3. Java中的AES加解密工具类:AESUtils

    本人手写已测试,大家可以参考使用 package com.mirana.frame.utils.encrypt; import com.mirana.frame.constants.SysConsta ...

  4. AES加密解密 助手类 CBC加密模式

    "; string result1 = AESHelper.AesEncrypt(str); string result2 = AESHelper.AesDecrypt(result1); ...

  5. Base64加密解密工具类

    使用Apache commons codec类Base64进行加密解密 maven依赖 <dependency> <groupId>commons-codec</grou ...

  6. Java AES加密解密工具 -- GUI 、在线传输文件

    原理 对于任意长度的明文,AES首先对其进行分组,每组的长度为128位.分组之后将分别对每个128位的明文分组进行加密. 对于每个128位长度的明文分组的加密过程如下:     (1)将128位AES ...

  7. .Net(c#)加密解密工具类:

    /// <summary> /// .Net加密解密帮助类 /// </summary> public class NetCryptoHelper { #region des实 ...

  8. java加密解密工具类

    package com.founder.mrp.util; import java.nio.charset.StandardCharsets; import java.security.Key; im ...

  9. 加密解密工具类(Java,DES)

    一个Java版的DES加密工具类,能够用来进行网络传输数据加密,保存password的时候进行加密. import java.security.Key; import java.security.sp ...

  10. java 加密解密工具类(实用!!!)

    最近发现了一个加密解密的好例子,很方便使用,可以作为平时开发的工具集,记录一下. package com.sh.springboottdemo2.util; import com.sun.org.ap ...

随机推荐

  1. ES6入门教程---变量和常量

    ES6提出了两个新的声明变量的命令:let 和 const 1. 建议不再使用var,而使用let 和const .优先使用const. 在定义之后值是固定不变的,即为常量 常量的值不能修改,但是如果 ...

  2. uoj46玄学

    复杂度辣鸡没人权 疯狂爆oj 感觉要被众多uoj用户骂了 #include <bits/stdc++.h> #define ll long long #define LS ls[now]? ...

  3. Jenkins执行yarn install报错:error An unexpected error occurred:"... ... :Unexpected end of JSON input"

    解决方式: # cd /usr/local/n/versions/node/11.6.0/lib/(node的安装目录下) # rm -rf node_modules # yarn cache cle ...

  4. Sam's Numbers 矩阵快速幂优化dp

    https://www.hackerrank.com/contests/hourrank-21/challenges/sams-numbers 设dp[s][i]表示产生的总和是s的时候,结尾符是i的 ...

  5. 将JWT与Spring Security OAuth结合使用

    1.概述 在本教程中,我们将讨论如何使用Spring Security OAuth2实现来使用JSON Web令牌. 我们还将继续构建此OAuth系列的上一篇文章. 2. Maven配置 首先,我们需 ...

  6. 重写FileUpload控件让它可以显示上传后的文件名

    我在以前的开发中经常遇到这样的场景:文件上传之后需要显示文件名,但是asp.net自带的fileupload是不能付给上传后的文件名值的. 以前都是做一个label显示的,今天想起来了,写个控件封装一 ...

  7. Spring注入属性、对象

    对Category和Product注入属性,并且对Product对象,注入一个Category对象 一.新建项目 二.导包 三.新建Category类 package com.yyt.pojo; pu ...

  8. 【转】monkey实战--测试步骤、常用参数、常规monkey命令

    monkey实战--测试步骤.常用参数.常规monkey命令   简要步骤:adb devices---了解包名--adb shell monkey -p 包名 -v 运行次数(多个参数的组合形成不同 ...

  9. ABAP数据类型

    数据类型表: 类型缩写 类型 默认长度 允许长度 初始值 描述 C 文本型 1   Space 字符串数据,如'Program' D 日期型 8 8 '00000000' 日期数据,格式为YYYYMM ...

  10. linux命令行—《命令行快速入门》

    pwd print working directory 打印工作目录 hostname my computer's network name 电脑在网络中的名称 mkdir make director ...