目录

前言

公钥和私钥的获取

公钥私钥例子

公钥

私钥

一、前端vue加密

1.1安装jsencrypt

1.2安装好后,在文件里引用

1.3 使用私钥加密

2.后端java解密

2.1调用代码

2.2 RSAUtils工具类

2.3RSAUtils运行结果

参考文档


前言

RSA加密非对称加密,简单理解为就是有一个私钥一个公钥,我们在前台用私钥进行加密,到后台以后再使用对应的公钥进行解密。(这一对公钥和私钥可以由后台实时生成,每次生成的公钥和私钥都不一样,然后后台把私钥传给前段;也可以前后端商量好固定的公钥和私钥自己单独保存。)

公钥和私钥的获取

在本文后端这块的RSAUtils工具里可以自动生成,这里提供一对,可用的公钥和私钥例子:

公钥私钥例子

公钥:

MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDpZVuOnmdJ8BtR2MknFU4k3LFonjJnub8N1vzERm5l4nFT2dRcQLQoM6NowEgAA3MuTZNJ9ocIhgBGNmmoHCmcTTUe4CPo4SAU+E4pVyzqQEeIydfIhFxb2n7uisgdsaqlQzKzM7NuwAWCCRX+jz2BIBghaGJxgC6LgdYTO3ir8QIDAQAB

私钥:

MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBAOllW46eZ0nwG1HYyScVTiTcsWieMme5vw3W/MRGbmXicVPZ1FxAtCgzo2jASAADcy5Nk0n2hwiGAEY2aagcKZxNNR7gI+jhIBT4TilXLOpAR4jJ18iEXFvafu6KyB2xqqVDMrMzs27ABYIJFf6PPYEgGCFoYnGALouB1hM7eKvxAgMBAAECgYEAzcyuGufaM/wgWt9JH8lNint/g7xavdOvf8ieQYPJPNWbEFD3TBFRylEeOfOyiTCBk8abpZBYKU/fVgoMyEts89KNFAk+PnCNLbCs0M5idwWfxu7uLY/fb0FUR/EVRcA9M5ZL8YP27jwPcQgP6Y5RsAS7ALNsKUjhcRAj5bBoyHECQQD4nzH7IzHoztyHCNJTR/dOKeD/qfH/wKHcWCMliHio9YmavPvomTWTHb9n8sKpHF1ztl+zCF88WvE8qiYNfHEHAkEA8FJ9UcsK3I1DcDbbLJCYiclAvH6M1FNu21oEaYgNsvKUTDG1KtmkYrIU7E0rf4RBHPqMpOdnCFQibFibqqJVRwJAUIfgPKSNygcXT3YACpHI/Tx7cNSvWlQfGaxC1il6S+Acjk6gmhrmS5zbHuR3QSe67XwpS2hu0LH0ad4DLWMdiQJAaBkTN67f0ZFPOPhKEA/CQ0ztwbh/gClzx4hCiQPqCy2Ql0Cg3SLRVf8VmRYEVYQQQGE3MucZdj4bexsWst8GWQJBAIoh+lFUzFATcd21ATfFtqK2kumVrqeauESokEwWjtvWdbZX1hmHBcNTEniRUyecQlzT7UnBzbMLONpV3tis1Jg=

一、前端vue加密

1.1安装jsencrypt

npm install jsencrypt

1.2安装好后,在文件里引用

import { JSEncrypt } from 'jsencrypt';

1.3 使用私钥加密

// 加密
export const encryptedData = function(data) {//公钥和私钥和后端沟通是固定的let publicKey = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDpZVuOnmdJ8BtR2MknFU4k3LFonjJnub8N1vzERm5l4nFT2dRcQLQoM6NowEgAA3MuTZNJ9ocIhgBGNmmoHCmcTTUe4CPo4SAU+E4pVyzqQEeIydfIhFxb2n7uisgdsaqlQzKzM7NuwAWCCRX+jz2BIBghaGJxgC6LgdYTO3ir8QIDAQAB";// 新建JSEncrypt对象let encryptor = new JSEncrypt();// 设置公钥encryptor.setPublicKey(publicKey);var jm_data = encryptor.encrypt(data);// 加密数据return jm_data;
}

