使用3DES 加密/解密
在java中3DES密钥都是24字节的,当使用16字节密钥时24字节密钥后8位为16自己密钥补位获得的。
例如 16字节密钥 8字节字节1 8字节2
24字节密钥 8字字节1 8字节2 8字节1
场景为:
用测试密钥值:“00000000000000000000000000000000” 加密数据 0000010000030200 加密后F35F77221C054EF0
package com.easylife.support.iccard.common;
/*
字符串 DESede(3DES) 加密
*/
import java.security.*;
import java.util.ArrayList;
import java.util.List;
import javax.crypto.*;
import javax.crypto.spec.SecretKeySpec;
public class ThreeDes {
private static final String Algorithm = "DESede"; // 定义 加密算法,可用
// DES,DESede,Blowfish
private static final byte[] keyBytes = { 0x00, 0x00, 0x00, 0x00,
(byte) 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, (byte) 0x00,
(byte) 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, (byte) 0x00, 0x00, 0x00,
0x00, (byte) 0x00 }; // 24字节的密钥
// keybyte为加密密钥,长度为24字节
// src为被加密的数据缓冲区(源)
public static byte[] encryptMode(byte[] src) {
try {
// 生成密钥
SecretKey deskey = new SecretKeySpec(keyBytes, Algorithm);
// 加密
Cipher c1 = Cipher.getInstance(Algorithm);
c1.init(Cipher.ENCRYPT_MODE, deskey);
return c1.doFinal(src);
} catch (java.security.NoSuchAlgorithmException e1) {
e1.printStackTrace();
} catch (javax.crypto.NoSuchPaddingException e2) {
e2.printStackTrace();
} catch (java.lang.Exception e3) {
e3.printStackTrace();
}
return null;
}
// keybyte为加密密钥,长度为24字节
// src为加密后的缓冲区
public static byte[] decryptMode(byte[] src) {
try {
// 生成密钥
SecretKey deskey = new SecretKeySpec(keyBytes, Algorithm);
// 解密
Cipher c1 = Cipher.getInstance(Algorithm);
c1.init(Cipher.DECRYPT_MODE, deskey);
return c1.doFinal(src);
} catch (java.security.NoSuchAlgorithmException e1) {
e1.printStackTrace();
} catch (javax.crypto.NoSuchPaddingException e2) {
e2.printStackTrace();
} catch (java.lang.Exception e3) {
e3.printStackTrace();
}
return null;
}
// 转换成十六进制字符串
public static String byte2hex(byte[] b) {
String hs = "";
String stmp = "";
for (int n = 0; n < b.length; n++) {
stmp = (java.lang.Integer.toHexString(b[n] & 0XFF));
if (stmp.length() == 1)
hs = hs + "0" + stmp;
else
hs = hs + stmp;
if (n < b.length - 1)
hs = hs + ":";
}
return hs.toUpperCase();
}
/**
* 字符串3DES加密
*
* @param str
* @return 加密的字符串
*/
public static String jiami(String str) {
// 获取字符串
List strs = new ArrayList();
for (int i = 1; i <= str.length() / 2; i++) {
strs.add(str.substring((i - 1) * 2, i * 2));
}
byte[] l = new byte[8];
for (int i = 0; i < strs.size(); i++) {
int aaa = MZCardCommon.strToInt(strs.get(i).toUpperCase());
l[i] = (byte) aaa;
}
byte[] encodedl = encryptMode(l);
String encodedS = byte2hex(encodedl);
// System.out.println("加密后的字符串:" + encodedS);
encodedS = MZCardCommon.subData(encodedS);
// System.out.println("加密后处理的字符串:" + encodedS);
return encodedS;
}
/**
* 字符串3DES解密
*
* @param str
* @return 解密字符串
*/
public static String jiemi(String str) {
// 获取字符串
List strs = new ArrayList();
for (int i = 1; i <= str.length() / 2; i++) {
strs.add(str.substring((i - 1) * 2, i * 2));
}
byte[] b1 = new byte[8];
for (int i = 0; i < strs.size(); i++) {
int aaa = MZCardCommon.strToInt(strs.get(i).toUpperCase());
b1[i] = (byte) aaa;
}
// byte[] encodedl = encryptMode(MZCardCommon.byteMerger(b1, b2));
byte[] encodedl = encryptMode(b1);
String encodedS = byte2hex(encodedl);
// System.out.println("解密后的字符串:" + encodedS);
encodedS = MZCardCommon.subData(encodedS);
// System.out.println("解密后处理的字符串:" + encodedS);
return encodedS;
}
public static void main(String[] args) {
// 添加新安全算法,如果用JCE就要把它添加进去
// Security.addProvider(new com.sun.crypto.provider.SunJCE());
//
// final byte[] keyBytes = { 0x00, 0x00, 0x00, 0x00, (byte) 0x00, 0x00,
// 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, (byte) 0x00, (byte) 0x00,
// 0x00, 0x00, 0x00, 0x00, 0x00, (byte) 0x00, 0x00, 0x00, 0x00,
// (byte) 0x00 }; // 24字节的密钥
// String szSrc = "0000010000030200";
//
// System.out.println("加密前的字符串:" + szSrc);
// byte[] a = { 0x00, 0x00, 0x01, 0x00, (byte) 0x00, 0x03, 0x02, 0x00 };
// byte[] aa = { 0, 0, 1, 0, 0, 3, 2, 0 };
// // 1160010098968120
// byte[] b = { 0x11, 0x60, 0x01, 0x00, (byte) 0x98, (byte) 0x96,
// (byte) 0x81, 0x20 };
// byte[] bb = { 17, 96, 1, 0, (byte) 152, (byte) 150, (byte) 129, 32 };
// byte[] encodeda = encryptMode(a);
// byte[] encodedaa = encryptMode(aa);
// System.out.println("16加密后的字符串:" + byte2hex(encodeda));
// System.out.println("10加密后的字符串:" + byte2hex(encodedaa));
// byte[] b1 = { (byte) 0xF3, 0x5F, 0x77, 0x22, (byte) 0x1C, 0x05, 0x4E,
// (byte) 0xF0};
// byte[] b2={0x7E, 0x42 ,0x28,0x22 ,0x77 ,0x36 ,0x66 ,(byte) 0xC0};
//
// byte[] srcBytes = decryptMode(MZCardCommon.byteMerger(b1, b2));
// System.out.println("解密后的字符串:" + byte2hex(srcBytes));
System.out.println("*************加密 开始**************");
System.out.println(jiami("0000010000030200"));
System.out.println(jiami("1160010098968120"));
System.out.println(jiami("1002088000000000"));
System.out.println("*************加密 结束**************");
System.out.println("*************解密 开始**************");
System.out.println(jiemi("F35F77221C054EF0"));
System.out.println(jiemi("172BF0FD90E194D8"));
System.out.println(jiemi("D59B5CE930D9723C"));
System.out.println("*************解密 结束**************");
}
}