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. Java使用POI为Excel打水印,调整列宽并设置Excel只读(用户不可编辑)

    本文介绍在Java语言环境下,使用POI为Excel打水印的解决方案,具体的代码编写以及相关的注意事项. 需求描述: 要求通过系统下载的Excel都带上公司的水印,列宽调整为合适的宽度,并且设置为不可 ...

  2. C语言学习的第一章

    首先,学习编写程序要先知道什么是程序,我们为什么要写程序? 程序就是为了让计算机执行某些操作或解决某个问题而编写的一系列有序指令的集合.程序里有很多算法,算法是解决问题的具体方法和步骤,就像我们想要得 ...

  3. 创建一个JS函数,运用JS中arguments对象

    Javascript中有个内置的arguments对象. arguments对象包含了参数调用的参数数组. <p>查找最大的数.</p> <p id="demo ...

  4. [Git]09 如何为命令起外号

    Git并不会推断你输入的几个字符将会是哪条命令,不过如果想偷懒,少敲几个命令的字符,可以用 git config 为命令设置别名.来看看下面的例子: $ git config --global ali ...

  5. ssh整合时报出的异常及解决办法

    com.opensymphony.xwork2.inject.DependencyException: com.opensymphony.xwork2.inject.ContainerImpl$Mis ...

  6. Linux Shell——函数的使用

    文/一介书生,一枚码农. scripts are for lazy people. 函数是存在内存里的一组代码的命名的元素.函数创建于脚本运行环境之中,并且可以执行. 函数的语法结构为: functi ...

  7. add,update,list.jsp源码

    add:<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncod ...

  8. iOS开发tips-UINavigationBar的切换

    概述 在iOS系统中,如果控制器是以push方式进行管理的话,那么事实上多个控制器是共享的同一个导航栏.当然iOS系统的设计无可厚非,但是国内的应用经常会遇到很多个性的设计,就比如说A push到 B ...

  9. asp.net 母版-页脚制作

    1.母版创建流程略过. 2.创建母版页css:Site.css body { } .linkButton{ text-decoration:none; color:whitesmoke; } 3.母版 ...

  10. 将sublimeText添加到鼠标右键菜单栏

    将sublimeText添加到鼠标右键菜单栏主要是写一个注册表的文件,将这个注进去,首先你需要清楚你的sublimeText软件的安装路径,然后改一下下面这段代码就可以了 Windows Regist ...