微信小程序使用JSEncrypt解密RSA加密后的报文,待解密数据由Java生成

1.Java对数加密

1.1需要用到的包和类

import org.apache.commons.codec.binary.Base64;

import javax.crypto.Cipher;
import java.security.*;
import java.security.interfaces.RSAPrivateKey;
import java.security.interfaces.RSAPublicKey;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
import java.util.HashMap;
import java.util.Map;

1.2 生成随机密钥对

keySize可以自己指定,一般512或1024

/**
     * 生成密钥对
     * @param keySize 密钥长度
     * @return
     */
    public static void genKeyPair(int keySize) throws  Exception{
        //1.生成公钥和私钥,基于RSA算法
        KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
        //2.初始化密钥对生成器,密钥大小为96-1024位
        keyPairGenerator.initialize(keySize, new SecureRandom());
        //3.生成一个密钥对,保存在keyPair中
        KeyPair keyPair = keyPairGenerator.generateKeyPair();
        //4.获取私钥
        RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate();
        //5.获取公钥
        RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic();
        //6.得到公钥字符串
        String pubStr = new String(Base64.encodeBase64(publicKey.getEncoded()));
        //7.得到私钥字符串
        String privStr = new String(Base64.encodeBase64(privateKey.getEncoded()));
        //8.放入keyMap中
        keyMap.put(0, pubStr);
        keyMap.put(1, privStr);

    }

1.3对数据RSA加密

公钥加密可指定字符集,一般是UTF-8,返回的加密数据用Base64

 /**
     * 公钥加密
     *
     * @param str       待加密的字符串
     * @param publicKey 公钥
     * @return
     */
    public static String encrypt(String str, String publicKey, String charset) throws Exception {
        //base64编码的公钥
        byte[] decode = Base64.decodeBase64(publicKey);

        RSAPublicKey pubKey = (RSAPublicKey) KeyFactory.getInstance("RSA").generatePublic(new X509EncodedKeySpec(decode));
        Cipher cipher = Cipher.getInstance("RSA");
        //RSA加密
        cipher.init(Cipher.ENCRYPT_MODE, pubKey);
        return Base64.encodeBase64String(cipher.doFinal(str.getBytes(charset)));
    }

1.4对RSA数据解密

私钥解密可指定字符集,一般是UTF-8

/**
     * 私钥解密
     *
     * @param str        待解密的字符串
     * @param privateKey 私钥
     * @return
     */
    public static String decrypt(String str, String privateKey, String charset) throws Exception {
        //1.base64解码字符串
        byte[] bytes = Base64.decodeBase64(str.getBytes(charset));
        //2.base64编码的私钥
        byte[] decode = Base64.decodeBase64(privateKey);
        RSAPrivateKey priKey = (RSAPrivateKey) KeyFactory.getInstance("RSA").generatePrivate(new PKCS8EncodedKeySpec(decode));
        //3.RSA解密
        Cipher cipher = Cipher.getInstance("RSA");
        cipher.init(Cipher.DECRYPT_MODE, priKey);
        return new String(cipher.doFinal(bytes));
    }

1.5测试

结果就不再展示了

public static void main(String[] args) throws  Exception{
        genKeyPair(512);
        System.out.println("public公钥:" + keyMap.get(0));
        System.out.println("private私钥:" + keyMap.get(1));

        String str = "{1234,12312}";

        String msgEn = encrypt(str, keyMap.get(0),"UTF-8");
        System.out.println("加密后的字符串为:"+msgEn);

       
        String msgDe = decrypt(msgEn,keyMap.get(1),"UTF-8");
        System.out.println("解密后的字符串为:"+msgDe);

    }

2.微信小程序端使用

2.1  jsencrypt.js的修改

微信社区:https://developers.weixin.qq.com/community/develop/doc/000068b497cfc00619b7bcfdc51004

百度网盘分享:https://pan.baidu.com/s/1jqkCqNiaLpITmiwhABuz9g 
提取码:1234 

2.2 小程序引入及使用

//在需要使用的地方引用:

const Encrypt = require('jsencrypt.js')
let crypt = new Encrypt.JSEncrypt():

//加密用:
crypt.setPublicKey("-----BEGIN PUBLIC KEY-----"+util.rsa_public_key+"-----BEGIN PUBLIC KEY-----")
crypt.encrypt("待加密的字符串");
//解密用:

crypt.setPrivateKey("-----BEGIN PRIVATE KEY-----"+util.rsa_public_key+"-----BEGIN PRIVATE KEY-----")
//java后台生成
crypt.decrypt("RSA加密生成BASE64数据");

2.3 RSA算法

参考:https://www.ruanyifeng.com/blog/2013/06/rsa_algorithm_part_one.html

也可参考百度百科

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值