前端使用 CryptoJS(v3.1.2) 進行des解密,後端java
阿新 • • 發佈:2019-02-16
後端Java使用JDK的API進行des加密,
需要前端解析
JavaScript解密
注意key和iv(向量)都應該是utf8格式的
Java使用byte陣列加密的,前端需要先轉換為字串,然後再轉為utf8
<!DOCTYPE html>
<html>
<head>
<title>des</title>
<script type="text/javascript" src="../CryptoJS v3.1.2/rollups/tripledes.js"></script>
</head >
<body>
</body>
<script type="text/javascript">
function getStrFromBytes (arr) {
var r = "";
for(var i=0;i<arr.length;i++){
r += String.fromCharCode(arr[i]);
}
console.log(r);
return r;
}
var key = 'xxxxxxx'; // 祕鑰
var message = 'wXgrbJBCU2vZqzTJRd6VP/evr5rQSC/VM7ckcFYXW8DeGOt/rRFIXpU0BDfTAMjMJHV9AC2xqNw='; // 待解密密文
var keyHex = CryptoJS.enc.Utf8.parse(key); // 將祕鑰轉換為utf8格式
var ivHex = CryptoJS.enc.Utf8.parse(getStrFromBytes([0x12, 0x34, 0x56,0x78, 0x90, 0xAB,0xCD, 0xEF ])); // 將向量裝換位字串再轉為utf8
var decrypted = CryptoJS.DES.decrypt({
ciphertext: CryptoJS.enc.Base64.parse(message) // 因為Java加密時進行了Base64編碼,所以此處解碼
}, keyHex, {
iv: ivHex,
mode: CryptoJS.mode.CBC, // 模式有很多種,由Java程式碼知道使用的是CBC
padding: CryptoJS.pad.Pkcs7 // 填充模式有很多種,但是Java用的Pkcs5,此處Pkcs7也是可以解密的
});
console.log(decrypted); // 不轉換為字串是得不到字串結果的
console.log(decrypted.toString(CryptoJS.enc.Utf8));
</script>
</html>
Java加密
public class DESUtil {
private static final byte[] DES_IV = { (byte) 0x12, (byte) 0x34, (byte) 0x56,
(byte) 0x78, (byte) 0x90, (byte) 0xAB, (byte) 0xCD, (byte) 0xEF };// 設定向量,略去
public static String encode(String data, String key) throws Exception {
DESKeySpec keySpec = new DESKeySpec(key.getBytes());
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
Cipher enCipher = Cipher.getInstance("DES/CBC/PKCS5Padding");// 得到加密物件Cipher
enCipher.init(Cipher.ENCRYPT_MODE, keyFactory.generateSecret(keySpec), new IvParameterSpec(DES_IV));// 設定工作模式為加密模式,給出金鑰和向量
byte[] pasByte = enCipher.doFinal(data.getBytes("utf-8"));
BASE64Encoder base64Encoder = new BASE64Encoder();
return base64Encoder.encode(pasByte);
}
public static String decode(String data, String key) throws Exception {
DESKeySpec keySpec = new DESKeySpec(key.getBytes());
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
Cipher deCipher = Cipher.getInstance("DES/CBC/PKCS5Padding");
deCipher.init(Cipher.DECRYPT_MODE, keyFactory.generateSecret(keySpec), new IvParameterSpec(DES_IV));
BASE64Decoder base64Decoder = new BASE64Decoder();
byte[] pasByte = deCipher.doFinal(base64Decoder.decodeBuffer(data));
return new String(pasByte, "UTF-8");
}
public static void main(String[] args) throws Exception {
System.out.println("加密:" + DESUtil.encode("innersect://navigation?target=product&id=2935&source=wxapp", "tmmt2017"));
System.out.println("加密:" + DESUtil.encode("innersect://navigation?target=reserve&id=15", "tmmt2017"));
System.out.println("加密:" + DESUtil.encode("innersect://navigation?target=reserve&id=17", "tmmt2017"));
System.out.println("解密:" + DESUtil.decode("wXgrbJBCU2vZqzTJRd6VP/evr5rQSC/VM7ckcFYXW8DeGOt/rRFIXpc6NZH5S/4D", "tmmt2017"));
System.out.println("解密:" + DESUtil.decode("wXgrbJBCU2vZqzTJRd6VP/evr5rQSC/VM7ckcFYXW8DeGOt/rRFIXgg8CI/CQ78h", "tmmt2017"));
}
}