AES算法是一种对称加密算法,是美国国家标准技术研究所NIST旨在取代DES的21世纪的加密标准。

下文实例中,密钥采用了直接写死的方式,实际使用中可以配合RSA加密算法加密密钥,从而达到更好的安全效果。

=====================代码实现====================

  1. package com.zhuiyv.util;
  2.  
  3. import java.security.Key;
  4.  
  5. import javax.crypto.Cipher;
  6. import javax.crypto.spec.IvParameterSpec;
  7. import javax.crypto.spec.SecretKeySpec;
  8.  
  9. import org.apache.axis.encoding.Base64;
  10.  
  11. /**
  12. * AES加解密工具类
  13. * @.Desc AES对称加密算法,调用方法:
  14. * 1) 对明文进行加密,并对密文进行Base64编码:AESUtil.encrypt(plainText, keyStr); plainText为需要加密的字符串,keyStr为密钥。
  15. * 2) 先对密文进行Base64解码,然后再进行解密:AESUtil.decrypt(secretText, keyStr); secretText为需要解密的字符串,keyStr为密钥。
  16. * @author Zhuiyv
  17. * @version 1.0.0
  18. * @.Date 2015-11-11 10:04:20
  19. * @.Modify
  20. */
  21. public class AESUtil {
  22. /**
  23. * AES Key 长度
  24. */
  25. private static final int AES_KEY_LENGTH = 16;
  26.  
  27. /**
  28. * 默认AES Key
  29. */
  30. private static final String DEFAULT_AES_KEY_STR = "AES_KEY";
  31.  
  32. // 此处向量可自定义,请注意如果超过0x80请加(byte)强制转换
  33. private static final byte[] OIV = { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06,
  34. 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10 };
  35.  
  36. /**
  37. * 加密,并对密文进行Base64编码,采用默认密钥
  38. * @param plainText
  39. * 明文
  40. * @return String
  41. * 做了Base64编码的密文
  42. * @throws Exception
  43. */
  44. public static String encrypt(String plainText){
  45. return encrypt(plainText, DEFAULT_AES_KEY_STR);
  46. }
  47.  
  48. /**
  49. * 加密,并对密文进行Base64编码,可指定密钥
  50. * @param plainText
  51. * 明文
  52. * @param keyStr
  53. * 密钥
  54. * @return String
  55. * 做了Base64编码的密文
  56. * @throws Exception
  57. */
  58. public static String encrypt(String plainText, String keyStr){
  59. try {
  60. byte[] keyBytes = keyStr.getBytes("UTF-8");
  61. byte[] keyBytesTruncated = new byte[AES_KEY_LENGTH];
  62. for (int i = 0; i < AES_KEY_LENGTH; i++) {
  63. if (i >= keyBytes.length) {
  64. // keyBytesTruncated[i] = (byte)0x80;
  65. keyBytesTruncated[i] = 0x12;
  66. } else {
  67. keyBytesTruncated[i] = keyBytes[i];
  68. }
  69. }
  70. Key ckey = new SecretKeySpec(keyBytesTruncated, "AES");
  71. Cipher cp = Cipher.getInstance("AES/CBC/PKCS5Padding");
  72. IvParameterSpec iv = new IvParameterSpec(OIV);
  73. cp.init(1, ckey, iv);
  74. byte[] inputByteArray = plainText.getBytes("UTF-8");
  75.  
  76. byte[] cipherBytes = cp.doFinal(inputByteArray);
  77. // String result=Base64.encodeToString(cipherBytes, Base64.NO_WRAP);
  78. String result = encodeBase64(cipherBytes);
  79. result = result.replace("+", "%2b");
  80. result = result.replace("\r\n", "").replace("\n", "");
  81. return result;
  82. } catch (Exception e) {
  83. throw new RuntimeException(e);
  84. }
  85. }
  86.  
  87. /**
  88. * 对做了Base64编码的密文进行解密,采用默认密钥
  89. * @param secretText
  90. * 做了Base64编码的密文
  91. * @return String
  92. * 解密后的字符串
  93. * @throws Exception
  94. */
  95. public static String decrypt(String secretText){
  96. return decrypt(secretText, DEFAULT_AES_KEY_STR);
  97. }
  98.  
  99. /**
  100. * 对做了Base64编码的密文进行解密
  101. * @param secretText
  102. * 做了Base64编码的密文
  103. * @param keyStr
  104. * 密钥
  105. * @return String
  106. * 解密后的字符串
  107. * @throws Exception
  108. */
  109. public static String decrypt(String secretText, String keyStr){
  110. secretText = secretText.replace("%2b", "+");
  111. try {
  112. byte[] cipherByte = Base64.decode(secretText);
  113. // byte[] cipherByte =Base64.decode(plainText, Base64.DEFAULT);
  114. byte[] keyBytes = keyStr.getBytes("UTF-8");
  115. byte[] keyBytesTruncated = new byte[AES_KEY_LENGTH];
  116. for (int i = 0; i < AES_KEY_LENGTH; i++) {
  117. if (i >= keyBytes.length) {
  118. keyBytesTruncated[i] = 0x12;
  119. } else {
  120. keyBytesTruncated[i] = keyBytes[i];
  121. }
  122. }
  123. Key ckey = new SecretKeySpec(keyBytesTruncated, "AES");
  124. Cipher cp = Cipher.getInstance("AES/CBC/PKCS5Padding");
  125. // Cipher cp = Cipher.getInstance("AES/ECB/PKCS5Padding");
  126. IvParameterSpec iv = new IvParameterSpec(OIV);
  127. cp.init(2, ckey, iv);
  128. byte[] decryptBytes = cp.doFinal(cipherByte);
  129. return new String(decryptBytes, "UTF-8").replace("", "");
  130. } catch (Exception e) {
  131. throw new RuntimeException(e);
  132. }
  133. }
  134.  
  135. // 测试
  136. public static void main(String[] args) {
  137. try {
  138. String content = "{'imei':'NDEyMzQzMjI0MjMzMg==','mac':'MTI6MzQ6MTI6MjM6NDI6MTI=','version':'MS4w'}";
  139. System.out.println(content.length());
  140. System.out.println("加密前:" + content);
  141. // 加密
  142. String encryptResult = encrypt(content);
  143. System.out.println("加密后:" + encryptResult);
  144. String base64_encryptResult = encodeBase64(encryptResult);
  145. System.out.println("Base64编码后:" + base64_encryptResult);
  146. // 解密
  147. String decryptResult = decrypt(encryptResult);//decrypt("MfNVg%2bLiK9QzCien5EirmDRenFRwmuteJH0xlPi04k4aHqVne8sjmxtkwM9uL7I6OGC4gzSxbs13h9kpsWLqxA==");//decrypt(base64_encryptResult);
  148. System.out.println("解密后:" + decryptResult);
  149. } catch (Exception ex) {
  150. ex.printStackTrace();
  151. }
  152. }
  153.  
  154. private static String encodeBase64(String s){
  155. return Base64.encode(s.getBytes());
  156. }
  157.  
  158. private static String encodeBase64(byte[] b){
  159. return Base64.encode(b);
  160. }
  161. }

