此类主要用于加密与解密,采用128位ECB模式,PKCS5Padding填充补位。

可使用方法为加密返回二进制encryptBin(content, key)、加密返回十六进制encryptHex(content, key)、二进制内容解密decryptBin(content, key)、十六进制内容解密decryptHex(content, key)。

content是需要加密的字符串,key是密钥,随意一个字符串。

 package com.test;

 import java.io.UnsupportedEncodingException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom; import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.KeyGenerator;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec; import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory; public class AESCode { private static final String algorithm = "AES";
private static final String transformation = "AES/ECB/PKCS5Padding";
private static final String charset = "utf-8"; private static final Log _log = LogFactory.getLog(AESCode.class); /**
* 获取key 填充密匙 获取加密的密匙数据
*
* @paramString key
* @return byte[] enCodeFormat;
* @author panjianghong 2016-8-29
* */
private static byte[] getEnCodeFormat(String key){ try {
KeyGenerator kgen = KeyGenerator.getInstance("AES");
kgen.init(128, new SecureRandom(key.getBytes()));
SecretKey secretKey = kgen.generateKey();
byte[] enCodeFormat = secretKey.getEncoded();
return enCodeFormat;
} catch (NoSuchAlgorithmException e) {
_log.error("获取密匙数据失败!");
}
return null;
} /**
* 获取加密数据的二进制字符串数据
*
* @param content
* @param enCodeFormat
* @return String
* @author panjianghong 2016-8-29
* */
public static String encryptBin(String content, String key){ try {
byte[] byteConten = encrypt(content, key);
return byte2BinString(byteConten);
} catch (Exception e) {
_log.error("获取二进制加密数据失败!");
}
return null;
} /**
* 获取加密数据的十六进制字符串数据
*
* @param content
* @param enCodeFormat
* @return String
* @author panjianghong 2016-8-29
* */
public static String encryptHex(String content, String key){ try {
byte[] byteConten = encrypt(content, key);
return byte2HexString(byteConten);
} catch (Exception e) {
_log.error("获取十六进制加密数据失败!");
}
return null;
} /**
* 获取文件的加密数据
* 返回加密数据的字节数组 byte[]
*
* @param content
* @param enCodeFormat
* @return byte[] byteResoult
* @author panjianghong 2016-8-29
* */
private static byte[] encrypt(String content, String key){ try {
SecretKeySpec secretyKey = new SecretKeySpec(getEnCodeFormat(key), algorithm);
Cipher cipher = Cipher.getInstance(transformation);
byte[] byteContent = content.getBytes(charset);
cipher.init(Cipher.ENCRYPT_MODE, secretyKey);
byte[] byteResoult = cipher.doFinal(byteContent);
return byteResoult;
} catch (InvalidKeyException e) {
_log.error("获取加密数据的字节数组失败!");
} catch (NoSuchAlgorithmException e) {
_log.error("获取加密数据的字节数组失败!");
} catch (NoSuchPaddingException e) {
_log.error("获取加密数据的字节数组失败!");
} catch (UnsupportedEncodingException e) {
_log.error("获取加密数据的字节数组失败!");
} catch (IllegalBlockSizeException e) {
_log.error("获取加密数据的字节数组失败!");
} catch (BadPaddingException e) {
_log.error("获取加密数据的字节数组失败!");
} return null;
} /**
* 以二进制字符串数据进行解密
*
* @param content
* @param enCodeFormat
* @return String
* @author panjianghong 2016-8-29
* */ public static String decryptBin(String binContent, String key){ try {
SecretKeySpec secretyKey = new SecretKeySpec(getEnCodeFormat(key), algorithm);
Cipher cipher = Cipher.getInstance(transformation);
cipher.init(Cipher.DECRYPT_MODE, secretyKey);
byte[] byteResoult = cipher.doFinal(binString2Byte(binContent));
try {
return new String(byteResoult,"utf-8");
} catch (UnsupportedEncodingException e) {
_log.error("解密二进制数据失败!");
return null;
}
} catch (InvalidKeyException e) {
_log.error("解密二进制数据失败!");
} catch (NoSuchAlgorithmException e) {
_log.error("解密二进制数据失败!");
} catch (NoSuchPaddingException e) {
_log.error("解密二进制数据失败!");
} catch (IllegalBlockSizeException e) {
_log.error("解密二进制数据失败!");
} catch (BadPaddingException e) {
_log.error("解密二进制数据失败!");
} return null;
} /**
* 以十六进制字符串数据进行解密
*
* @param content
* @param enCodeFormat
* @return String
* @author panjianghong 2016-8-29
* */
public static String decryptHex(String binContent, String key){ try {
SecretKeySpec secretyKey = new SecretKeySpec(getEnCodeFormat(key), algorithm);
Cipher cipher = Cipher.getInstance(transformation);
cipher.init(Cipher.DECRYPT_MODE, secretyKey);
byte[] byteResoult = cipher.doFinal(hexString2Byte(binContent));
try {
return new String(byteResoult,"utf-8");
} catch (UnsupportedEncodingException e) {
_log.error("解密十六进制数据失败!");
return null;
}
} catch (InvalidKeyException e) {
_log.error("解密十六进制数据失败!");
} catch (NoSuchAlgorithmException e) {
_log.error("解密十六进制数据失败!");
} catch (NoSuchPaddingException e) {
_log.error("解密十六进制数据失败!");
} catch (IllegalBlockSizeException e) {
_log.error("解密十六进制数据失败!");
} catch (BadPaddingException e) {
_log.error("解密十六进制数据失败!");
} return null;
} /**
* 字节数组转化成二进制数
* @param content
* @return string
* @author panjianghong 2016-8-29
* */
private static String byte2BinString(byte[] content){
if(null == content){
_log.error("需要转换的参数为空!");
return null;
} return hexString2BinString(byte2HexString(content));
} /**
* 字节数组转化成十六进制数的小写形式
* @param content
* @return string
* @author panjianghong 2016-8-29
* */
private static String byte2HexString(byte[] content){
if(null == content){
_log.error("需要转换的参数为空!");
return null;
} StringBuffer sb = new StringBuffer();
for (int i = 0; i < content.length; i++) {
String hex = Integer.toHexString(content[i] & 0xFF);
if (hex.length() == 1) {
hex = '0' + hex;
}
sb.append(hex.toLowerCase());
} return sb.toString();
} /**
* 十六进制数转化成二进制数
* @param content
* @return string
* @author panjianghong 2016-8-29
* */
private static String hexString2BinString(String content){ if (null == content || content.length() % 2 != 0) {
_log.error("需要转换的参数为空或者参数长度不是2的倍数!");
return null;
} StringBuffer bString = new StringBuffer();
StringBuffer tmp = new StringBuffer();
for (int i = 0; i < content.length(); i++)
{
tmp.append("0000").append(Integer.toBinaryString(Integer.parseInt(content.substring(i, i + 1), 16)));
bString.append(tmp.toString().substring(tmp.toString().length() - 4));
tmp.delete(0, tmp.toString().length());
}
return bString.toString();
}
/**
* 二进制数转化成十六进制数
* @param content
* @return string
* @author panjianghong 2016-8-29
* */
private static String BinString2hexString(String content){ if (null == content || content.equals("") || content.length() % 8 != 0){
_log.error("需要转换的参数为空或者参数长度不是8的倍数!");
return null;
} StringBuffer tmp = new StringBuffer();
int iTmp = 0;
for (int i = 0; i < content.length(); i += 4)
{
iTmp = 0;
for (int j = 0; j < 4; j++)
{
iTmp += Integer.parseInt(content.substring(i + j, i + j + 1)) << (4 - j - 1);
}
tmp.append(Integer.toHexString(iTmp));
}
return tmp.toString();
} /**
* 16进制数转化成字节数组
* @param content
* @return string
* @author panjianghong 2016-8-29
* */
private static byte[] hexString2Byte(String content){
if (content.length() < 1){
_log.error("需要转换的参数为空或者参数长度<1!");
return null;
} byte[] byteRresult = new byte[content.length() / 2];
for (int i = 0; i < content.length() / 2; i++) {
int high = Integer.parseInt(content.substring(i * 2, i * 2 + 1), 16);
int low = Integer.parseInt(content.substring(i * 2 + 1, i * 2 + 2), 16);
byteRresult[i] = (byte) (high * 16 + low);
}
return byteRresult;
} /**
* 二进制数转化成字节数组
* @param content
* @return string
* @author panjianghong 2016-8-29
* */
private static byte[] binString2Byte(String content){
if (content.length() < 1){
_log.error("需要转换的参数为空或者参数长度<1!");
return null;
} return hexString2Byte(BinString2hexString(content));
} }

