1500字范文,内容丰富有趣,写作好帮手!
1500字范文 > RSA非对称加密 前台vue加密 后台java解密

RSA非对称加密 前台vue加密 后台java解密

时间:2019-08-08 00:01:49

相关推荐

RSA非对称加密 前台vue加密 后台java解密

目录

前言

公钥和私钥的获取

公钥私钥例子

公钥

私钥

一、前端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 mons.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

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。