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的更多相关文章

  1. php与java通用AES加密解密算法

    AES指高级加密标准(Advanced Encryption Standard),是当前最流行的一种密码算法,在web应用开发,特别是对外提供接口时经常会用到,下面是我整理的一套php与java通用的 ...

  2. Des加密解密算法java实现

    package tech.fullink.eaglehorn.utils; import javax.crypto.Cipher; import javax.crypto.SecretKey; imp ...

  3. AES加密解密在JAVA和ANDROID下互通

    <span style="font-family: Arial, Helvetica, sans-serif;">昨天外包安卓的那个人说AES的加解密结果不一样.于是百 ...

  4. android -------- AES加密解密算法

    AES加密标准又称为高级加密标准Rijndael加密法,是美国国家标准技术研究所NIST旨在取代DES的21世纪的加密标准.AES的基本要求是,采用对称分组密码体制,密钥长度可以为128.192或25 ...

  5. C# AES加密解密算法

    /// <summary> /// AES加密 /// </summary> /// <param name="encryptStr">明文&l ...

  6. AES加密解密算法

    class Aes { /** * AES加密 * @param $data * @param $secret_key * @return string */ public static functi ...

  7. C与C#之间使用AES加密解密算法

    目的:C语言写的客户端加密数据,数据发送到C#写的服务端,服务端解密. 保证C与C#之间加密解密AES的配置和模式一直. AES: AES是对称加密算法,关键点: 密钥长度,明文长度,密文长度 密钥长 ...

  8. C#, Java, PHP, Python和Javascript几种语言的AES加密解密实现[转载]

    原文:http://outofmemory.cn/code-snippet/35524/AES-with-javascript-java-csharp-python-or-php c#里面的AES加密 ...

  9. 非对称技术栈实现AES加密解密

    非对称技术栈实现AES加密解密 正如前面的一篇文章所述,https协议的SSL层是实现在传输层之上,应用层之下,也就是说在应用层上看到的请求还是明码的,对于某些场景下要求这些http请求参数是非可读的 ...

随机推荐

  1. 仿QQ空间动态界面分享

    先看看效果: 用极少的代码实现了 动态详情 及 二级评论 的 数据获取与处理 和 UI显示与交互,并且高解耦.高复用.高灵活. 动态列表界面MomentListFragment支持 下拉刷新与上拉加载 ...

  2. (知识点)JavaScript闭包

    下面是我对闭包的理解:(把他们整理出来,整理的过程也是在梳理) 1.首先,在理解闭包之前: 我们首先应该清楚下作用域和作用域链 作用域:每个函数定义时创建时自己的环境即作用域 作用域链:函数内可访问自 ...

  3. 蓝桥杯-有理数类-java

    /* (程序头部注释开始) * 程序的版权和版本声明部分 * Copyright (c) 2016, 广州科技贸易职业学院信息工程系学生 * All rights reserved. * 文件名称: ...

  4. Android ViewPager动画切换

    使用方法 setPageTransformer 例如: ViewPager.setPageTransformer(true, new ZoomOutPageTransformer()) package ...

  5. 如何在Linux实现自动运行程序

    1.开机启动时 Linux加载后, 它将初始化硬件和设备驱动, 然后运行第一个进程init. init根据配置文件继续引导过程,启动其它进程.通常情况下,修改放置在 /etc/rc或 /etc/rc. ...

  6. OC点语法介绍和使用以及@property关键字

    使用"点语法" Person *p =[Person new]; //点语法 //对象.属性名 //注意,此时 (p.age)并不是直接方法实例对象 //而是xcode可能到点语法 ...

  7. Docker- 创建支持SSH服务的容器镜像

    示例 - CentOS7 [root@CentOS-7 ~]# cat ssh-centos7 FROM centos:centos7 MAINTAINER anliven "anliven ...

  8. 简易版DES加密和解密详解

    在DES密码里,是如何进行加密和解密的呢?这里采用DES的简易版来进行说明. 二进制数据的变换 由于不仅仅是DES密码,在其它的现代密码中也应用了二进制数据,所以无论是文章还是数字,都需要将明文变换为 ...

  9. poj2253 Frogger Dijkstra变形

    题目链接:http://poj.org/problem?id=2253 就是求所有路径的最大边权值的最小值 处理时每次找出距离当前的已选的节点的最短距离,然后更新每个未选节点的值 代码: #inclu ...

  10. hdu698 Just a Hook 线段树-成段更新

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1698 很简单的一个线段树的题目,每次更新采用lazy思想,这里我采用了增加一个变量z,z不等于0时其绝 ...