自写AES加密解密工具类的更多相关文章

  1. AES加密解密工具类封装(AESUtil)

    package club.codeapes.common.utils; import org.springframework.util.Base64Utils; import javax.crypto ...

  2. Java中的AES加解密工具类:AESUtils

    本人手写已测试,大家可以参考使用 package com.mirana.frame.utils.encrypt; import com.mirana.frame.constants.SysConsta ...

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

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

  4. Base64加密解密工具类

    使用Apache commons codec类Base64进行加密解密 maven依赖 <dependency> <groupId>commons-codec</grou ...

  5. Java AES加密解密工具 -- GUI 、在线传输文件

    原理 对于任意长度的明文,AES首先对其进行分组,每组的长度为128位.分组之后将分别对每个128位的明文分组进行加密. 对于每个128位长度的明文分组的加密过程如下:     (1)将128位AES ...

  6. .Net(c#)加密解密工具类:

    /// <summary> /// .Net加密解密帮助类 /// </summary> public class NetCryptoHelper { #region des实 ...

  7. java加密解密工具类

    package com.founder.mrp.util; import java.nio.charset.StandardCharsets; import java.security.Key; im ...

  8. 加密解密工具类(Java,DES)

    一个Java版的DES加密工具类,能够用来进行网络传输数据加密,保存password的时候进行加密. import java.security.Key; import java.security.sp ...

  9. java 加密解密工具类(实用!!!)

    最近发现了一个加密解密的好例子,很方便使用,可以作为平时开发的工具集,记录一下. package com.sh.springboottdemo2.util; import com.sun.org.ap ...

随机推荐

  1. Java Timer触发定时器

    XML: <!-- Java Timer定时 --> <!-- <bean id="shortUrlTask" class=" com.sprin ...

  2. iOS 面试题 3

    0.请写出代码,用blocks来取代上例中的protocol,并比较两种方法的优势.实际应用部分?请写出代码,用blocks取代协议或回调方法 声明: #import <Foundation/F ...

  3. 评论PK投票功能的手机版

    ajax投票.点赞.回复,投票后自动转到查看投票结果,投票结果进度条动画显示 地址:http://files.cnblogs.com/files/macliu/hyw_wap.rar 效果图: 首页:

  4. 二维码识别:Halcon与C++中多字节环境下的字节编码格式设置和转换

    Halcon环境下可通过设置set_system(‘filename_encoding’, ‘utf8’),可以将二维码的识别结果解析出汉字. VS环境下则需要将utf8转换成gbk格式.代码如下: ...

  5. 十大面试问题解惑,秒杀一切HR、技术面试

    最能体现求职者能力的就是面试,能不能拿到Offer,取决于你面试时的表现,只有有准备才能在面试过程中游刃有余.小编收集了10个面试官最爱提的问题,虽然题目千变万化,但是万变不离其宗,只要掌握了答题的技 ...

  6. TCP连接探测中的Keepalive和心跳包. 关键字: tcp keepalive, 心跳, 保活

    1. TCP保活的必要性 1) 很多防火墙等对于空闲socket自动关闭 2) 对于非正常断开, 服务器并不能检测到. 为了回收资源, 必须提供一种检测机制. 2. 导致TCP断连的因素 如果网络正常 ...

  7. Kth Largest Element in an Array 解答

    Question Find the kth largest element in an unsorted array. Note that it is the kth largest element ...

  8. 微软GitHub组织

    微软aspnet团队的GitHub 微软dotnet团队的GitHub 微软的GitHub 微软云团队的GitHub 微软在GitHub的开源底部有其它组织

  9. Ajax跨域访问解决办法

    方法1. jsonp实现ajax跨域访问示例 jsp代码: <body> <input type="button" onclick="testJsonp ...

  10. Ehcache RIM

    Ehcache不仅支持基本的内存缓存,还支持多种方式将本地内存中的缓存同步到其他使用Ehcache的服务器中,形成集群.如下图所示:   Ehcache支持多种集群方式,下面以RMI通信方式为例,来具 ...