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

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

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

package com.zhuiyv.util;

import java.security.Key;

import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec; import org.apache.axis.encoding.Base64; /**
* AES加解密工具类
* @.Desc AES对称加密算法,调用方法:
* 1) 对明文进行加密,并对密文进行Base64编码:AESUtil.encrypt(plainText, keyStr); plainText为需要加密的字符串,keyStr为密钥。
* 2) 先对密文进行Base64解码,然后再进行解密:AESUtil.decrypt(secretText, keyStr); secretText为需要解密的字符串,keyStr为密钥。
* @author Zhuiyv
* @version 1.0.0
* @.Date 2015-11-11 10:04:20
* @.Modify
*/
public class AESUtil {
/**
* AES Key 长度
*/
private static final int AES_KEY_LENGTH = 16; /**
* 默认AES Key
*/
private static final String DEFAULT_AES_KEY_STR = "AES_KEY"; // 此处向量可自定义,请注意如果超过0x80请加(byte)强制转换
private static final byte[] OIV = { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06,
0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10 }; /**
* 加密,并对密文进行Base64编码,采用默认密钥
* @param plainText
* 明文
* @return String
* 做了Base64编码的密文
* @throws Exception
*/
public static String encrypt(String plainText){
return encrypt(plainText, DEFAULT_AES_KEY_STR);
} /**
* 加密,并对密文进行Base64编码,可指定密钥
* @param plainText
* 明文
* @param keyStr
* 密钥
* @return String
* 做了Base64编码的密文
* @throws Exception
*/
public static String encrypt(String plainText, String keyStr){
try {
byte[] keyBytes = keyStr.getBytes("UTF-8");
byte[] keyBytesTruncated = new byte[AES_KEY_LENGTH];
for (int i = 0; i < AES_KEY_LENGTH; i++) {
if (i >= keyBytes.length) {
// keyBytesTruncated[i] = (byte)0x80;
keyBytesTruncated[i] = 0x12;
} else {
keyBytesTruncated[i] = keyBytes[i];
}
}
Key ckey = new SecretKeySpec(keyBytesTruncated, "AES");
Cipher cp = Cipher.getInstance("AES/CBC/PKCS5Padding");
IvParameterSpec iv = new IvParameterSpec(OIV);
cp.init(1, ckey, iv);
byte[] inputByteArray = plainText.getBytes("UTF-8"); byte[] cipherBytes = cp.doFinal(inputByteArray);
// String result=Base64.encodeToString(cipherBytes, Base64.NO_WRAP);
String result = encodeBase64(cipherBytes);
result = result.replace("+", "%2b");
result = result.replace("\r\n", "").replace("\n", "");
return result;
} catch (Exception e) {
throw new RuntimeException(e);
}
} /**
* 对做了Base64编码的密文进行解密,采用默认密钥
* @param secretText
* 做了Base64编码的密文
* @return String
* 解密后的字符串
* @throws Exception
*/
public static String decrypt(String secretText){
return decrypt(secretText, DEFAULT_AES_KEY_STR);
} /**
* 对做了Base64编码的密文进行解密
* @param secretText
* 做了Base64编码的密文
* @param keyStr
* 密钥
* @return String
* 解密后的字符串
* @throws Exception
*/
public static String decrypt(String secretText, String keyStr){
secretText = secretText.replace("%2b", "+");
try {
byte[] cipherByte = Base64.decode(secretText);
// byte[] cipherByte =Base64.decode(plainText, Base64.DEFAULT);
byte[] keyBytes = keyStr.getBytes("UTF-8");
byte[] keyBytesTruncated = new byte[AES_KEY_LENGTH];
for (int i = 0; i < AES_KEY_LENGTH; i++) {
if (i >= keyBytes.length) {
keyBytesTruncated[i] = 0x12;
} else {
keyBytesTruncated[i] = keyBytes[i];
}
}
Key ckey = new SecretKeySpec(keyBytesTruncated, "AES");
Cipher cp = Cipher.getInstance("AES/CBC/PKCS5Padding");
// Cipher cp = Cipher.getInstance("AES/ECB/PKCS5Padding");
IvParameterSpec iv = new IvParameterSpec(OIV);
cp.init(2, ckey, iv);
byte[] decryptBytes = cp.doFinal(cipherByte);
return new String(decryptBytes, "UTF-8").replace("", "");
} catch (Exception e) {
throw new RuntimeException(e);
}
} // 测试
public static void main(String[] args) {
try {
String content = "{'imei':'NDEyMzQzMjI0MjMzMg==','mac':'MTI6MzQ6MTI6MjM6NDI6MTI=','version':'MS4w'}";
System.out.println(content.length());
System.out.println("加密前:" + content);
// 加密
String encryptResult = encrypt(content);
System.out.println("加密后:" + encryptResult);
String base64_encryptResult = encodeBase64(encryptResult);
System.out.println("Base64编码后:" + base64_encryptResult);
// 解密
String decryptResult = decrypt(encryptResult);//decrypt("MfNVg%2bLiK9QzCien5EirmDRenFRwmuteJH0xlPi04k4aHqVne8sjmxtkwM9uL7I6OGC4gzSxbs13h9kpsWLqxA==");//decrypt(base64_encryptResult);
System.out.println("解密后:" + decryptResult);
} catch (Exception ex) {
ex.printStackTrace();
}
} private static String encodeBase64(String s){
return Base64.encode(s.getBytes());
} private static String encodeBase64(byte[] b){
return Base64.encode(b);
}
}

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. 关于Java中的基本数据类型转换

    Java中的基本类型有四种,其中整型分为byte.short.int.long,浮点型分为float.double,字符型char,布尔型boolean.8种类型的级别由低到高byte->sho ...

  2. Linux指令小结

    1.apt指令集:是ubuntu中最强大的命令行软件管理工具,用于获取.安装.编译.卸载和查询软件包.还可以检查软件包的依赖关系.在ubunt中下载是根据/etc/apt/sources.list这个 ...

  3. 修改oracle实例名orcl为demo

    修改oracle实例名有六步: 1.sqlplus username/password as sysdba登陆,然后从spfile文件创建pfile文件 :create pfile from spfi ...

  4. Single Number

    Given an array of integers, every element appears twice except for one. Find that single one.Your al ...

  5. hosts 文件妙用

        127.0.0.1  localhost  www.baidu.com  www.126.com  www.xiaoxiao.com 1: 如果在hosts文件中加入这句话,则localhos ...

  6. 验证视图状态MAC失败。如果此应用程序由网络场或群集承载,请确保配置指定了相同的validationKey和验证算法(转)

    原文转自:http://www.cnblogs.com/Setme/archive/2012/06/05/2537084.html 验证视图状态 MAC 失败.如果此应用程序由网络场或群集承载,请确保 ...

  7. centos nginx server_name 配置域名访问规则

    今天配置Server_name时,希望禁用一些域名,应为这些域名我想让通过另外一个Server配置 server_name "~^((\w*[^w]{1}\w*)|w{1,2})\.hell ...

  8. SSHD服务搭建

    SSH协议:安全外壳协议.为Secure Shell 缩写.SSH为建立在应用层和传输层基础上的安全协议.   1.检查SSH服务端安装情况 [root@rhel6_84 ~]# rpm -qpi / ...

  9. Delphi、C C++、Visual Basic数据类型的对照 转

    Delphi.C C++.Visual  Basic数据类型的对照 变量类型 Delphi C/C++ Visual Basic 位有符号整数 ShortInt char -- 位无符号整数 Byte ...

  10. Uva11292--------------(The Dragon of Loowater)勇者斗恶龙 (排序后贪心)

    ---恢复内容开始--- 题目: Once upon a time, in the Kingdom of Loowater, a minor nuisance turned into a major ...