AES加密算法实现的更多相关文章

  1. AES加密算法C++实现

    我从网上下载了一套AES加密算法的C++实现,代码如下: (1)aes.h #ifndef SRC_UTILS_AES_H #define SRC_UTILS_AES_H class AES { pu ...

  2. PHP android ios相互兼容的AES加密算法

    APP项目用户密码传输一直没有用HTTPS,考虑到用户的隐私暂时先用AES对密码加密,以后也可以用于手机端与服务端加密交互. PHP的免费版phpAES项目,手机端解码各种不对. 好不容易找了PHP ...

  3. Qt使用AES加密算法对字符串进行加密

          因工作需要,需要对字符串进行加密处理,在网上找了很长时间,终于找到了一个可以使用的aes加密算法.其源代码采用c++编写而成,但其头文件引用windows.h,经过修改部分代码,将#inc ...

  4. Android AES加密算法及事实上现

    昨天老大叫我看看android加密算法.于是网上找了找,找到了AES加密算法.(当然还有MD5,BASE64什么的http://snowolf.iteye.com/blog/379860这篇文章列举了 ...

  5. iOS,Android,.NET通用AES加密算法

    原文:iOS,Android,.NET通用AES加密算法 这两天为移动App开发API,结果实现加密验证时碰到一大坑.这里不得不吐槽下又臭又硬的iOS,Windows Server无法解密出正确的结果 ...

  6. Android AES加密算法,现在实际上

    昨天,老板让我来看看android加密算法.于是在网上找了找,发现AES加密算法.(当然,MD5,BASE64什么http://snowolf.iteye.com/blog/379860这篇文章列举了 ...

  7. 【转】PHP android ios相互兼容的AES加密算法

    APP项目用户密码传输一直没有用HTTPS,考虑到用户的隐私暂时先用AES对密码加密,以后也可以用于手机端与服务端加密交互. PHP的免费版phpAES项目,手机端解码各种不对. 好不容易找了PHP ...

  8. .NET工行E生活接入AES加密算法的吐槽-2018

    工行E生活V2版本AES加密算法 吐槽一下工行的java算法,真的是非标准的,参考了java代码,还参考了php代码终于搞定了. 真的是很坑,很坑.中间还涉及到多重加密之类的,一行行把代码翻译成C#代 ...

  9. 【java编程】加密算法-对称加密及AES加密算法

    转载:https://www.jianshu.com/p/3840b344b27c?utm_campaign=maleskine&utm_content=note&utm_medium ...

  10. AES 加密算法 跨语言

    aes加密算法 delphi .java.c# .网页在线工具 4个相同 AES/ECB/PKCS5Padding 与网页在线工具加密结果相同 http://tool.chacuo.net/crypt ...

随机推荐

  1. ie6对hover兼容性问题的解决:

    ie6对hover兼容性问题的解决: 1,在body里添加以下样式: behavior:url(../scripts/csshover.htc); csshover.htc可直接在网上下载 2,js解 ...

  2. python未知网卡名情况下获取本机IP

    import socket def get_ip(): s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) try: # doesn't even ...

  3. 前端学习 第三弹: JavaScript语言的特性与发展

    前端学习 第三弹: JavaScript语言的特性与发展 javascript的缺点 1.没有命名空间,没有多文件的规范,同名函数相互覆盖 导致js的模块化很差 2.标准库很小 3.null和unde ...

  4. Search Insert Position

    int searchInsert(int* nums, int numsSize, int target) { ; ); ; int mid; while(low<=high){ mid=(lo ...

  5. java POI 解析excel 2003和2007 直接转为List<Map> 返回

    1.POI 官网下载jar包,3.5以上 2.项目导入jar包 3.参数:String数组--对应的excel列名对应的KEY,File  excel文件,sheetNumber ---excel的s ...

  6. 偶然翻出很久很久以前写的一款sqlmap UI,有点年头了

  7. EXT.net DateField format设置

    DateField df = new DateField();                        df.Format = "yyyy-MM-dd HH:mm:ss";格 ...

  8. socket入门基础

    #/usr/bin/python #-*- coding:utf-8 -*- import socket ip_port = ('127.0.0.1',111) #创建socket对象 sk = so ...

  9. 基于 Annotation 拦截的 Spring AOP 权限验证方法

    基于 Annotation 拦截的 Spring AOP 权限验证方法 转自:http://www.ibm.com/developerworks/cn/java/j-lo-springaopfilte ...

  10. DevWebForm控件,触发用客户端事件

    ClientInstanceName+".Raise"+"事件名", 例如: ClientInstanceName.RaiseValueChanged();