前端使用crypto-js 3DES 加解密

JavaScript011

前端使用crypto-js 3DES 加解密,第1张

crypto-js git地址

参考文章: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

    }

}