AES加密解密算法---java
package com.BFGJ.AES; import java.util.Random;
import java.util.StringTokenizer; import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.PBEKeySpec;
import javax.crypto.spec.PBEParameterSpec;
import javax.crypto.spec.SecretKeySpec; /**
* PBEWithMD5AndDES算法加密解密
*
* @author Json
* @version
*/
public class EncryptImpl implements Encrypt
{
public EncryptImpl()
{
} private final static Encrypt encrypt= new EncryptImpl(); private final String password="e_f_codd"; private final String encoding="GBK"; /**
* 16进制字符数组
*/
private final static String[] hexDigits =
{
"0", "1", "2", "3", "4", "5", "6", "7",
"8", "9", "a", "b", "c", "d", "e", "f"};
/**
* AES密匙
*/
private final static byte[] keyByte =
{
0x11, 0x22, 0x4F, 0x58, (byte)0x88, 0x10, 0x40, 0x38,
0x28, 0x25, 0x79, 0x51, (byte)0xCB, (byte)0xDD, 0x55,
0x66}; //16字节的密钥,可以改变
/**
* 一位Byte到16进制字符串的转换
* @param b byte
* @return String
*/
private static String byteToHexString(byte b)
{
int n = b;
if(n < 0)
{
n = 256 + n;
}
int d1 = n / 16;
int d2 = n % 16;
return hexDigits[d1] + hexDigits[d2];
} /**
* Byte数组到16进制字符串的转换
* @param b byte[]
* @return String
*/
private static String byteArrayToHexString(byte[] b)
{
StringBuffer resultSb = new StringBuffer();
for(int i = 0; i < b.length; i++)
{
resultSb.append(byteToHexString(b[i]));
}
return resultSb.toString();
} /**
* 16进制字符串到Byte转换
* @param b String
* @return byte
*/
private static byte HexStringTobyte(String b)
{
int By = 0;
String b1 = b.substring(0, 1);
int b11 = -1;
String b2 = b.substring(1);
int b12 = -1;
for(int i = 0; i < 16; i++)
{
if(b1.equals(hexDigits[i]))
{
b11 = i;
}
}
for(int i = 0; i < 16; i++)
{
if(b2.equals(hexDigits[i]))
{
b12 = i;
}
}
By = b11 * 16 + b12;
if(By > 256)
{
By = By - 256;
}
return(byte)By;
} /**
* 16进制字符串到Byte数组的转换
* @param b String
* @return byte[]
*/
private static byte[] HexStringTobyteArray(String b)
{
byte[] r = new byte[b.length()/2];
for(int i = 0; i < b.length() / 2; i++)
{
r[i] = HexStringTobyte(b.substring(i * 2, i * 2 + 2));
}
return r;
} public static Encrypt getInstance()
{
return encrypt;
} /**
* 将加密文本进行解密;
*
* @param encryptText
* String
* @return String
*/
public String deCodeAES(String encryptText) throws Exception
{
//通过SecretKeySpec形成一个key
SecretKey key = new SecretKeySpec(keyByte, "AES");
//获得一个私鈅加密类Cipher,ECB是加密方式,PKCS5Padding是填充方法
Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
//使用私鈅解密
cipher.init(Cipher.DECRYPT_MODE, key);
byte[] NewCipherText = HexStringTobyteArray(encryptText);
byte[] newString = cipher.doFinal(NewCipherText);
return new String(newString, encoding); } /**
* 将传进来的明文以AES算法进行加密
*
* @param text
* String
* @return String
*/
public String enCodeAES(String text) throws Exception
{
byte[] OriByte = text.getBytes(encoding);
//通过SecretKeySpec形成一个key
SecretKey key = new SecretKeySpec(keyByte, "AES");
//获得一个私鈅加密类Cipher,ECB是加密方式,PKCS5Padding是填充方法
Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
//使用私鈅加密
cipher.init(Cipher.ENCRYPT_MODE, key);
byte[] OriCipherText = cipher.doFinal(OriByte);
String b = byteArrayToHexString(OriCipherText);
return b; //密码,转换成16进制
}
/**
* 将加密文本进行解密;
*
* @param encryptText
* String
* @return String
*/
public String decrypt(String encryptText) throws Exception
{
if (encryptText == null || encryptText.length() == 0) { return ""; }
PBEKeySpec pbks = new PBEKeySpec((password).toCharArray()); SecretKeyFactory skf = SecretKeyFactory.getInstance("PBEWithMD5AndDES");
SecretKey k = skf.generateSecret(pbks); StringTokenizer st = new StringTokenizer(hex2string(encryptText), " ");
int num = 0;
byte[] salt = new byte[8];
while (st.hasMoreTokens() && (num < 8))
{
salt[num] = (byte) (Integer.parseInt(st.nextToken()));
num++;
} int count = 0;
byte[] cbtemp = new byte[2000];
while (st.hasMoreTokens())
{
cbtemp[count] = (byte) (Integer.parseInt(st.nextToken()));
count++;
}
byte[] cb = new byte[count];
for (int i = 0; i < cb.length; i++)
{
cb[i] = cbtemp[i];
}
Cipher cp = Cipher.getInstance("PBEWithMD5AndDES");
PBEParameterSpec ps = new PBEParameterSpec(salt, 1000);
cp.init(Cipher.DECRYPT_MODE, k, ps); byte[] ptext = cp.doFinal(cb); return new String(ptext); } /**
* 将传进来的明文以PBEWithMD5AndDES算法进行加密
*
* @param text
* String
* @return String
*/
public String encrypt(String text) throws Exception
{
if (text == null || text.length() == 0) { return ""; } PBEKeySpec pbks = new PBEKeySpec(password.toCharArray());
SecretKeyFactory skf = SecretKeyFactory.getInstance("PBEWithMD5AndDES");
SecretKey k = skf.generateSecret(pbks);
byte[] salt = new byte[8];
Random r = new Random();
r.nextBytes(salt);
Cipher cp = Cipher.getInstance("PBEWithMD5AndDES");
PBEParameterSpec ps = new PBEParameterSpec(salt, 1000);
cp.init(Cipher.ENCRYPT_MODE, k, ps);
byte[] ptext = text.getBytes(encoding);
byte[] ctext = cp.doFinal(ptext); String result = "";
for (int i = 0; i < salt.length; i++)
{
result += salt[i] + " ";
} for (int i = 0; i < ctext.length; i++)
{
result += ctext[i] + " ";
}
return string2hex(result);
} /**
* 将16进制编码的字符串转换为带有空格分隔的字符串
* 比如:F89ADFCA2AE9719817D3575A9540600C ==> -8 -102 -33 -54 42 -23 113 -104 23 -45 87 90 -107 64 96 12
* @param s
* @return
*/
private String hex2string(String s)
{
String ret = "";
for (int i = 0; i < s.length() / 2; i++)
{
ret += String.valueOf(Integer.parseInt(s.substring(2 * i, 2 * i + 2), 16)) + " "; }
if (ret.endsWith(" "))
return ret.substring(0, ret.length() - 1);
return ret;
}
/**
* 将加密的带有空格分隔的字符转换为16进制编码的字符串.
* 比如:-8 -102 -33 -54 42 -23 113 -104 23 -45 87 90 -107 64 96 12 ==> F89ADFCA2AE9719817D3575A9540600C
* @param str
* @return
*/
private String string2hex(String str)
{
String[] split = str.split(" ");
byte[] b = new byte[split.length];
for (int i = 0; i < split.length; i++)
{
b[i] = Byte.parseByte(split[i]);
} String hs = "";
String stmp = "";
for (int n = 0; n < b.length; n++)
{
stmp = (Integer.toHexString(b[n] & 0XFF));
if (stmp.length() == 1)
hs = hs + "0" + stmp;
else hs = hs + stmp; }
return hs.toUpperCase();
} public static void main(String[] args)
{
try
{
EncryptImpl en = (EncryptImpl) EncryptImpl.getInstance();
//要加密的用户工号
String userid = "1";
//用户工号加密后的值
String e_userid = en.encrypt(userid);
System.out.println("encrypt-->"+e_userid);
System.out.println("enCodeAES-->"+en.enCodeAES(userid));
//对加密的用户工号进行解密
System.out.println(en.decrypt(e_userid).equals(userid)); }
catch (Exception e)
{
e.printStackTrace();
}
} }
AES加密解密算法---java的更多相关文章
- php与java通用AES加密解密算法
AES指高级加密标准(Advanced Encryption Standard),是当前最流行的一种密码算法,在web应用开发,特别是对外提供接口时经常会用到,下面是我整理的一套php与java通用的 ...
- Des加密解密算法java实现
package tech.fullink.eaglehorn.utils; import javax.crypto.Cipher; import javax.crypto.SecretKey; imp ...
- AES加密解密在JAVA和ANDROID下互通
<span style="font-family: Arial, Helvetica, sans-serif;">昨天外包安卓的那个人说AES的加解密结果不一样.于是百 ...
- android -------- AES加密解密算法
AES加密标准又称为高级加密标准Rijndael加密法,是美国国家标准技术研究所NIST旨在取代DES的21世纪的加密标准.AES的基本要求是,采用对称分组密码体制,密钥长度可以为128.192或25 ...
- C# AES加密解密算法
/// <summary> /// AES加密 /// </summary> /// <param name="encryptStr">明文&l ...
- AES加密解密算法
class Aes { /** * AES加密 * @param $data * @param $secret_key * @return string */ public static functi ...
- C与C#之间使用AES加密解密算法
目的:C语言写的客户端加密数据,数据发送到C#写的服务端,服务端解密. 保证C与C#之间加密解密AES的配置和模式一直. AES: AES是对称加密算法,关键点: 密钥长度,明文长度,密文长度 密钥长 ...
- C#, Java, PHP, Python和Javascript几种语言的AES加密解密实现[转载]
原文:http://outofmemory.cn/code-snippet/35524/AES-with-javascript-java-csharp-python-or-php c#里面的AES加密 ...
- 非对称技术栈实现AES加密解密
非对称技术栈实现AES加密解密 正如前面的一篇文章所述,https协议的SSL层是实现在传输层之上,应用层之下,也就是说在应用层上看到的请求还是明码的,对于某些场景下要求这些http请求参数是非可读的 ...
随机推荐
- java获得路径的多种方式
本文讲解java语言中获得运行时路径的多种方式,包括java项目.java web项目.jar.weblogic等多种场景. 一.this.getClass().getClassLoader().ge ...
- php操作memcache缓存基本方法
memcache 是一个高效的分布式的内存对象缓存系统,他可以支持把php的各种数据(数组,对象,基本数据类型)放在它管理的内存中 1.代码使用 <?php //连接 $mem = new Me ...
- php中print_r、var_dump和var_export几个函数的用法区别
php中print_r.var_dump和var_export几个函数的用法区别
- 微坑---微信小程序ios上时间字符串转换为时间戳时,在开发工具上和安卓手机上运行成功
给定一个时间字符串 var time="2017-02-27 16:42:53" js有三种转换为时间戳的方法:1.var timestamp = Date.parse(time ...
- 安装配置sentry服务
环境 系统环境:Centos6.7 Hadoop版本:CDH5.10 jdk版本:jdk7 注:本文并未集成kerberos组件 安装Sentry Server 选择安装hive的节点进行安装测试: ...
- Andriod相机开发关于startPreview Failed的错误的特别记录(重要)
年前,自己做的Android相机嵌入到一款火爆的游戏中去了,经过几次的修改升级,相机运行上报的错误也越来越少, 但是,前几天刚上线的最新相机,却老是在Android 2.3机器上出现startPrev ...
- js事件触发(一)
今日和一位前端童鞋聊了下js触发事件的两种形式: 第一种在jsp/vm上做类似onClick=functionName()的触发:另一种是在js文件中增加对应节点的监听事件触发.前者页面掺杂了js的内 ...
- redis集群添加删除节点
Redis3.0集群添加节点 1:首先把需要添加的节点启动 cd /usr/local/cluster/ mkdir 7006 cp /usr/local/cluster/redis.conf /u ...
- NSA永恒之蓝病毒,如何通过360工具修复?
简介: NSA武器库的公开被称为是网络世界"核弹危机",其中有十款影响Windows个人用户的黑客工具,包括永恒之蓝.永恒王者.永恒浪漫.永恒协作.翡翠纤维.古怪地鼠.爱斯基摩卷. ...
- ng-checked选择和点击增加dom
1.需求 在添加页面实现一个checkbox的选择,然后在详情页面展示时,会自动选上之前被选中的. 2.添加页面 看官最好将这个代码复制过去看看效果. <!DOCTYPE html>& ...