java 3des双倍长 有参考的代码给提供下吗?
发布网友
发布时间:2022-04-24 16:57
我来回答
共1个回答
热心网友
时间:2023-10-24 05:19
虽然不知道你说的双倍长是什么意思,这是我自己用的3des工具类
密文是把byte数组转化成16进制字符串,一个byte对应两个数字,不知道是不是你说的双倍
/**
* DESede(3DES)加解密整理--pangjs 2013.12.04
*/
public class DESede {
/** 定义加密算法。 可用 DES,DESede,Blowfish*/
private static final String Algorithm = "DESede";
private static final char[] hex = "0123456789abcdef".toCharArray();
public static final String keyStr = StringUtil.DeviceKey;
/**必须是24位*/
private static byte[] key = strToBytes(keyStr);
/**
* 加密,参数有问题返回null
* @param src 明文
* @return 16进制字符串密文
*/
public static String encrypt(String src) {
if(src == null){
return null;
}
try {
byte[] origin = src.getBytes("utf-8");
return bytesToStr(des3Init(Cipher.ENCRYPT_MODE, origin));
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
/**
* 解密,参数有问题返回null
* @param cipher (16进制字符串密文)
* @return 明文
*/
public static String decrypt(String cipher) {
if(cipher == null){
return null;
}
try {
byte[] origin = des3Init(Cipher.DECRYPT_MODE, strToBytes(cipher));
return new String(origin, "utf-8");
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
/**
* 3des加解密
* @param mode Cipher.ENCRYPT_MODE | Cipher.DECRYPT_MODE
* @param input byte[]
* @return byte[]
* @throws Exception NoSuchAlgorithm,InvalidKey,NoSuchPadding,BadPadding,IllegalBlockSize
*/
private static byte[] des3Init(int mode, byte[] input) throws Exception{
// 根据【给定的字节数组key】和【 指定算法DESede(3des)】构造一个密钥
SecretKey secretKey = new SecretKeySpec(key, Algorithm);
// 加解密
Cipher cipher = Cipher.getInstance(Algorithm);
cipher.init(mode, secretKey);
return cipher.doFinal(input);
}
/**
* byte数组转换为16进制字符串
* @param b [1, 33, 79, 88, -120]
* @return "01214f5888"
*/
private static String bytesToStr(byte[] b){
StringBuilder s = new StringBuilder();
for (int i = 0; i < b.length; i++) {
s.append(hex[(b[i]>>>4)&0xf]);
s.append(hex[b[i]&0xf]);
}
return s.toString();
}
/**
* 16进制字符串转换为相应的byte数组
* @param src "81214f5888"
* @return [-127, 33, 79, 88, -120]
*/
private static byte[] strToBytes(String src){
char[] c = src.toCharArray();
byte[] b = new byte[c.length/2];
for (int i = 0; i < b.length; i++) {
b[i] = (byte)((Character.digit((int)c[2*i], 16)<<4)
| Character.digit((int)c[2*i+1], 16));
}
return b;
}
}