注意:AES加密算法对于不同系统之间的tokens可能会不同,需要在相同的系统间使用

如果设置为private,在其它类调用AES访问不了这个tokens常量,需要自主定义一个tokens或者在配置文件里定义一个tokens,这里的定义将没有意义

  1. import java.io.IOException;
  2. import java.io.UnsupportedEncodingException;
  3. import java.security.InvalidKeyException;
  4. import java.security.NoSuchAlgorithmException;
  5. import java.security.SecureRandom;
  6. import javax.crypto.BadPaddingException;
  7. import javax.crypto.Cipher;
  8. import javax.crypto.IllegalBlockSizeException;
  9. import javax.crypto.KeyGenerator;
  10. import javax.crypto.NoSuchPaddingException;
  11. import javax.crypto.SecretKey;
  12. import javax.crypto.spec.SecretKeySpec;
  13. import sun.misc.BASE64Decoder;
  14. import sun.misc.BASE64Encoder;
  15. /**
  16. * description: AES对称加密和解密
  17. * create by: yonyong
  18. * create time: 2019/3/1 18:11
  19. */
  20. public class AES {
  21. public static final String TOKENS = "yonyong";
  22. /*
  23. * 加密
  24. * 1.构造密钥生成器
  25. * 2.根据ecnodeRules规则初始化密钥生成器
  26. * 3.产生密钥
  27. * 4.创建和初始化密码器
  28. * 5.内容加密
  29. * 6.返回字符串
  30. */
  31. public static String AESEncode(String encodeRules,String content){
  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 Library,重新编译后就一切正常了。
  56. String AES_encode=new String(new BASE64Encoder().encode(byte_AES));
  57. //11.将字符串返回
  58. return AES_encode;
  59. } catch (NoSuchAlgorithmException e) {
  60. e.printStackTrace();
  61. } catch (NoSuchPaddingException e) {
  62. e.printStackTrace();
  63. } catch (InvalidKeyException e) {
  64. e.printStackTrace();
  65. } catch (IllegalBlockSizeException e) {
  66. e.printStackTrace();
  67. } catch (BadPaddingException e) {
  68. e.printStackTrace();
  69. } catch (UnsupportedEncodingException e) {
  70. e.printStackTrace();
  71. }
  72. //如果有错就返加nulll
  73. return null;
  74. }
  75. /*
  76. * 解密
  77. * 解密过程:
  78. * 1.同加密1-4步
  79. * 2.将加密后的字符串反纺成byte[]数组
  80. * 3.将加密内容解密
  81. */
  82. public static String AESDncode(String encodeRules,String content){
  83. try {
  84. //1.构造密钥生成器,指定为AES算法,不区分大小写
  85. KeyGenerator keygen=KeyGenerator.getInstance("AES");
  86. //2.根据ecnodeRules规则初始化密钥生成器
  87. //生成一个128位的随机源,根据传入的字节数组
  88. keygen.init(128, new SecureRandom(encodeRules.getBytes()));
  89. //3.产生原始对称密钥
  90. SecretKey original_key=keygen.generateKey();
  91. //4.获得原始对称密钥的字节数组
  92. byte [] raw=original_key.getEncoded();
  93. //5.根据字节数组生成AES密钥
  94. SecretKey key=new SecretKeySpec(raw, "AES");
  95. //6.根据指定算法AES自成密码器
  96. Cipher cipher=Cipher.getInstance("AES");
  97. //7.初始化密码器,第一个参数为加密(Encrypt_mode)或者解密(Decrypt_mode)操作,第二个参数为使用的KEY
  98. cipher.init(Cipher.DECRYPT_MODE, key);
  99. //8.将加密并编码后的内容解码成字节数组
  100. byte [] byte_content= new BASE64Decoder().decodeBuffer(content);
  101. /*
  102. * 解密
  103. */
  104. byte [] byte_decode=cipher.doFinal(byte_content);
  105. String AES_decode=new String(byte_decode,"utf-8");
  106. return AES_decode;
  107. } catch (NoSuchAlgorithmException e) {
  108. e.printStackTrace();
  109. } catch (NoSuchPaddingException e) {
  110. e.printStackTrace();
  111. } catch (InvalidKeyException e) {
  112. e.printStackTrace();
  113. } catch (IOException e) {
  114. e.printStackTrace();
  115. } catch (IllegalBlockSizeException e) {
  116. e.printStackTrace();
  117. } catch (BadPaddingException e) {
  118. e.printStackTrace();
  119. }
  120. //如果有错就返加nulll
  121. return null;
  122. }
  123. public static void main(String[] args) {
  124. System.out.println(AES.AESEncode(TOKENS,"334"));
  125. System.out.println(AES.AESDncode(TOKENS,"iVEX6hMh0ucmzpuk4C9R5A=="));
  126. }
  127. }

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. RHEL7.2 安装Eclipse-oxygen Hadoop开发环境

    1 Eclipse-oxygen下载地址 http://www.eclipse.org/downloads/download.php?file=/technology/epp/downloads/re ...

  2. 拎壶学python3-----(5)python之格式化输出

    一.格式化输入可以减少代码开发量如下是格式化输出: 上边的%是什么意思呢?%是一个占位符,s代表字符串的类型. 二.我们看下边的例子 看使用%d %i的用法. %d %i 这种格式化只能用数字来填补占 ...

  3. Centos7編譯安裝LAMP平臺

    什麽是LAMP? 拆開看 L 就是Linux系統 A是Apache的縮寫 M.P則是MySQL和PHP的简写. 其实就是把Apache, MySQL以及PHP安装在Linux系统上,组成一个环境来运行 ...

  4. 京东物流出问题了?褥了30块羊毛 & 浅析系统架构

    本人亲身经历,但后续的流程分析都是个人猜测的,毕竟没有实际做过这块的业务. 订单物流阻塞经过 火热的双11刚刚退去,截止今日,我在京东购买的矿泉水终于到货啦,下单两箱还只收到了一箱 :( ,从下单到收 ...

  5. 2019-9-25:渗透测试,基础学习,medusa爆破学习

    Medusa(美杜莎)暴力破解使用 该文章仅供学习,利用方法来自网络文章,仅供参考 一.简介 medusa(美杜莎)是一个速度快,支持大规模并行,模块化,爆破登陆,可以同时对多个主机,用户或是密码执行 ...

  6. 【集训Day4 动态规划】轮船问题

    轮船问题(ship) [问题描述] 某国家被一条河划分为南北两部分,在南岸和北岸总共有N对城市,每一城市在对岸都有唯一的友好城市,任何两个城市都没有相同的友好城市.每一对友好城市都希望有一条航线来往, ...

  7. 题解 P1047 【校门外的树】

    可以直接模拟,用珂朵莉树是不有点小题大做. 你怎么做珂朵莉都会骂你:"这么简单的模拟都要用***" 附赠珂朵莉照片一张 另外讲几点: 可以用int,你要不怕MLE #include ...

  8. 豆瓣 URLError: <urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:719)>

    import urllib.request as urlrequest #import ssl#ssl._create_default_https_context = ssl._create_unve ...

  9. 攻略前端面试官(一):JS的数据类型和内存机制浅析

    原文地址:http://rainykane.cn/2019/09/29/与K_K君一起攻略前端面试官(一):JS的数据类型和内存机制浅析/ 背就完事了 介绍:一些知识点相关的面试题和答案 使用姿势:看 ...

  10. PHP安装sodium加密扩展

    1.为什么会用到sodium加密扩展? 最近在做微信服务商相关的开发,主要用的的接口为微信小微商户进件接口.在请求相关接口中,需要对一些敏感字段进行加密,加密过程见https://pay.weixin ...