前端使用 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"));
    }

}

猜你喜欢

转载自blog.csdn.net/guxiansheng1991/article/details/80261236