前端加密 后端Java解密

分享一下最简单的处理,前端采用JS自带的 atob加密,后端采用工具解密

前端JS代码

//加密字符串,可以先将中文加密,然后再用btoa加密
      encryption(str) {
        var encStr = encodeURIComponent(str);
        encStr = btoa(encStr);
        return encStr;
      },

      //解密,可以先将ascii解密,然后再将非ascii解密
      decrypt(str) {
        var decStr = atob(str);
        decStr = decodeURIComponent(decStr);
        return decStr;
      },

后端代码

package com.fudian.project.system.utils;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.net.URLEncoder;

/**
 * Window.atob 加解密
 * @author ZYGisComputer
 */
public class BtoaEncode {

    public static void main(String[] args) {
        String admin = BtoaEncode.encryption("admin");
        System.out.println(admin);
        System.out.println(BtoaEncode.decrypt(admin));
    }

    private static String base64hash = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";

    public static boolean isMatcher(String inStr, String reg) {
        Pattern pattern = Pattern.compile(reg);
        Matcher matcher = pattern.matcher(inStr);
        if (matcher.matches()) {
            return true;
        }
        return false;
    }

    /**
     * btoa method
     * @param inStr
     * @return
     */
    public static String btoa(String inStr) {

        if (inStr == null || isMatcher(inStr, "([^\\u0000-\\u00ff])")) {
            return null;
        }

        StringBuilder result = new StringBuilder();
        int i = 0;
        int mod = 0;
        int ascii;
        int prev = 0;
        while (i < inStr.length()) {
            ascii = inStr.charAt(i);
            mod = i % 3;
            switch (mod) {
                case 0:
                    result.append(String.valueOf(base64hash.charAt(ascii >> 2)));
                    break;
                case 1:
                    result.append(String.valueOf(base64hash.charAt((prev & 3) << 4 | (ascii >> 4))));
                    break;
                case 2:
                    result.append(String.valueOf(base64hash.charAt((prev & 0x0f) << 2 | (ascii >> 6))));
                    result.append(String.valueOf(base64hash.charAt(ascii & 0x3f)));
                    break;
            }
            prev = ascii;
            i++;
        }
        if (mod == 0) {
            result.append(String.valueOf(base64hash.charAt((prev & 3) << 4)));
            result.append("==");
        } else if (mod == 1) {
            result.append(String.valueOf(base64hash.charAt((prev & 0x0f) << 2)));
            result.append("=");
        }
        return result.toString();
    }

    /**
     * atob method  逆转encode的思路即可
     * @param inStr
     * @return
     */
    public static String atob(String inStr) {
        if (inStr == null)
            return null;
        inStr = inStr.replaceAll("\\s|=", "");
        StringBuilder result = new StringBuilder();
        int cur;
        int prev = -1;
        int mod;
        int i = 0;
        while (i < inStr.length()) {
            cur = base64hash.indexOf(inStr.charAt(i));
            mod = i % 4;
            switch (mod) {
                case 0:
                    break;
                case 1:
                    result.append(String.valueOf((char) (prev << 2 | cur >> 4)));
                    break;
                case 2:

                    result.append(String.valueOf((char) ((prev & 0x0f) << 4 | cur >> 2)));
                    break;
                case 3:

                    result.append(String.valueOf((char) ((prev & 3) << 6 | cur)));
                    break;
            }
            prev = cur;
            i++;
        }
        return result.toString();
    }

    /**
     * 加密字符串
     * @return
     */
    public static String encryption(String str) {
        String encode;
        try {
            encode = URLEncoder.encode(str,"utf-8");
            //URLEncoder.encode 会将空格解释为+号
            encode=encode.replaceAll("\\+", "%20");
            String btoa = BtoaEncode.btoa(encode);
            return btoa;
        } catch (UnsupportedEncodingException e) {
            System.out.println("btoa加密函数出现错误。");
        }
        return str;
    }

    /**
     * 解密字符串
     * @return
     */
    public static String decrypt(String str) {
        String atob = BtoaEncode.atob(str);
        try {
            String decode = URLDecoder.decode(atob, "utf-8");
            return decode;
        } catch (UnsupportedEncodingException e) {
            System.out.println("atob加密函数出现错误。");
        }
        return str;
    }

}

复制代码

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
下面是一个简单的前端使用 sm2 加密后端使用 java 解密的示例代码: 前端代码: ```javascript import { sm2 } from "sm-crypto"; // 待加密的数据 const data = "Hello, World!"; // 公钥 const publicKey = "04a0b5376a5deca1c8dbf9c3d9f7f82d7d3a96fc79a2f54b6a4e55d90d5e9a7d2ee1d1c1b9ea37a7c3ddafef5e6d67f3dcd91f4e6c8aa1a5c5d7d4e38bda9c02e"; // 将公钥转换为 sm2 公钥对象 const publicKeyObj = sm2.SM2KeyPair(publicKey, "", { curve: "sm2p256v1", publicKeyType: "uncompressed", }); // 使用 sm2 加密数据,并将加密结果进行 base64 编码 const encryptedData = sm2.doEncrypt(data, publicKeyObj).toString("base64"); // 将加密结果发送给后端 ``` 后端代码: ```java import org.bouncycastle.crypto.params.ECPublicKeyParameters; import org.bouncycastle.crypto.params.ParametersWithRandom; import org.bouncycastle.crypto.util.PublicKeyFactory; import org.bouncycastle.jcajce.provider.asymmetric.ec.BCECPrivateKey; import org.bouncycastle.jcajce.provider.asymmetric.ec.BCECPublicKey; import org.bouncycastle.jce.provider.BouncyCastleProvider; import org.bouncycastle.jce.spec.ECParameterSpec; import org.bouncycastle.util.encoders.Base64; import org.bouncycastle.crypto.digests.SM3Digest; import org.bouncycastle.crypto.engines.SM2Engine; import org.bouncycastle.crypto.params.ParametersWithID; import org.bouncycastle.crypto.params.SM2KeyExchangePrivateParameters; import org.bouncycastle.crypto.params.SM2KeyExchangePublicParameters; import org.bouncycastle.crypto.params.SM2PrivateKeyParameters; import org.bouncycastle.crypto.params.SM2PublicKeyParameters; import java.security.KeyPair; import java.security.KeyPairGenerator; import java.security.SecureRandom; import java.security.Security; public class SM2Demo { public static void main(String[] args) throws Exception { Security.addProvider(new BouncyCastleProvider()); // 私钥,从配置文件或数据库中读取 String privateKeyStr = "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"; // 将私钥转换为 sm2 私钥对象 byte[] privateKeyBytes = Hex.decode(privateKeyStr); SM2PrivateKeyParameters privateKey = new SM2PrivateKeyParameters(privateKeyBytes, SM2Util.DOMAIN_PARAMS); // 加密后的数据,从前端接收 String encryptedDataStr = "QXZlbnQgUGF5bG9hZA=="; byte[] encryptedData = Base64.decode(encryptedDataStr); // 使用 sm2 解密数据 SM2Engine engine = new SM2Engine(); engine.init(false, new ParametersWithID(null, null)); engine.processCiphertext(encryptedData, 0, encryptedData.length); byte[] decryptedData = engine.doFinal(); // 输出解密结果 System.out.println(new String(decryptedData)); } } ``` 需要注意的是,在上面的示例代码中,我们使用了 BouncyCastle 提供的 sm2 实现。如果你使用的是其它实现,则代码可能会有所不同。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值