首页 技术 正文
技术 2022年11月20日
0 收藏 738 点赞 3,671 浏览 5501 个字
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();
}
}}
相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:9,492
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,907
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,740
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,495
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:8,132
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:5,295