2.后端java解密

2.1调用代码

// 私钥解密  byte[] decryptStrByte = RSAUtils.decryptByPrivateKey(Base64.decode(password), RSAUtils.privateKey);password = new String(decryptStrByte);

2.2 RSAUtils工具类

package com.tjhq.cps.utils;import java.io.ByteArrayOutputStream;
import java.security.Key;
import java.security.KeyFactory;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.NoSuchAlgorithmException;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.spec.InvalidKeySpecException;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
import java.util.HashMap;
import java.util.Map;import javax.crypto.Cipher;import org.apache.commons.codec.binary.Base64;public class RSAUtils {private static final String ALGORITHM = "RSA";private static final String PUBLICK_EY = "PUBLICK_EY";private static final String PRIVATE_KEY = "PRIVATE_KEY";public static final String privateKey = "MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBAOllW46eZ0nwG1HYyScVTiTcsWieMme5vw3W/MRGbmXicVPZ1FxAtCgzo2jASAADcy5Nk0n2hwiGAEY2aagcKZxNNR7gI+jhIBT4TilXLOpAR4jJ18iEXFvafu6KyB2xqqVDMrMzs27ABYIJFf6PPYEgGCFoYnGALouB1hM7eKvxAgMBAAECgYEAzcyuGufaM/wgWt9JH8lNint/g7xavdOvf8ieQYPJPNWbEFD3TBFRylEeOfOyiTCBk8abpZBYKU/fVgoMyEts89KNFAk+PnCNLbCs0M5idwWfxu7uLY/fb0FUR/EVRcA9M5ZL8YP27jwPcQgP6Y5RsAS7ALNsKUjhcRAj5bBoyHECQQD4nzH7IzHoztyHCNJTR/dOKeD/qfH/wKHcWCMliHio9YmavPvomTWTHb9n8sKpHF1ztl+zCF88WvE8qiYNfHEHAkEA8FJ9UcsK3I1DcDbbLJCYiclAvH6M1FNu21oEaYgNsvKUTDG1KtmkYrIU7E0rf4RBHPqMpOdnCFQibFibqqJVRwJAUIfgPKSNygcXT3YACpHI/Tx7cNSvWlQfGaxC1il6S+Acjk6gmhrmS5zbHuR3QSe67XwpS2hu0LH0ad4DLWMdiQJAaBkTN67f0ZFPOPhKEA/CQ0ztwbh/gClzx4hCiQPqCy2Ql0Cg3SLRVf8VmRYEVYQQQGE3MucZdj4bexsWst8GWQJBAIoh+lFUzFATcd21ATfFtqK2kumVrqeauESokEwWjtvWdbZX1hmHBcNTEniRUyecQlzT7UnBzbMLONpV3tis1Jg=";public static final String publicKey = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDpZVuOnmdJ8BtR2MknFU4k3LFonjJnub8N1vzERm5l4nFT2dRcQLQoM6NowEgAA3MuTZNJ9ocIhgBGNmmoHCmcTTUe4CPo4SAU+E4pVyzqQEeIydfIhFxb2n7uisgdsaqlQzKzM7NuwAWCCRX+jz2BIBghaGJxgC6LgdYTO3ir8QIDAQAB";/*** 加密算法*/private static final String CIPHER_DE = "RSA";/*** 解密算法*/private static final String CIPHER_EN = "RSA";/*** 密钥长度*/private static final Integer KEY_LENGTH = 1024;/*** RSA最大加密明文大小*/private static final int MAX_ENCRYPT_BLOCK = 117;/*** RSA最大解密密文大小*/private static final int MAX_DECRYPT_BLOCK = 128;/*** 生成秘钥对,公钥和私钥** @return* @throws NoSuchAlgorithmException*/public static Map<String, Object> genKeyPair() throws NoSuchAlgorithmException {Map<String, Object> keyMap = new HashMap<String, Object>();KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance(ALGORITHM);keyPairGenerator.initialize(KEY_LENGTH); // 秘钥字节数KeyPair keyPair = keyPairGenerator.generateKeyPair();PublicKey publicKey = keyPair.getPublic();PrivateKey privateKey = keyPair.getPrivate();keyMap.put(PUBLICK_EY, publicKey);keyMap.put(PRIVATE_KEY, privateKey);return keyMap;}/*** 公钥加密** @param data* @param publicKey* @return* @throws InvalidKeySpecException*/public static byte[] encryptByPublicKey(byte[] data, String publicKey) throws Exception {// 得到公钥byte[] keyBytes = Base64.decodeBase64(publicKey.getBytes());X509EncodedKeySpec x509EncodedKeySpec = new X509EncodedKeySpec(keyBytes);KeyFactory keyFactory = KeyFactory.getInstance(ALGORITHM);Key key = keyFactory.generatePublic(x509EncodedKeySpec);// 加密数据,分段加密  Cipher cipher = Cipher.getInstance(CIPHER_EN);cipher.init(Cipher.ENCRYPT_MODE, key);int inputLength = data.length;ByteArrayOutputStream out = new ByteArrayOutputStream();int offset = 0;byte[] cache;int i = 0;while (inputLength - offset > 0) {if (inputLength - offset > MAX_ENCRYPT_BLOCK) {cache = cipher.doFinal(data, offset, MAX_ENCRYPT_BLOCK);} else {cache = cipher.doFinal(data, offset, inputLength - offset);}out.write(cache, 0, cache.length);i++;offset = i * MAX_ENCRYPT_BLOCK;}byte[] encryptedData = out.toByteArray();out.close();return encryptedData;}/*** 私钥解密** @param data* @param privateKey* @return* @throws Exception*/public static byte[] decryptByPrivateKey(byte[] data, String privateKey) throws Exception {// 得到私钥  byte[] keyBytes = Base64.decodeBase64(privateKey.getBytes());PKCS8EncodedKeySpec pKCS8EncodedKeySpec = new PKCS8EncodedKeySpec(keyBytes);KeyFactory keyFactory = KeyFactory.getInstance(ALGORITHM);Key key = keyFactory.generatePrivate(pKCS8EncodedKeySpec);// 解密数据,分段解密Cipher cipher = Cipher.getInstance(CIPHER_DE);cipher.init(Cipher.DECRYPT_MODE, key);int inputLength = data.length;ByteArrayOutputStream out = new ByteArrayOutputStream();int offset = 0;byte[] cache;int i = 0;byte[] tmp;while (inputLength - offset > 0) {if (inputLength - offset > MAX_DECRYPT_BLOCK) {cache = cipher.doFinal(data, offset, MAX_DECRYPT_BLOCK);} else {cache = cipher.doFinal(data, offset, inputLength - offset);}
//            out.write(cache, 0, cache.length);out.write(cache);i++;offset = i * MAX_DECRYPT_BLOCK;}byte[] decryptedData = out.toByteArray();out.close();return decryptedData;}/*** 获取公钥** @param keyMap* @return*/public static String getPublicKey(Map<String, Object> keyMap) {Key key = (Key) keyMap.get(PUBLICK_EY);String str = new String(Base64.encodeBase64(key.getEncoded()));return str;}/*** 获取私钥** @param keyMap* @return*/public static String getPrivateKey(Map<String, Object> keyMap) {Key key = (Key) keyMap.get(PRIVATE_KEY);String str = new String(Base64.encodeBase64(key.getEncoded()));return str;}public static void main(String[] args) throws Exception {Map<String, Object> keyMap = RSAUtils.genKeyPair();String publicKey = RSAUtils.getPublicKey(keyMap);String privateKey = RSAUtils.getPrivateKey(keyMap);System.out.println("公钥:" + publicKey);System.out.println("私钥:" + privateKey);// 公钥加密  String sourceStr = "111";System.out.println("加密前:" + sourceStr);byte[] encryptStrByte = RSAUtils.encryptByPublicKey(sourceStr.getBytes(), publicKey);byte[] btt = Base64.encodeBase64(encryptStrByte);String encryptStr = new String(btt);System.out.println("加密后:" + encryptStr);System.out.println("长度:" + encryptStr.length());// 私钥解密  byte[] decryptStrByte = RSAUtils.decryptByPrivateKey(Base64.decodeBase64(encryptStr), privateKey);String sourceStr_1 = new String(decryptStrByte);System.out.println("解密后:" + sourceStr_1);}
}

