特别提示:本人博客部分有参考网络其他博客,但均是本人亲手编写过并验证通过。如发现博客有错误,请及时提出以免误导其他人,谢谢!欢迎转载,但记得标明文章出处:http://www.cnblogs.com/mao2080/

1、什么是AES

高级加密标准(英语:Advanced Encryption Standard,缩写:AES),是一种区块加密标准。这个标准用来替代原先的DES,已经被多方分析且广为全世界所使用。特性:对称加密。

2、加密解密方法

 package com.mao;

 import java.security.SecureRandom;

 import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec; import org.apache.commons.lang.StringUtils; /**
*
* 项目名称:---
* 模块名称:常用工具
* 功能描述:安全工具类
* 创建人: mao2080@sina.com
* 创建时间:2017年4月27日 下午5:33:24
* 修改人: mao2080@sina.com
* 修改时间:2017年4月27日 下午5:33:24
*/
public class SecurityUtil { /**AES算法key size*/
private static final int AES_KEY_SIZE = 128; /**AES算法*/
private static final String ALGORITHM = "AES"; /**AES-charset*/
private static final String AES_CHARSET = "UTF-8"; /**
*
* 描述:将字符串通过AES算法加密
* @author mao2080@sina.com
* @created 2017年4月7日 上午11:00:51
* @since
* @param content 需要加密的内容
* @param strkey 密钥
* @return 加密后字符串
* @throws Exception
*/
public static String EncryptByAES(String content, String strkey) throws Exception {
if (StringUtils.isBlank(strkey)) {
throw new Exception();
}
try {
KeyGenerator kgen = KeyGenerator.getInstance(SecurityUtil.ALGORITHM);
kgen.init(SecurityUtil.AES_KEY_SIZE, new SecureRandom(strkey.getBytes(SecurityUtil.AES_CHARSET)));
SecretKey secretKey = kgen.generateKey();
byte[] enCodeFormat = secretKey.getEncoded();
SecretKeySpec key = new SecretKeySpec(enCodeFormat, SecurityUtil.ALGORITHM);
Cipher cipher = Cipher.getInstance(SecurityUtil.ALGORITHM);// 创建密码器
byte[] byteContent = content.getBytes(SecurityUtil.AES_CHARSET);
cipher.init(Cipher.ENCRYPT_MODE, key);//初始化
byte[] result = cipher.doFinal(byteContent);//加密
return SecurityUtil.parseByte2HexStr(result);
} catch (Exception e) {
throw new Exception();
}
} /**
*
* 描述:将字符串通过AES算法解密
* @author mao2080@sina.com
* @created 2017年4月7日 上午11:18:51
* @since
* @param content 需要解密的内容
* @param key 密钥
* @return
* @throws Exception
*/
public static String DecryptAES(String content, String strkey) throws Exception {
if (StringUtils.isBlank(strkey)) {
throw new Exception();
}
try {
byte[] decryptFrom = SecurityUtil.parseHexStr2Byte(content);
KeyGenerator kgen = KeyGenerator.getInstance(SecurityUtil.ALGORITHM);
kgen.init(SecurityUtil.AES_KEY_SIZE, new SecureRandom(strkey.getBytes(SecurityUtil.AES_CHARSET)));
SecretKey secretKey = kgen.generateKey();
byte[] enCodeFormat = secretKey.getEncoded();
SecretKeySpec key = new SecretKeySpec(enCodeFormat, SecurityUtil.ALGORITHM);
Cipher cipher = Cipher.getInstance(SecurityUtil.ALGORITHM);//创建密码器
cipher.init(Cipher.DECRYPT_MODE, key);//初始化
return new String(cipher.doFinal(decryptFrom));
} catch (Exception e) {
throw new Exception();
}
} /**
*
* 描述:将二进制转换成16进制字符串
* @author mao2080@sina.com
* @created 2017年4月7日 上午10:55:48
* @since
* @param buf 二进制数组
* @return
* @throws Exception
*/
public static String parseByte2HexStr(byte buf[]) throws Exception {
if(buf == null){
throw new Exception();
}
StringBuffer sb = new StringBuffer();
for (int i = 0; i < buf.length; i++) {
String hex = Integer.toHexString(buf[i] & 0xFF);
if (hex.length() == 1) {
sb.append("0");
}
sb.append(hex);
}
return sb.toString();
} /**
*
* 描述:将16进制转换为二进制
* @author mao2080@sina.com
* @created 2017年4月7日 下午2:16:42
* @since
* @param hexStr 10进制字符串
* @return
* @throws Exception
*/
public static byte[] parseHexStr2Byte(String hexStr) throws Exception {
if (hexStr.length() < 1){
throw new Exception();
}
byte[] result = new byte[hexStr.length() / 2];
for (int i = 0; i < hexStr.length() / 2; i++) {
int hig = Integer.parseInt(hexStr.substring(i * 2, i * 2 + 1), 16);
int low = Integer.parseInt(hexStr.substring(i * 2 + 1, i * 2 + 2), 16);
result[i] = (byte) (hig * 16 + low);
}
return result;
} public static void main(String[] args) throws Exception{
String aes = EncryptByAES("hello mao", "12345678");
System.out.println("AES加密:"+aes);
System.out.println("AES解密:"+DecryptAES(aes, "12345678"));
} }

