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请求参数是非可读的 ...
随机推荐
- JavaScript获取html元素的实际宽度和高度
一.JavaScript获取html元素宽高 1.宽高都写在样式表里,就比如#div1{width:120px;}.这中情况通过#div1.style.width拿不到宽度,而通过#div1.offs ...
- linux 基础(1)
第一章 Linux 基础知识(一) 一.硬件介绍: 由一条总线把CPU.内存和I/O设备串联起来并与其他设备进行通信.CPU负责运算,内存用于储存临时变量,硬盘用于储存数据.1.1处理器CPU 从内存 ...
- Qtp自动测试工具(案例学习)
♣Qtp是什么? ♣测试用例网站 ♦注册与登录 ♦测试脚本 ◊录制/执行测试脚本 ◊分析录制的测试脚本 ◊执行.查看测试脚本 ♦建立检查点 ...
- 今天打补丁出问题了,害得我组长被扣了1k奖金。
今天是第三次给mxdw打补丁和打包,外加公司高管说有一个东西必须要今天之内搞定外放. 我当时问策划为什么这么着急?策划说大佬决定的(这种做事方式真的很不习惯).我等屁民加班加点的搞事情,把功能搞出去了 ...
- 0基础搭建Hadoop大数据处理-环境
由于Hadoop需要运行在Linux环境中,而且是分布式的,因此个人学习只能装虚拟机,本文都以VMware Workstation为准,安装CentOS7,具体的安装此处不作过多介绍,只作需要用到的知 ...
- 设计模式浅谈----策略模式(c#及java实现)
一.何为策略模式 策略模式是行为型模式的一种,主要用于需要使用不同的算法来处理不同的数据对象时使用,是一种可以在运行时选择算法的设计模式.也称为政策模式. 主要解决:在有多种算法相似的情况下,使用 i ...
- 导入csv文件到数据库
csv:逗号分隔值(Comma-Separated Values,CSV,有时也称为字符分隔值,因为分隔字符也可以不是逗号),其文件以纯文本形式存储表格数据(数字和文本).纯文本意味着该文件是一个字符 ...
- 获取JUnit的执行结果
junit执行之后会有一个结果展示,下面就来看一下怎么获取这些结果并将其存储为一个对象 junit代码如下: package test; import org.junit.After; import ...
- Java Regex match IP address
Reference: [1] https://www.mkyong.com/regular-expressions/how-to-validate-ip-address-with-regular-ex ...
- UIWebView 跳过HTTPS证书认证
UIWebView跳过证书认证 在UIWebView中加入如下代码即可(Error Domain=NSURLErrorDomain Code=-1202) //跳过证书验证 @interface NS ...