2.3RSAUtils运行结果

公钥:MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDpZVuOnmdJ8BtR2MknFU4k3LFonjJnub8N1vzERm5l4nFT2dRcQLQoM6NowEgAA3MuTZNJ9ocIhgBGNmmoHCmcTTUe4CPo4SAU+E4pVyzqQEeIydfIhFxb2n7uisgdsaqlQzKzM7NuwAWCCRX+jz2BIBghaGJxgC6LgdYTO3ir8QIDAQAB
私钥:MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBAOllW46eZ0nwG1HYyScVTiTcsWieMme5vw3W/MRGbmXicVPZ1FxAtCgzo2jASAADcy5Nk0n2hwiGAEY2aagcKZxNNR7gI+jhIBT4TilXLOpAR4jJ18iEXFvafu6KyB2xqqVDMrMzs27ABYIJFf6PPYEgGCFoYnGALouB1hM7eKvxAgMBAAECgYEAzcyuGufaM/wgWt9JH8lNint/g7xavdOvf8ieQYPJPNWbEFD3TBFRylEeOfOyiTCBk8abpZBYKU/fVgoMyEts89KNFAk+PnCNLbCs0M5idwWfxu7uLY/fb0FUR/EVRcA9M5ZL8YP27jwPcQgP6Y5RsAS7ALNsKUjhcRAj5bBoyHECQQD4nzH7IzHoztyHCNJTR/dOKeD/qfH/wKHcWCMliHio9YmavPvomTWTHb9n8sKpHF1ztl+zCF88WvE8qiYNfHEHAkEA8FJ9UcsK3I1DcDbbLJCYiclAvH6M1FNu21oEaYgNsvKUTDG1KtmkYrIU7E0rf4RBHPqMpOdnCFQibFibqqJVRwJAUIfgPKSNygcXT3YACpHI/Tx7cNSvWlQfGaxC1il6S+Acjk6gmhrmS5zbHuR3QSe67XwpS2hu0LH0ad4DLWMdiQJAaBkTN67f0ZFPOPhKEA/CQ0ztwbh/gClzx4hCiQPqCy2Ql0Cg3SLRVf8VmRYEVYQQQGE3MucZdj4bexsWst8GWQJBAIoh+lFUzFATcd21ATfFtqK2kumVrqeauESokEwWjtvWdbZX1hmHBcNTEniRUyecQlzT7UnBzbMLONpV3tis1Jg=
加密前:111
加密后:3SfpZCWV7YsuBu+shXMW7nH/nnQI4y2LAjGImajHaetoT/TtNxsF70P3gHu8dvP3o0lJGB3hZ0OXujD1qW/cn5Cck3G9jY5Wx+Bo1CFmX88I5p2fz0CIxSMoYr64ElUp8bD7HVDcLP9WAozOYkbaSPr0TrEJh5uwtQ9hwZTD3EY=
长度:172
解密后:111

