本篇博客是SpringBoot来集成非对称加密解密,若文章中出现相关问题,请指出!
所有博客文件目录索引:博客目录索引(持续更新)
RSA,RSA2公钥私钥加密解密
支付宝在线加密:强烈推荐不报错!
1、阿里文档
下载工具包:
2、进行安装后点击生成秘钥即可
引入
npm install jsencrypt
import JSEncrypt from 'jsencrypt/bin/jsencrypt.min'
// 密钥对生成 http://web.chacuo.net/netrsakeypair
const publicKey = 'MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAKoR8mX0rGKLqzcWmOzbfj64K8ZIgOdH\n' +
'nzkXSOVOZbFu/TJhZ7rFAN+eaGkl3C4buccQd/EjEsj9ir7ijT7h96MCAwEAAQ=='
const privateKey = 'MIIBVAIBADANBgkqhkiG9w0BAQEFAASCAT4wggE6AgEAAkEAqhHyZfSsYourNxaY\n' +
'7Nt+PrgrxkiA50efORdI5U5lsW79MmFnusUA355oaSXcLhu5xxB38SMSyP2KvuKN\n' +
'PuH3owIDAQABAkAfoiLyL+Z4lf4Myxk6xUDgLaWGximj20CUf+5BKKnlrK+Ed8gA\n' +
'kM0HqoTt2UZwA5E2MzS4EI2gjfQhz5X28uqxAiEA3wNFxfrCZlSZHb0gn2zDpWow\n' +
'cSxQAgiCstxGUoOqlW8CIQDDOerGKH5OmCJ4Z21v+F25WaHYPxCFMvwxpcw99Ecv\n' +
'DQIgIdhDTIqD2jfYjPTY8Jj3EDGPbH2HHuffvflECt3Ek60CIQCFRlCkHpi7hthh\n' +
'YhovyloRYsM+IS9h/0BzlEAuO0ktMQIgSPT3aFAgJYwKpqRYKlLDVcflZFCKY7u3\n' +
'UP8iWi1Qw0Y='
// 加密
export function encrypt(txt) {
const encryptor = new JSEncrypt()
encryptor.setPublicKey(publicKey) // 设置公钥
return encryptor.encrypt(txt) // 对数据进行加密
}
// 解密
export function decrypt(txt) {
const encryptor = new JSEncrypt()
encryptor.setPrivateKey(privateKey) // 设置私钥
return encryptor.decrypt(txt) // 对数据进行解密
}
使用
import { encrypt, decrypt } from '@/utils/jsencrypt.js'
test () {
console.log('密码:123456')
const num = encrypt('123456')
console.log('加密后:' + num)
console.log('解密后:' + decrypt(num))
},
测试:
public static void main(String[] args) throws Exception {
String jiami = "bZEWt/ZCs6A7WoeopCnUs7t/SEoxvF+UH4UZhZm8BzjAjZ2HFHThfu/H9G9BdktIowHXo8mQqS1n08kslgqY7aKwxyg88xZXsJ9BOY5MUAnkbQAG3luejMp4B3Eoz+nL8hMrmrh4yUyRFRIsz7/EGuIkeKLzhq9bwOQ2aZ4LgMh7/hETbQuDtF10aKMcPbwrB/8NCSaoGsQGXEUtUjJxARFXGnrtH2dP4GDfth9rtyJMfpRqXTFyhQMpXrubcI7FmyZonoHQlCPJ+2z2E8XzaQOo3H5YLBb/CVvr2JEFbCuWkvyB+dNVvRS/dYiacrd26UAO9VhzdiOuNc3ePJT4TA==";
System.out.println(decryptByPrivateKey(jiami));
}
完整工具类:
package com.zhifeng.common.Utils;
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;
/**
* @ClassName RsaUtils
* @Author ChangLu
* @Date 2021/11/29 20:05
* @Description TODO
*/
public class RsaUtils {
private static String publicKey = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAmeDbWj1Kh7ndniKQmAa8i9rbSTkANguoHIwDPj5Wt5E1iX6x87E53T0z4FDb5/Fcuo8TR2zdUQZvG3TxF4KXgeJ+jNBZOgnJ/6iSjjo4D/xRFzED3xxgtmLJVJSNhvktT35p9J9rGLdscX61/Dr5DI5Fei6PmrhcEcJn7QyoHeC2LPclL7O5cyibyM6at5Ottnp6enAxIzH5PGGErFUOb1oC6RfWDu1dIjBVs4Jem4pSKTeDtwb7WkdtnBSHmWG71P5j3xPkjcu1DrFAfYzcrm16YxmFqdw8D4KrPq95iPAUFKFAame4QgYHYf++xFiYa6XAKlFAiJHZjUQrV3mISQIDAQAB";
private static String privateKey = "MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCZ4NtaPUqHud2eIpCYBryL2ttJOQA2C6gcjAM+Pla3kTWJfrHzsTndPTPgUNvn8Vy6jxNHbN1RBm8bdPEXgpeB4n6M0Fk6Ccn/qJKOOjgP/FEXMQPfHGC2YslUlI2G+S1Pfmn0n2sYt2xxfrX8OvkMjkV6Lo+auFwRwmftDKgd4LYs9yUvs7lzKJvIzpq3k622enp6cDEjMfk8YYSsVQ5vWgLpF9YO7V0iMFWzgl6bilIpN4O3BvtaR22cFIeZYbvU/mPfE+SNy7UOsUB9jNyubXpjGYWp3DwPgqs+r3mI8BQUoUBqZ7hCBgdh/77EWJhrpcAqUUCIkdmNRCtXeYhJAgMBAAECggEAPLmu9uqvKebgnZJYa5Zk+/Avj7Lt8WYiPrnGYd7qC+FDNnKIOXpcMoH/oetnDR6EEJ975TkCEgKvAC/jIPsJXVmLxXhHbg8E516YD4bMLwrM2ZEfTQH+7JsJhtZlD7nv9qoVmFL9SbDBG/z8RoDjXeAbbP9I7q8Irn2A09ylz7wMnyHl8grNyMf6eSerG/U1zM+LJ5s/tMv5D0Q7Y7fung/lD4lDyG39lXKymwxMNMLCzRavYiYA6Fe2fQ8baKGUVFoNNHJgHx6KmrxoXsPeMJgyO0Q+sCP0ZrPXbZLwQCm9itMFkpQ8xnwL+BSGNNr+Wrj2tK+TA+N4LFxd3u6iAQKBgQDIsHpNoXJheizOpQdcL619LT/MCXhD/rklLZzl4oV5qb/CfVEg3LqUF/h7c9RlsMvT+TpfSA+VEAoz+k8Igf45GAYkIIiDWAVfckMEnJISJfKVIN+ZYCUA8lhNa7SIgaxZnCbOczeEuOrfh0SWFxMsIdmFA7JUZm3nVebik/2dwQKBgQDESaeaGQCZuy5PVLbSAm1dAkrEOdnF4qQ5VbdcJLvKhQ98a5hFi9HmiFRrJIoUG2ePdiSr50RCZ7rgPhbvY+mkoXLalqsWmgIkitnggX0A/TJ2IDN4QZKuVWpJ2upBNCTCbuQiqg15etMXbAYEWKYHR2EjEl23HQm5lG7P1T8ciQKBgDraXhNz/AoP/SHgjYcASF1ELshUIpu2EG+Rr8hOpJvoJt8PRwJfGKwjV3BEqI3lyfBwzyhwBnnNSWCy0AiLrpTpsatYixAReQnjhTnN/Jwr2rbW/BuLcW6Uo0aZBkld1cA1pb+3VBms7Nv+XCOzwqCXkKWMTvinTSWhMGNTyPVBAoGAGAR3KIjUpPrdUMGp2QqI/S9xnI8DkY4I0Ccn13N7Mu2TFoNHz4KrPU0DH1UKPCmaQ1iOZiZXGNT+bb/LKKGODiHfHtX+uzY++t+uhyTw+bUBfqi0A4vqecBj0AOkVDQgJ1ZQPdmW6n1X5O7H0bJTJmLahOMTant4HCgIYw/RuBkCgYEAnWugBURLRAC3b7Sl4J3cAF7roJraWuqmi2iw9glf72BCuN19uvo7hBi8B1L8kKwcvpUIqISSLZfm6HQziRgxqwrDYdjUPJY/Y6ugEC0lRgOoAs22xOmW+AfQwGdXYKJf3Tp+hb9QmTDhngjyq9eU3SeL4kd11rC2veb8XyBUj6s=";
/**
* RSA密钥对对象
*/
public static class RSAKeyPair {
private String publicKey;
private String privateKey;
public RSAKeyPair(String publicKey, String privateKey) {
this.publicKey = publicKey;
this.privateKey = privateKey;
}
public String getPublicKey() {
return publicKey;
}
public String getPrivateKey() {
return privateKey;
}
}
/**
* 构建RSA密钥对
*
* @return
* @throws NoSuchAlgorithmException
*/
public static RSAKeyPair generateKeyPair() throws NoSuchAlgorithmException {
KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
keyPairGenerator.initialize(1024);
KeyPair keyPair = keyPairGenerator.generateKeyPair();
RSAPublicKey rsaPublicKey = (RSAPublicKey) keyPair.getPublic();
RSAPrivateKey rsaPrivateKey = (RSAPrivateKey) keyPair.getPrivate();
String publicKeyString = Base64.encodeBase64String(rsaPublicKey.getEncoded());
String privateKeyString = Base64.encodeBase64String(rsaPrivateKey.getEncoded());
RSAKeyPair rsaKeyPair = new RSAKeyPair(publicKeyString, privateKeyString);
return rsaKeyPair;
}
/**
* 公钥加密
*
* @param publicKeyText
* @param text
* @return
*/
public static String encryptByPublicKey(String publicKeyText, String text) throws Exception {
X509EncodedKeySpec x509EncodedKeySpec2 = new X509EncodedKeySpec(Base64.decodeBase64(publicKeyText));
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
PublicKey publicKey = keyFactory.generatePublic(x509EncodedKeySpec2);
Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.ENCRYPT_MODE, publicKey);
byte[] result = cipher.doFinal(text.getBytes());
return Base64.encodeBase64String(result);
}
/**
* 私钥解密
*
* @param privateKeyText
* @param text
* @return
* @throws Exception
*/
public static String decryptByPrivateKey(String text) throws Exception {
PKCS8EncodedKeySpec pkcs8EncodedKeySpec5 = new PKCS8EncodedKeySpec(Base64.decodeBase64(privateKey));
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
PrivateKey privateKey = keyFactory.generatePrivate(pkcs8EncodedKeySpec5);
Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.DECRYPT_MODE, privateKey);
byte[] result = cipher.doFinal(Base64.decodeBase64(text));
return new String(result);
}
/**
* 公钥解密
*
* @param publicKeyText
* @param text
* @return
* @throws Exception
*/
public static String decryptByPublicKey(String publicKeyText, String text) throws Exception {
X509EncodedKeySpec x509EncodedKeySpec = new X509EncodedKeySpec(Base64.decodeBase64(publicKeyText));
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
PublicKey publicKey = keyFactory.generatePublic(x509EncodedKeySpec);
Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.DECRYPT_MODE, publicKey);
byte[] result = cipher.doFinal(Base64.decodeBase64(text));
return new String(result);
}
/**
* 私钥加密
*
* @param privateKeyText
* @param text
* @return
* @throws Exception
*/
public static String encryptByPrivateKey(String privateKeyText, String text) throws Exception {
PKCS8EncodedKeySpec pkcs8EncodedKeySpec = new PKCS8EncodedKeySpec(Base64.decodeBase64(privateKeyText));
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
PrivateKey privateKey = keyFactory.generatePrivate(pkcs8EncodedKeySpec);
Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.ENCRYPT_MODE, privateKey);
byte[] result = cipher.doFinal(text.getBytes());
return Base64.encodeBase64String(result);
}
// /**
// * 公钥加密私钥解密
// */
// private static void test1(RSAKeyPair keyPair, String source) throws Exception {
// System.out.println("***************** 公钥加密私钥解密开始 *****************");
// String text1 = encryptByPublicKey(keyPair.getPublicKey(), source);
// String text2 = decryptByPrivateKey(keyPair.getPrivateKey(), text1);
// System.out.println("加密前:" + source);
// System.out.println("加密后:" + text1);
// System.out.println("解密后:" + text2);
// if (source.equals(text2)) {
// System.out.println("解密字符串和原始字符串一致,解密成功");
// } else {
// System.out.println("解密字符串和原始字符串不一致,解密失败");
// }
// System.out.println("***************** 公钥加密私钥解密结束 *****************");
// }
//
// /**
// * 私钥加密公钥解密
// *
// * @throws Exception
// */
// private static void test2(RSAKeyPair keyPair, String source) throws Exception {
// System.out.println("***************** 私钥加密公钥解密开始 *****************");
// String text1 = encryptByPrivateKey(keyPair.getPrivateKey(), source);
// String text2 = decryptByPublicKey(keyPair.getPublicKey(), text1);
// System.out.println("加密前:" + source);
// System.out.println("加密后:" + text1);
// System.out.println("解密后:" + text2);
// if (source.equals(text2)) {
// System.out.println("解密字符串和原始字符串一致,解密成功");
// } else {
// System.out.println("解密字符串和原始字符串不一致,解密失败");
// }
// System.out.println("***************** 私钥加密公钥解密结束 *****************");
// }
}
实际使用:
//2、非对称解密密码
try {
loginBody.setPassword(RsaUtil.decryptByPrivateKey(loginBody.getPassword()));
} catch (Exception e) {
throw new ServiceException("请不要尝试篡改密码!");
}
测试:
public static void main(String[] args) throws Exception{
String password = "changlu";
//使用公钥加密
String encryptPassword = encryptByPublicKey(RsaUtil.publicKey, password);
//传入加密过后的密码进行解密
String decodePassword = decryptByPrivateKey(encryptPassword);
System.out.println(decodePassword);
}
工具类:
import org.apache.commons.codec.binary.Base64;
import javax.crypto.Cipher;
import java.security.KeyFactory;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
/**
* @ClassName RsaUtil
* @Author ChangLu
* @Date 4/12/2022 4:00 PM
* @Description 非对称加解密工具类
*/
public class RsaUtil {
private static String publicKey = "xxx";
private static String privateKey = "xxx";
/**
* RSA密钥对对象
*/
public static class RSAKeyPair {
private String publicKey;
private String privateKey;
public RSAKeyPair(String publicKey, String privateKey) {
this.publicKey = publicKey;
this.privateKey = privateKey;
}
public String getPublicKey() {
return publicKey;
}
public String getPrivateKey() {
return privateKey;
}
}
/**
* 私钥解密
*
* @param privateKeyText
* @param text
* @return
* @throws Exception
*/
public static String decryptByPrivateKey(String text) throws Exception {
PKCS8EncodedKeySpec pkcs8EncodedKeySpec5 = new PKCS8EncodedKeySpec(Base64.decodeBase64(privateKey));
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
PrivateKey privateKey = keyFactory.generatePrivate(pkcs8EncodedKeySpec5);
Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.DECRYPT_MODE, privateKey);
byte[] result = cipher.doFinal(Base64.decodeBase64(text));
return new String(result);
}
/**
* 公钥加密
*
* @param publicKeyText
* @param text
* @return
*/
public static String encryptByPublicKey(String publicKeyText, String text) throws Exception {
X509EncodedKeySpec x509EncodedKeySpec2 = new X509EncodedKeySpec(Base64.decodeBase64(publicKeyText));
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
PublicKey publicKey = keyFactory.generatePublic(x509EncodedKeySpec2);
Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.ENCRYPT_MODE, publicKey);
byte[] result = cipher.doFinal(text.getBytes());
return Base64.encodeBase64String(result);
}
}
[1]. 在Vue项目中使用jsencrypt.js对数据进行加密传输
[2]. 利用jsencrypt.js 进行前端RSA加密,java后端解密
数据进行加密传输](https://blog.csdn.net/qq_37816525/article/details/101905567?spm=1001.2101.3001.6650.1&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7Edefault-1.no_search_link&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7Edefault-1.no_search_link)
[2]. 利用jsencrypt.js 进行前端RSA加密,java后端解密
[3]. JsEncrypt.js前端加密,java后端解密:超详细两种加密方式
我是长路,感谢你的耐心阅读。如有问题请指出,我会积极采纳!
欢迎关注我的公众号【长路Java】,分享Java学习文章及相关资料
Q群:851968786 我们可以一起探讨学习
注明:转载可,需要附带上文章链接