参考文章:crypto-js 3DES 加解密( http://www.appblog.cn/2019/06/30/%E5%89%8D%E7%AB%AF%20crypto-js%203DES%20%E5%8A%A0%E8%A7%A3%E5%AF%86/ )
参考文章:crypto-js 加密 和 解密( https://blog.csdn.net/u013299635/article/details/102696911?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-3.edu_weight&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-3.edu_weight
)
需求描述:登录密码使用3des加密传给后端,引入crypto-js方式为html引入
或者手动导入工程里加密文件
注意加密方法是【TripleDES】不是【DES】
解密只支持 Base64 解密方式,如果是16进制的字符串,需要把16进制转换成base64 再解密。
好多人写完不知道加密的是否正确,下面提供一个 3des 加密例子
反之,解密后能获取原字符串,即成功了。
如果你加密是下面的结果,那么就是加密方式错了,注意使用【CryptoJS.TripleDES】而不是【CryptoJS.DES】
使用DES加密方式的结果
虽然不知道你说的双倍长是什么意思,这是我自己用的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
}
}