java和Vue前后端RSA对称加密

参考:https://blog.csdn.net/qq_25623257/article/details/109775531

一、生成秘钥对(公私钥)

在线生成地址:http://web.chacuo.net/netrsakeypair

/*** 随机生成密钥对* 生成秘钥对在线地址:http://web.chacuo.net/netrsakeypair* @throws NoSuchAlgorithmException*/
public static void genKeyPair() throws NoSuchAlgorithmException {// KeyPairGenerator类用于生成公钥和私钥对,基于RSA算法生成对象KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("RSA");// 初始化密钥对生成器,密钥大小为96-1024位keyPairGen.initialize(1024,new SecureRandom());// 生成一个密钥对,保存在keyPair中KeyPair keyPair = keyPairGen.generateKeyPair();// 得到私钥RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate();// 得到公钥RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic();String publicKeyString = new String(Base64.encodeBase64(publicKey.getEncoded()));// 得到私钥字符串String privateKeyString = new String(Base64.encodeBase64((privateKey.getEncoded())));// 将公钥和私钥保存到Map//0表示公钥keyMap.put(0,publicKeyString);//1表示私钥keyMap.put(1,privateKeyString);
}

二、后端加解密

前言:这里使用到Base64转码,这里使用 import org.apache.tomcat.util.codec.binary.Base64;包下面的,也可以使用阿里支付宝下的 import com.alipay.api.internal.util.codec.Base64;。阿里这个需要引入一下jar

<!-- 支付宝支付 -->
<dependency><groupId>com.alipay.sdk</groupId><artifactId>alipay-sdk-java</artifactId><version>4.8.10.ALL</version>
</dependency>

2.1、加密

/*** RSA公钥加密* @param str 加密字符串* @param publicKey 公钥* @return 密文* @throws Exception 加密过程中的异常信息*/
public static String encrypt( String str, String publicKey ) throws Exception{//base64编码的公钥byte[] decoded = Base64.decodeBase64(publicKey.getBytes());RSAPublicKey pubKey = (RSAPublicKey) KeyFactory.getInstance("RSA").generatePublic(new X509EncodedKeySpec(decoded));//RSA加密Cipher cipher = Cipher.getInstance("RSA");cipher.init(Cipher.ENCRYPT_MODE, pubKey);String outStr = Base64.encodeBase64String(cipher.doFinal(str.getBytes("gbk")));return outStr;
}

2.2、解密

/***  RSA私钥解密* @param str 加密字符串* @param privateKey 私钥* @return* @throws Exception 解密过程中的异常信息*/
public static String decrypt(String str, String privateKey) throws Exception{//64位解码加密后的字符串byte[] inputByte = Base64.decodeBase64(str.getBytes("gbk"));//base64编码的私钥byte[] decoded = Base64.decodeBase64(privateKey.getBytes());RSAPrivateKey priKey = (RSAPrivateKey) KeyFactory.getInstance("RSA").generatePrivate(new PKCS8EncodedKeySpec(decoded));//RSA解密Cipher cipher = Cipher.getInstance("RSA");cipher.init(Cipher.DECRYPT_MODE, priKey);String outStr = new String(cipher.doFinal(inputByte));return outStr;
}

2.3、完整代码

