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

AES 加密解密的更多相关文章

  1. 非对称技术栈实现AES加密解密

    非对称技术栈实现AES加密解密 正如前面的一篇文章所述,https协议的SSL层是实现在传输层之上,应用层之下,也就是说在应用层上看到的请求还是明码的,对于某些场景下要求这些http请求参数是非可读的 ...

  2. C#中使用DES和AES加密解密

    C#中使用DES和AES加密解密 2008-01-12 09:37 using System;using System.Text;using System.Security.Cryptography; ...

  3. C#, Java, PHP, Python和Javascript几种语言的AES加密解密实现[转载]

    原文:http://outofmemory.cn/code-snippet/35524/AES-with-javascript-java-csharp-python-or-php c#里面的AES加密 ...

  4. ruby AES加密解密

    最近和京东合作做一个项目,在接口对接传递参数时,参数需要通过AES加密解密. 本来想到用gem 'aescrypt'处理,但是aescrypt的编码方式用的base64,而京东那边用的是16进制.所以 ...

  5. openssl与cryptoAPI交互AES加密解密

    继上次只有CryptoAPI的加密后,这次要实现openssl的了 动机:利用CryptoAPI制作windows的IE,火狐和chrome加密控件后,这次得加上与android的加密信息交互 先前有 ...

  6. java使用AES加密解密 AES-128-ECB加密

    java使用AES加密解密 AES-128-ECB加密 import javax.crypto.Cipher; import javax.crypto.spec.SecretKeySpec; impo ...

  7. AES加密解密——AES在JavaWeb项目中前台JS加密,后台Java解密的使用

    一:前言 在软件开发中,经常要对数据进行传输,数据在传输的过程中可能被拦截,被监听,所以在传输数据的时候使用数据的原始内容进行传输的话,安全隐患是非常大的.因此就要对需要传输的数据进行在客户端进行加密 ...

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

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

  9. php与java通用AES加密解密算法

    AES指高级加密标准(Advanced Encryption Standard),是当前最流行的一种密码算法,在web应用开发,特别是对外提供接口时经常会用到,下面是我整理的一套php与java通用的 ...

  10. Java 关于密码处理的工具类[MD5编码][AES加密/解密]

    项目中又遇到了加密问题,又去翻了半天,然后做测试,干脆就把常用的两类小结一下. 1.第一种所谓的MD5加密 其实也不算加密,只是基于Hash算法的不可逆编码而已,等于说,一旦经过MD5处理,是不可能从 ...

随机推荐

  1. mktemp---创建暂存文件

  2. Python修改文件内容

    工作中要写个脚本来修改文件的内容,然后就写了一个刷子: #coding:utf8 import os def modify_file(old_file, new_version, old_versio ...

  3. Mysql学习总结(13)——使用JDBC处理MySQL大数据

    一.基本概念 大数据也称之为LOB(Large Objects),LOB又分为:clob和blob,clob用于存储大文本,blob用于存储二进制数据,例如图像.声音.二进制文等. 在实际开发中,有时 ...

  4. iOS Dev (51)加急审核

    https://developer.apple.com/appstore/contact/? topic=expedite

  5. codeforces 1037E. Trips(倒叙)

    题目传送门: 解题思路: 正着搞好像有点恶心. 反着搞. 一边删一边搞,从崩坏的地方开始,入度--. 最后dfs崩坏,更新答案. 注意要把边删掉防止重复崩坏. 代码: #include<cstd ...

  6. PYTHON学习第五天课后总结:

    今日重点: 数字类型 字符串类型 列表类型 元组类型 1,数字类型    数字类型为不可变类型   也只能将纯数字类型的字符串转换成int包括: 整型: int()     int() 为内置函数,可 ...

  7. MySQL集群搭建详解

    概述 MySQL Cluster 是MySQL 适合于分布式计算环境的高实用.可拓展.高性能.高冗余版本,其研发设计的初衷就是要满足许多行业里的最严酷应用要求,这些应用中经常要求数据库运行的可靠性要达 ...

  8. 有关 Lambda && linq练习 有待整理

    1. 查询Student表中的所有记录的Sname.Ssex和Class列.(select sname,ssex,class from student) Students.Select(s=> ...

  9. HDU 4869 Turn the pokers(思维+组合公式+高速幂)

    pid=4869" target="_blank">Turn the pokers 大意:给出n次操作,给出m个扑克.然后给出n个操作的个数a[i],每一个a[i] ...

  10. Delphi部份函数,命令,属性中文说明

    Abort 函数 引起放弃的意外处理 Abs 函数 绝对值函数 AddExitProc 函数 将一过程添加到运行时库的结束过程表中 Addr 函数 返回指定对象的地址 AdjustLineBreaks ...