3、运行结果

AES加密:775edd66a29a6849a98812199241f230
AES解密:hello mao

4、参考博客

http://www.cnblogs.com/vmax-tam/p/4624032.html

数据加密之AES的更多相关文章

  1. Android数据加密之Aes加密

    前言: 项目中除了登陆,支付等接口采用rsa非对称加密,之外的采用aes对称加密,今天我们来认识一下aes加密. 其他几种加密方式: Android数据加密之Rsa加密 Android数据加密之Aes ...

  2. 接口自动化--数据加密之AES

    在接口测试中,会遇到加密的请求数据,例如:常用的base64加密,AES加密,在这里,简述用Python转化AES的加密方法 原理 官网链接:https://pycryptodome.readthed ...

  3. Android数据加密之异或加密算法

    前言: 这几天被公司临时拉到去做Android IM即时通信协议实现,大致看了下他们定的协议,由于之前没有参与,据说因服务器性能限制,只达成非明文传递,具体原因我不太清楚,不过这里用的加密方式是采用异 ...

  4. Android数据加密之SHA安全散列算法

    前言: 对于SHA安全散列算法,以前没怎么使用过,仅仅是停留在听说过的阶段,今天在看图片缓存框架Glide源码时发现其缓存的Key采用的不是MD5加密算法,而是SHA-256加密算法,这才勾起了我的好 ...

  5. Android数据加密之Base64编码算法

    前言: 前面学习总结了平时开发中遇见的各种数据加密方式,最终都会对加密后的二进制数据进行Base64编码,起到一种二次加密的效果,其实呢Base64从严格意义上来说的话不是一种加密算法,而是一种编码算 ...

  6. Android数据加密之MD5加密

    前言: 项目中无论是密码的存储或者说判断文件是否是同一文件,都会用到MD5算法,今天来总结一下MD5加密算法. 什么是MD5加密? MD5英文全称“Message-Digest Algorithm 5 ...

  7. Android数据加密之Rsa加密

    前言: 最近无意中和同事交流数据安全传输的问题,想起自己曾经使用过的Rsa非对称加密算法,闲下来总结一下. 其他几种加密方式: Android数据加密之Rsa加密 Android数据加密之Aes加密 ...

  8. Android数据加密之Des加密

    前言: 端午节前有个同事咨询我有关Android DES加密的相关实现,简单的实现了一下,今天来总结一下. 其他几种加密方式: Android数据加密之Rsa加密 Android数据加密之Aes加密 ...

  9. AES对称加密算法原理

    原著:James McCaffrey 翻译:小刀人 原文出处:MSDN Magazine November 2003 (Encrypt It) 本文的代码下载:msdnmag200311AES.exe ...

随机推荐

  1. 在set中放入自定义类型

    这件事情的起因是在学习背包问题时突然想到了一种算法,分析了一下应该是n^2logn复杂度的,当然比dp慢.但是既然想到了就实现了下: #include<bits/stdc++.h> usi ...

  2. python字典保存至json文件

    import os import json class SaveJson(object): def save_file(self, path, item): # 先将字典对象转化为可写入文本的字符串 ...

  3. Arduino控制LED灯(开关控制)

    问题:当使用"digitalRead(BUT) == 1"控制LED灯时会出现"digitalWrite(LED, ledState);"的值出现跳动. 原因: ...

  4. less 经典范例 bootstrap 的 less 版本 常用 less 代码

    1. bootstrap 的 less 版本 2.less 文件分布 /*! * Bootstrap v3.3.7 (http://getbootstrap.com) * Copyright 2011 ...

  5. xml_dom解析之二

    dom解析(二) 通过代码创建一个xml文件 package xml4; import java.io.File; import javax.xml.parsers.DocumentBuilder; ...

  6. c++ 递归算法实现排列组合

    通过引用的方式来传值,具体的实现的方法如下 void pc(int m,int n,int &position,int (&a)[100]) { //如果运算得到那个数 if (pos ...

  7. java string split 怎么保留尾部空字符串

    # 不保留尾部空字符串 public class QQ { public static void main(String[] args) { String str = "a,b,c,d,&q ...

  8. 【CF 718C】fibonacci

    题意 给你一个长度为 \(n\) 的序列 \(a\),有 \(m\) 次操作,操作分两种 \(\text{1}\space \text{l}\space \text{r}\space \text{x} ...

  9. [易学易懂系列|rustlang语言|零基础|快速入门|(14)|Impls & Traits实现与特征]

    [易学易懂系列|rustlang语言|零基础|快速入门|(14)] 有意思的基础知识 Impls & Traits实现与特征 我之前说到的struct结构体,其实就类似于面向对象语言中的类cl ...

  10. Linux基本命令之Vim

    在vim,vi,gedit编辑器中显示行号:        在命令模式下:set nu 取消行号:set nonu 参照博客:https://www.cnblogs.com/Mr0wang/p/728 ...