package com.rsa;import org.apache.tomcat.util.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;public class RSAEncrypt {/*** 用于封装随机产生的公钥与私钥*/private static Map<Integer, String> keyMap = new HashMap<Integer, String>();public static void main(String[] args) throws Exception {//生成公钥和私钥
//      genKeyPair();keyMap.put(0,"MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCeKObHDgyYpbI3W/xpXsFjYkelsnYPL8m5YFUGf7/4VJaPCYYTqbv87UNuXytN1qZKD51g20ECxj+4fYtYCABfUzLcPiJmSVVAFuwjPREtSYN3bxLf/pnThWFj159RcCJCGXGjUVkbJximOaLbfI+e8gHVvQWj7N5FiMM7D7UV9QIDAQAB");keyMap.put(1,"MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBAJ4o5scODJilsjdb/GlewWNiR6Wydg8vyblgVQZ/v/hUlo8JhhOpu/ztQ25fK03WpkoPnWDbQQLGP7h9i1gIAF9TMtw+ImZJVUAW7CM9ES1Jg3dvEt/+mdOFYWPXn1FwIkIZcaNRWRsnGKY5ott8j57yAdW9BaPs3kWIwzsPtRX1AgMBAAECgYEAmTekghfhKgvzP2AUgfuyu1XddO8TIhk4giaJmBcwYSGJDZ67Tdcz743mskjuCaU1STAhVVByhX6LAm5VDH4L5McNoW3J/McY3xQ8vTbdtncIMBIORfx4rp599J+8/pWBYe+yfgm6e/48hux6LcvDu8QkrWEmrARsd4mf9d8WLkECQQDPAzwvI2UjAxsOQj5wFJvdX58uW0ZNbax2Z4SMBBGSCox0iIYThXCpD4BwJFEY6HLJQq1MNH90RTnh7aJZWGkRAkEAw5YskRfbTZyrxvnUh0QmeDCKrSprxDOk3s4eUdymfzow646UluyS7/eimHhwU0zir10gCc1gLvfPcEXRjdN+pQJAC2ZZNRtU4XW1UraxK4jnAGzYnjvmhjMI8UhIE1HSCeHM1EoEYCTUDGtPHl3RnXaHg6/JTU4CystZIajtbNAikQJAOlCIMSp/xIA15zmN2FbFcYhnkIHZZ8JOIfAqshWrvrtG4rS8MNOQa+PVosgmFXATFl4Zs1J8nwRb4QmwFS090QJBAMvHjIyv/Dksi7Lk/vD853Y0E8HmBFasj1OrOVaYd002ltyPXle+LI95gqPVHRoWNiLwriRt3IlLolmgQddL4oY=");//加密字符串String message = "df723820";System.out.println("随机生成的公钥为:" + keyMap.get(0));System.out.println("随机生成的私钥为:" + keyMap.get(1));String messageEn = encrypt(message,keyMap.get(0));System.out.println("加密前的字符串为:"+message);System.out.println("加密后的字符串为:" + messageEn);String messageDe = decrypt(messageEn,keyMap.get(1));System.out.println("还原后的字符串为:" + messageDe);}/*** 随机生成密钥对* 生成秘钥对在线地址:http://web.chacuo.net/netrsakeypair* @throws NoSuchAlgorithmException*/public static void genKeyPair() throws NoSuchAlgorithmException {// KeyPairGenerator类用于生成公钥和私钥对,基于RSA算法生成对象KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("RSA");// 初始化密钥对生成器,密钥大小为96-1024位keyPairGen.initialize(1024,new SecureRandom());// 生成一个密钥对,保存在keyPair中KeyPair keyPair = keyPairGen.generateKeyPair();// 得到私钥RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate();// 得到公钥RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic();String publicKeyString = new String(Base64.encodeBase64(publicKey.getEncoded()));// 得到私钥字符串String privateKeyString = new String(Base64.encodeBase64((privateKey.getEncoded())));// 将公钥和私钥保存到Map//0表示公钥keyMap.put(0,publicKeyString);//1表示私钥keyMap.put(1,privateKeyString);}/*** RSA公钥加密* @param str 加密字符串* @param publicKey 公钥* @return 密文* @throws Exception 加密过程中的异常信息*/public static String encrypt( String str, String publicKey ) throws Exception{//base64编码的公钥byte[] decoded = Base64.decodeBase64(publicKey.getBytes());RSAPublicKey pubKey = (RSAPublicKey) KeyFactory.getInstance("RSA").generatePublic(new X509EncodedKeySpec(decoded));//RSA加密Cipher cipher = Cipher.getInstance("RSA");cipher.init(Cipher.ENCRYPT_MODE, pubKey);String outStr = Base64.encodeBase64String(cipher.doFinal(str.getBytes("gbk")));return outStr;}/***  RSA私钥解密* @param str 加密字符串* @param privateKey 私钥* @return* @throws Exception 解密过程中的异常信息*/public static String decrypt(String str, String privateKey) throws Exception{//64位解码加密后的字符串byte[] inputByte = Base64.decodeBase64(str.getBytes("gbk"));//base64编码的私钥byte[] decoded = Base64.decodeBase64(privateKey.getBytes());RSAPrivateKey priKey = (RSAPrivateKey) KeyFactory.getInstance("RSA").generatePrivate(new PKCS8EncodedKeySpec(decoded));//RSA解密Cipher cipher = Cipher.getInstance("RSA");cipher.init(Cipher.DECRYPT_MODE, priKey);String outStr = new String(cipher.doFinal(inputByte));return outStr;}}

三、前端加密

官网

jsencrypt :http://travistidwell.com/jsencrypt/

encryptlong:https://www.npmjs.com/package/encryptlong

3.1、安装依赖并引入方法

  • 安装依赖
npm install jsencrypt --save-dev
npm i encryptlong -S
  • 引入方法
/* 产引入jsencrypt实现数据RSA加密 */
import JSEncrypt from 'jsencrypt'; // 处理长文本数据时报错 jsencrypt.js Message too long for RSA
/* 产引入encryptlong实现数据RSA加密 */
import Encrypt from 'encryptlong'; // encryptlong是基于jsencrypt扩展的长文本分段加解密功能。

3.2、加密

  • JSEncrypt加密
/* JSEncrypt加密 */
rsaPublicData(data) {var jsencrypt = new JSEncrypt();jsencrypt.setPublicKey(publicKey);// 如果是对象/数组的话,需要先JSON.stringify转换成字符串var result = jsencrypt.encrypt(data);return result;
},
  • 加密
/* 加密 */
encrypt(data) {const PUBLIC_KEY = publicKey;var encryptor = new Encrypt();encryptor.setPublicKey(PUBLIC_KEY);// 如果是对象/数组的话,需要先JSON.stringify转换成字符串const result = encryptor.encryptLong(data);return result;
},

3.3、解密

  • JSEncrypt解密
/* JSEncrypt解密 */rsaPrivateData(data) {var jsencrypt = new JSEncrypt();jsencrypt.setPrivateKey(privateKey);// 如果是对象/数组的话,需要先JSON.stringify转换成字符串var result = jsencrypt.encrypt(data);return result;},
  • 解密
/* 解密 - PRIVATE_KEY - 验证 */
decrypt(data) {const PRIVATE_KEY = privateKey;var encryptor = new Encrypt();encryptor.setPrivateKey(PRIVATE_KEY);// 如果是对象/数组的话,需要先JSON.stringify转换成字符串var result = encryptor.decryptLong(data);return result;
}

3.4、两种加解密说明

rsaPublicDataencrypt加密,使用 decrypt都可以解密,但是 JSEncrypt解密目前不能使用。

这两种加密的秘钥不一样。

3.5、完整代码

<template><div>加密练习</div>
</template><script>
/* 产引入jsencrypt实现数据RSA加密 */
import JSEncrypt from 'jsencrypt'; // 处理长文本数据时报错 jsencrypt.js Message too long for RSA
/* 产引入encryptlong实现数据RSA加密 */
import Encrypt from 'encryptlong'; // encryptlong是基于jsencrypt扩展的长文本分段加解密功能。
// 公钥key
const publicKey = 'MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCeKObHDgyYpbI3W/xpXsFjYkelsnYPL8m5YFUGf7/4VJaPCYYTqbv87UNuXytN1qZKD51g20ECxj+4fYtYCABfUzLcPiJmSVVAFuwjPREtSYN3bxLf/pnThWFj159RcCJCGXGjUVkbJximOaLbfI+e8gHVvQWj7N5FiMM7D7UV9QIDAQAB';
// 私钥key
const privateKey ='MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBAJ4o5scODJilsjdb/GlewWNiR6Wydg8vyblgVQZ/v/hUlo8JhhOpu/ztQ25fK03WpkoPnWDbQQLGP7h9i1gIAF9TMtw+ImZJVUAW7CM9ES1Jg3dvEt/+mdOFYWPXn1FwIkIZcaNRWRsnGKY5ott8j57yAdW9BaPs3kWIwzsPtRX1AgMBAAECgYEAmTekghfhKgvzP2AUgfuyu1XddO8TIhk4giaJmBcwYSGJDZ67Tdcz743mskjuCaU1STAhVVByhX6LAm5VDH4L5McNoW3J/McY3xQ8vTbdtncIMBIORfx4rp599J+8/pWBYe+yfgm6e/48hux6LcvDu8QkrWEmrARsd4mf9d8WLkECQQDPAzwvI2UjAxsOQj5wFJvdX58uW0ZNbax2Z4SMBBGSCox0iIYThXCpD4BwJFEY6HLJQq1MNH90RTnh7aJZWGkRAkEAw5YskRfbTZyrxvnUh0QmeDCKrSprxDOk3s4eUdymfzow646UluyS7/eimHhwU0zir10gCc1gLvfPcEXRjdN+pQJAC2ZZNRtU4XW1UraxK4jnAGzYnjvmhjMI8UhIE1HSCeHM1EoEYCTUDGtPHl3RnXaHg6/JTU4CystZIajtbNAikQJAOlCIMSp/xIA15zmN2FbFcYhnkIHZZ8JOIfAqshWrvrtG4rS8MNOQa+PVosgmFXATFl4Zs1J8nwRb4QmwFS090QJBAMvHjIyv/Dksi7Lk/vD853Y0E8HmBFasj1OrOVaYd002ltyPXle+LI95gqPVHRoWNiLwriRt3IlLolmgQddL4oY=';
export default {data() {return {};},components: {},methods: {/* JSEncrypt加密 */rsaPublicData(data) {var jsencrypt = new JSEncrypt();jsencrypt.setPublicKey(publicKey);// 如果是对象/数组的话,需要先JSON.stringify转换成字符串var result = jsencrypt.encrypt(data);return result;},/* JSEncrypt解密 */rsaPrivateData(data) {var jsencrypt = new JSEncrypt();jsencrypt.setPrivateKey(privateKey);// 如果是对象/数组的话,需要先JSON.stringify转换成字符串var result = jsencrypt.encrypt(data);return result;},/* 加密 */encrypt(data) {const PUBLIC_KEY = publicKey;var encryptor = new Encrypt();encryptor.setPublicKey(PUBLIC_KEY);// 如果是对象/数组的话,需要先JSON.stringify转换成字符串const result = encryptor.encryptLong(data);return result;},/* 解密 - PRIVATE_KEY - 验证 */decrypt(data) {const PRIVATE_KEY = privateKey;var encryptor = new Encrypt();encryptor.setPrivateKey(PRIVATE_KEY);// 如果是对象/数组的话,需要先JSON.stringify转换成字符串var result = encryptor.decryptLong(data);return result;}},created() {let pwd = '这是加密的内容2021年12月2日09:28:44';let encoded = this.rsaPublicData(pwd); // 加密// 加密后的密文console.log(encoded);let decode = this.decrypt(encoded); // 解密console.log('解密后内容:', decode);}
};
</script><style scoped>
</style>

四、解决解密后中文乱码问题

机密时将加密前的数据转码了,再将转码后的数据加密。加密的时候解密出来了再转码。

4.1、js转码

var en = encodeURIComponent("需要转码的数据");

encodeURIComponentjs自带的方法。

  • 案例
let pwd = '这是加密的内容2021年12月2日09:28:44';
var en = encodeURIComponent(pwd);
let encoded = this.encrypt(en); // 加密
// 加密后的密文
console.log(encoded);
let decode = this.decrypt(encoded); // 解密
console.log('解密后内容:', decode);

4.2、后端

String result = java.net.URLDecoder.decode("需要转码的数据" ,"UTF-8");

java和Vue前后端RSA对称加密相关推荐

  1. 基于Java+SpringBoot+Vue前后端分离网上银行系统设计与实现(视频讲解)

    博主介绍:✌全网粉丝3W+,全栈开发工程师,从事多年软件开发,在大厂呆过.持有软件中级.六级等证书.可提供微服务项目搭建与毕业项目实战,博主也曾写过优秀论文,查重率极低,在这方面有丰富的经验✌ 博主作 ...

  2. 基于Java+SpringBoot+Vue前后端分离餐厅点餐管理系统设计和实现

    博主介绍:✌全网粉丝30W+,csdn特邀作者.博客专家.CSDN新星计划导师.java领域优质创作者,博客之星.掘金/华为云/阿里云/InfoQ等平台优质作者.专注于Java技术领域和毕业项目实战✌

  3. 基于Java+SpringBoot+Vue前后端分离学生信息管理设计实现

    博主介绍:✌全网粉丝30W+,csdn特邀作者.博客专家.CSDN新星计划导师.java领域优质创作者,博客之星.掘金/华为云/阿里云/InfoQ等平台优质作者.专注于Java技术领域和毕业项目实战✌

  4. 基于Java+SpringBoot+Vue前后端分离摄影分享网站平台系统

    博主介绍:✌全网粉丝30W+,csdn特邀作者.博客专家.CSDN新星计划导师.java领域优质创作者,博客之星.掘金/华为云/阿里云/InfoQ等平台优质作者.专注于Java技术领域和毕业项目实战✌

  5. 基于Java+SpringBoot+Vue前后端分离仓库管理系统设计实现

    博主介绍:✌全网粉丝30W+,csdn特邀作者.博客专家.CSDN新星计划导师.java领域优质创作者,博客之星.掘金/华为云/阿里云/InfoQ等平台优质作者.专注于Java技术领域和毕业项目实战✌

  6. 基于Java+SpringBoot+Vue前后端分离手机销售商城系统设计和实现

    博主介绍:✌全网粉丝30W+,csdn特邀作者.博客专家.CSDN新星计划导师.java领域优质创作者,博客之星.掘金/华为云/阿里云/InfoQ等平台优质作者.专注于Java技术领域和毕业项目实战✌

  7. 基于Java+SpringBoot+vue前后端分离海滨体育馆管理系统设计实现

    博主介绍:✌全网粉丝30W+,csdn特邀作者.博客专家.CSDN新星计划导师.Java领域优质创作者,博客之星.掘金/华为云/阿里云/InfoQ等平台优质作者.专注于Java技术领域和毕业项目实战✌

  8. 基于Java+SpringBoot+vue前后端分离足球青训俱乐部管理后台系统设计实现

    博主介绍:✌全网粉丝30W+,csdn特邀作者.博客专家.CSDN新星计划导师.Java领域优质创作者,博客之星.掘金/华为云/阿里云/InfoQ等平台优质作者.专注于Java技术领域和毕业项目实战✌

  9. 基于JAVA springboot+VUE前后端分离疫情防疫平台设计实现

最新文章

  1. Unity The Type Matching Rule
  2. 遥远的,理想与现实的完美统一——听完华大基因的宣讲,有点小激动···
  3. Scala集合体系:可变集合和不可变集合
  4. php标签调用,phpcms栏目标签调用代码大全
  5. 两种大小端判断的方式
  6. java逸出_Java并发编程 - 对象的共享
  7. File /usr/bin/pip, line 11, in module sys.exit(__main__._main()) AttributeError: 'module' ob...
  8. 蓝桥杯 ALGO-70 算法训练 最长字符串
  9. 计算机视觉-混合动态纹理模型(Mixtures of Dynamic Textures)
  10. 基于信息熵确立权重的topsis法_基于信息熵和TOPSIS法的装备战场抢修排序决策模型...
  11. Stereo Matching文献笔记之(九):经典算法Semi-Global Matching(SGM)之神奇的HMI代价计算~
  12. SPSS单因素方差分析教程
  13. QCA9531模块ART 认证测试指导
  14. CRT使用(一)CRT软件安装和部署
  15. matlab更改类型,matlab数据类型和转换
  16. 18100出多少取整_电子表格里小数取整用什么公式?
  17. 高可用:美团点评智能支付核心交易系统的可用性实践
  18. 所谓情商高就是会说话(摘录)
  19. c语言主线程退出子线程,简单了解C语言中主线程退出对子线程的影响
  20. Java(9)接口练习 运动员和教练

热门文章

  1. 美术集网校—超简单风景水彩画教程来啦,把风景留在画本里!
  2. 【通信】基于非相干信号子空间(ISM)的宽带源DOA估计方法
  3. 我所知道的十大常用算法之普里姆算法(最小生成树)
  4. mysql查看数据库cmd命令_cmd命令操作Mysql数据库
  5. Java 中引用类型都有哪些
  6. VS2022 VC++下控制台程序SetTimer定时器的应用
  7. springClound之整合Eureka
  8. 前端基础:vue(四)前后端交互promis、fetch、axios
  9. Hibernate系列教材 (八)- 基础 - 使用Criteria进行查询
  10. CentOS7下开启redis6379端口