package com.example.yang.myapplication;
import java.security.SecureRandom;
import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESKeySpec;
import static com.example.yang.myapplication.MyUtil.bytesToHexString;
import static com.example.yang.myapplication.MyUtil.hexStringToBytes;
import static java.lang.System.arraycopy;
/**
* DES 加密算法 DES和3DES ECB模式的加解密
* @author yangyongzhen
*
*/
public class DesUtil {
public final static String DES = "DES";
/**
* 加密
* @param data byte[]
* @param key byte[]
* @return byte[]
*/
public static byte[] DES_encrypt(byte[] data, byte[] key) {
try{
// 生成一个可信任的随机数源
SecureRandom sr = new SecureRandom();
// 从原始密钥数据创建DESKeySpec对象
DESKeySpec dks = new DESKeySpec(key);
// 创建一个密钥工厂,然后用它把DESKeySpec转换成SecretKey对象
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(DES);
SecretKey securekey = keyFactory.generateSecret(dks);
// Cipher对象实际完成加密操作
Cipher cipher = Cipher.getInstance("DES/ECB/NoPadding");
// 用密钥初始化Cipher对象
cipher.init(Cipher.ENCRYPT_MODE, securekey, sr);
return cipher.doFinal(data);
}catch(Throwable e){
e.printStackTrace();
}
return null;
}
/**
* 解密
* @param data byte[]
* @param key byte[]
* @return byte[]
*/
public static byte[] DES_decrypt(byte[] data, byte[] key) {
try{
// 生成一个可信任的随机数源
SecureRandom sr = new SecureRandom();
// 从原始密钥数据创建DESKeySpec对象
DESKeySpec dks = new DESKeySpec(key);
// 创建一个密钥工厂,然后用它把DESKeySpec转换成SecretKey对象
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(DES);
SecretKey securekey = keyFactory.generateSecret(dks);
// Cipher对象实际完成解密操作
Cipher cipher = Cipher.getInstance("DES/ECB/NoPadding");
// 用密钥初始化Cipher对象
cipher.init(Cipher.DECRYPT_MODE, securekey, sr);
return cipher.doFinal(data);
}catch(Throwable e){
e.printStackTrace();
}
return null;
}
public static byte[] DES_encrypt_3(byte[] datasource, byte[] key){
if ((key.length!= 16) || ((datasource.length%8 )!= 0)){
return null;
}
byte[] Lkey = new byte[8];
byte[] Rkey = new byte[8];
arraycopy(key,0,Lkey,0,8);
arraycopy(key,8,Rkey,0,8);
byte[] outdata,tmpdata;
outdata = DES_encrypt(datasource,Lkey);//加
tmpdata = DES_decrypt(outdata,Rkey);//解
outdata = DES_encrypt(tmpdata,Lkey);//加
return outdata;
}
public static byte[] DES_decrypt_3(byte[] datasource, byte[] key){
if ((key.length!= 16) || ((datasource.length%8 )!= 0)) {
return null;
}
byte[] Lkey = new byte[8];
byte[] Rkey = new byte[8];
arraycopy(key,0,Lkey,0,8);
arraycopy(key,8,Rkey,0,8);
byte[] outdata,tmpdata;
outdata = DES_decrypt(datasource,Lkey);//解
tmpdata = DES_encrypt(outdata,Rkey);//加
outdata = DES_decrypt(tmpdata,Lkey);//解
return outdata;
}
public static void main(String[] args) {
String strkey = "258FB0Ab70D025CDB99DF2C4D302D646";
String K1 = strkey.substring(0, strkey.length() / 2);
String K2 = strkey.substring(strkey.length() / 2);
String strdata = "46F161A743497B32EAC760DF5EA57DF5";
String D1 = strdata.substring(0, strdata.length() / 2);
String D2 = strdata.substring(strdata.length() / 2);
byte[] bt;
String out;
bt = DES_decrypt(hexStringToBytes(D1),hexStringToBytes(K1));
out = bytesToHexString(bt);
System.out.println("discryption结果为:"+out);
bt = DES_encrypt(hexStringToBytes(D1),hexStringToBytes(K1));
out = bytesToHexString(bt);
System.out.println("encryption结果为:"+out);
bt = DES_encrypt_3(hexStringToBytes(strdata),hexStringToBytes(strkey));
out = bytesToHexString(bt);
System.out.println("encryption_3结果为:"+out);
bt = DES_decrypt_3(hexStringToBytes(strdata),hexStringToBytes(strkey));
out = bytesToHexString(bt);
System.out.println("decryption_3结果为:"+out);
}
}