1. 程式人生 > >前端使用 CryptoJS(v3.1.2) 進行des解密,後端java

前端使用 CryptoJS(v3.1.2) 進行des解密,後端java

後端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"));
    }

}