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. 第七章:LED将为我闪烁:控制发光二极管

        在之前章节了解到Linux驱动程序可以控制软硬件,可以实现软硬件之间的交互.在这章我们学习LED驱动的实现原理.Linux内核提供了多个与I/O内存交互的函数可以实现控制硬件.    编写LE ...

  2. HTML5 地理位置定位(HTML5 Geolocation)原理及应用

    地理位置(Geolocation)是 HTML5 的重要特性之一,提供了确定用户位置的功能,借助这个特性能够开发基于位置信息的应用.今天这篇文章向大家介绍一下 HTML5 地理位置定位的基本原理及各个 ...

  3. EXTJS4.2中neptune主题的使用

    原文地址:http://blog.csdn.net/xieguojun2013/article/details/8880519 最近在在sencha.com官网了解到EXTJS的最新版本里增加了新的主 ...

  4. html5高级

    Html5高级 项目回顾 Day 01 第三阶段知识体系: (1)AJAX异步请求 数据库.PHP.HTTP.原生AJAX.jQuery中的AJAX (2)HTML5高级特性 九大新特性 (3)Boo ...

  5. AngularJS + Java---前台网页与后台数据库传递数据 基本结构

    第一个关于这两种语言的项目,以下只是我自己的理解,欢迎指教:) 基本对应关系 1. controller .jsp(.html)  ng-controller="controllerTest ...

  6. jQuery 简介

    jQuery 简介 jQuery 库可以通过一行简单的标记被添加到网页中. jQuery 库 - 特性 jQuery 是一个 JavaScript 函数库. jQuery 库包含以下特性: HTML ...

  7. $.post() 传递多个参数.

    $("#button").click(function() { /获取表单中id为idname和count的文本值付给property的两个属性 var property={&qu ...

  8. LINUX测试环境部署manggo(六)

    安装配置manggo 复制安装包mongodb-linux-x86_64-2.6.5.tgz到/usr/local/目录下,或者如果有网络可以直接使用wget命令下载安装包到/usr/local目录下 ...

  9. C++ exception

    从没用过C++STL中的exception(异常类),在使用rapidxml,操作XML文件时,发现在一个抛出异常的错误.关注了下,就模范着做. 我也专门写了个函数来分配内存,如果发现分配不成功,就抛 ...

  10. 初识linux端c++程序开发

    关于linux端程序开发,我以前一直不知道是做些什么,只是感觉听高端的.最近接触了一些,有了一些初步的认识. 首先,linux是一个操作系统,跟windows一样:接通电源.按下电脑开机,电脑就会自动 ...