以上,亲测可用

参考文档

RSA加密/解密 Decryption error异常解决_雪落夜的专栏-CSDN博客_decryption error

RSA非对称加密,前台vue加密,后台java解密相关推荐

  1. 前后台数据传输问题----AES加密,前台JS加密,后台JAVA解密。

    一.JS中加密(解密)数据,采用的是谷歌的CryptoJS静态件 链接: https://pan.baidu.com/s/1l5pHY4g45zzL85dDs8M82Q (如果CSDN无法直接跳转,建 ...

  2. 加密授权验证学习之五——RSA非对称加密算法将机器码加密为注册码

    RSA加密算法是一种非对称加密算法,在公开密钥加密和电子商业中RSA被广泛使用.我们这里使用RSA加密算法,主要用到openssl库,openssl是可以很方便加密解密的库,可以使用它来对需要在网络中 ...

  3. js前端3des加密 后台java解密

    import java.security.Key; import java.security.SecureRandom; import javax.crypto.Cipher; import java ...

  4. java请求url加密_URL请求对参数前端JS加密,后台JAVA解密

    import java.io.ByteArrayOutputStream; /** * 表单传输信息加密 * @author wutz * */ public class Base64Util { p ...

  5. 项目升级-加密的参数传递到后台然后解密(相当于重新封装下request)

    需求分析:客户端(前端页面)为了数据安全,相当于request域里的参数全部加密处理后将密文传给后台handler.而老系统中handler中的request.getParameter肯定是取出来是密 ...

  6. 前台Vue、后台Django、设置axios解决csrf_token问题

    点击查看 转载于:https://www.cnblogs.com/shababy/p/11081840.html

  7. 微信小程序实现授权用户绑定的手机号,后台java解密

    具体思路为:小程序前端点击按钮,弹出授权手机号窗口,用户允许后,js得到加密数据,加密向量,session_key,将这些信息传递到java后台解密,最终拿到电话号码.(直接通过js是获取不到的) w ...

  8. rsa实现js前台加密java后台解密

    前段时间咱老大吩咐我写一个rsa前台加密到后台用java解密.(说实话这之前我还真没用过) 不过没办法啊,这是任务,于是研究了一下.圆满完成任务了,下面共享下实现思路: 准备工作:其实鄙人也没那么强啦 ...

  9. java rsa 117_java实现RSA非对称加密解密

    之前写过一篇java实现AES对称加密解密 在对密码加密传输的场景下 RSA非对称加密解密可能会更加适合. 原理就是后台生成一对公钥和私钥,公钥给前端用来加密,后台用私钥去解密,保证了传输过程中就算被 ...

最新文章

  1. NCEPU:线下组队学习周报(009)
  2. 这样统计代码执行耗时,才足够优雅!
  3. bhjqahjshjhjgqwsoixcyuwyub
  4. SSH putty Disconnected: Server protocol violation: unexpected SSH2_MSG_UNIMPLEMENTED packet
  5. 搭建本地wordpress
  6. python多线程编程(5): 条件变量同步
  7. 【评测机】评测时报错cc1plus: fatal error: /xx/xx/main.cpp: Permission denied compilation terminated.的解决方法...
  8. Java 中isEmpty和null、 的区别
  9. [USACO DEC13] 虫洞
  10. Springboot JUnit5 Controller 单元测试
  11. 素材网站整理(持续更新ing~)
  12. Mac 下读写NTFS文件
  13. Java 压缩文件夹
  14. 数据驱动进化优化(data-driven evolutionary optimization)
  15. 28KHZ/40KHZ老款超声波开关线路板
  16. 哔哩哔哩2019秋招笔试试题二——脸滚键盘
  17. Linux玩dota2需要什么显卡,dota2最低配置要求 玩dota2需要什么电脑配置
  18. 有意思的shell命令行提示符
  19. 微信小程序 input 的 type属性 text、number、idcard、digit 区别
  20. Java之HashMap系列--HashMap扩容的原理

热门文章

  1. 数据库管理系统,数据库,数据库系统的定义及其区别
  2. Python数据分析(一)matplotlib
  3. 科汛在线图文下单系统
  4. xliff:g标签介绍:
  5. 【图的着色问题】算法设计与分析实验1
  6. 手把手教你在Photoshop中使用曲线工具
  7. 计算机软件提取,伴奏提取_计算机软件及应用_IT计算机_专业资料
  8. 操作系统--进程锁算法1(两个进程的锁)
  9. A091_hrm07_用户中心_注册
  10. python实现数据可视化_使用Matplotib python实现数据可视化