一、RSA 加密解密
密钥对生成
1.前端加密解密
(1).vue页面引入
npm install jsencrypt
(2)工具 jsencrypt.js
import JSEncrypt from 'jsencrypt/bin/jsencrypt.min'
// 密钥对生成 http://web.chacuo.net/netrsakeypair
const publicKey = 'MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAzkg89iPFXYTyMpUXax1l DUB5bX0b44S5tGUqyCQ0mjG+8bM0pM0Qab1st2zH86PMnq9tybARciaJYE5zGK8X cFsMRznYnhUpizLlr1omr/KMALYpsGO35XSd/re0AidyJXf9TVLdAWalFyoFWQUS 9pbsnsZX+317NvNw5YfVPRpmeVi6zbUZGOS2oKFTX6rePVJ5QFPaYGKPjiO/BEza turBCGxtJr9sC51TZFzrdPto4BjqXkn1xiyIxMzbFwqmU6IrqfYuhIBoRWeIPD2S +z4Z6FyETQGWsfposqg8cs1noVyGqcISt8rzpCRg3gGfCacoHpAbspPAw6/AF0wO LQIDAQAB'
const privateKey = 'MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDOSDz2I8VdhPIy lRdrHWUNQHltfRvjhLm0ZSrIJDSaMb7xszSkzRBpvWy3bMfzo8yer23JsBFyJolg TnMYrxdwWwxHOdieFSmLMuWvWiav8owAtimwY7fldJ3+t7QCJ3Ild/1NUt0BZqUX KgVZBRL2luyexlf7fXs283Dlh9U9GmZ5WLrNtRkY5LagoVNfqt49UnlAU9pgYo+O I78ETNq26sEIbG0mv2wLnVNkXOt0+2jgGOpeSfXGLIjEzNsXCqZToiup9i6EgGhF Z4g8PZL7PhnoXIRNAZax+miyqDxyzWehXIapwhK3yvOkJGDeAZ8JpygekBuyk8DD r8AXTA4tAgMBAAECggEAdxw7Jx1Mj01+1DpGhXE5skcyVkhRXDR9Tm7EH0DYpthm mwWRNj+6ZHQeXGORqVtBgbdmO3lQ+YrK9DMYPn6LmDLaih4auF0b2eaPvYren+X7 dUW6GMHbo8CMolHMvRmtzXjVaFqahn6QgSmgYOCPLJfFFYENuIeiJ/61h7PBK0AT Cfkrg7BNf/X23u26siTcRboyf3fESJq4V/XRtH7pEDTNX7V9nssbFXGxNXA4UZts lzbGZh0vYKF0wuy1Wfwp4RpdR0JK852l6CWT3VBL4na+kB9E5Q1RjttVRaAYtWTF maCwdDeY7VeOnSJorG0r8yw1VINgDxJ9HTB3LrPpwQKBgQD4p9ve6TzoU747ueDU w8Rx7q/1A+YfTU8lu5CW75tuTCzH/g69g2BTZlGu2PDGevv2qdf9IJtKvbR3Czby 90rNFK0BVumccDc1qufm6gi+QyfZjONx+27SCN7+F/OHqkZe7TSZA49zbXYUwRTS K5TfzFvQqdDF5b8Qe3scBv7pdQKBgQDUX/vQWHn36l/zG93Njppot77qFANOUX8G K4GK+BK07g0SWf9RvQvf21ejr0Dq/QfAjzsVm7fbvfsmwuzA6NkjEfuFlh6zBnfB 5oba5gUW1bMfxXe2MOyTaRBZGocKVimTc1h5IwLXG8kGhmacP5H3IRjKVXmVnimP hzseg+hC2QKBgQCzsZLaX5GNj989CFIrUCJp94UfOqcV3eehrA+MlDGuHsyJ5ta+ K+/ztVC4W7x8oyntEsas/eBbvgZptSgLo5xh4lw4SJfgXtP3K8AVBvI0lRF6TS+d Eof+rzx/Qc3TL8FVHnTRU1panzMjQnmKfMZEiUmc3Our6CEQhzvrgD69dQKBgAOJ EYUXY/hnk29VoGyimhlyLaBx8tgj7SxqHv70QEN4zwjmLKTss7znRt83tKn0ymM/ PymN7RKgaATuK8jOV4cI7pn7tMkgK3Az6TzNpXoK1q+JtwN2bwnJLvd8xJC8fHay 7d8eYRa5pLASHrUtLb3idCoyIBMIjgKQqsBIS96JAoGBAO/pzcrHxpmcOuHlmFbG 0RvFDgPsxKIaExfFPCJNaWbKreqCJlzd5jZ8RvDfI2Md1bhFICOezCkVWkrZFXkN l0JrwbEFnuuMghKBT5HYrRzt90mJXU0BWRwYA+H21uzBXcWfw2e+5mA+RZFGQu7I WpNCkdMST22/aGMBSjcBC3pP'
// 加密
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) // 对数据进行解密
}
(3)使用
import {encrypt, decrypt} from '@/utils/jsencrypt'
methods: {
cl(){
let encrypt=encrypt(this.loginForm.password);
let decrypt=decrypt(encrypt);
}
}
4.后端解密
<!-- https://mvnrepository.com/artifact/org.bouncycastle/bcpkix-jdk15on -->
<dependency>
<groupId>org.bouncycastle</groupId>
<artifactId>bcpkix-jdk15on</artifactId>
<version>1.70</version>
</dependency>
(1)工具类
package com.ruoyi.common.utils;
import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.NoSuchPaddingException;
import java.nio.charset.StandardCharsets;
import java.security.*;
import java.security.spec.InvalidKeySpecException;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
import java.util.Base64;
public class RsaUtil {
/**
* 加密算法
*/
private static final String ALGORITHM = "RSA";
private static final String publicKey = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAzkg89iPFXYTyMpUXax1l DUB5bX0b44S5tGUqyCQ0mjG+8bM0pM0Qab1st2zH86PMnq9tybARciaJYE5zGK8X cFsMRznYnhUpizLlr1omr/KMALYpsGO35XSd/re0AidyJXf9TVLdAWalFyoFWQUS 9pbsnsZX+317NvNw5YfVPRpmeVi6zbUZGOS2oKFTX6rePVJ5QFPaYGKPjiO/BEza turBCGxtJr9sC51TZFzrdPto4BjqXkn1xiyIxMzbFwqmU6IrqfYuhIBoRWeIPD2S +z4Z6FyETQGWsfposqg8cs1noVyGqcISt8rzpCRg3gGfCacoHpAbspPAw6/AF0wO LQIDAQAB";
private static final String privateKey = "MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDOSDz2I8VdhPIy lRdrHWUNQHltfRvjhLm0ZSrIJDSaMb7xszSkzRBpvWy3bMfzo8yer23JsBFyJolg TnMYrxdwWwxHOdieFSmLMuWvWiav8owAtimwY7fldJ3+t7QCJ3Ild/1NUt0BZqUX KgVZBRL2luyexlf7fXs283Dlh9U9GmZ5WLrNtRkY5LagoVNfqt49UnlAU9pgYo+O I78ETNq26sEIbG0mv2wLnVNkXOt0+2jgGOpeSfXGLIjEzNsXCqZToiup9i6EgGhF Z4g8PZL7PhnoXIRNAZax+miyqDxyzWehXIapwhK3yvOkJGDeAZ8JpygekBuyk8DD r8AXTA4tAgMBAAECggEAdxw7Jx1Mj01+1DpGhXE5skcyVkhRXDR9Tm7EH0DYpthm mwWRNj+6ZHQeXGORqVtBgbdmO3lQ+YrK9DMYPn6LmDLaih4auF0b2eaPvYren+X7 dUW6GMHbo8CMolHMvRmtzXjVaFqahn6QgSmgYOCPLJfFFYENuIeiJ/61h7PBK0AT Cfkrg7BNf/X23u26siTcRboyf3fESJq4V/XRtH7pEDTNX7V9nssbFXGxNXA4UZts lzbGZh0vYKF0wuy1Wfwp4RpdR0JK852l6CWT3VBL4na+kB9E5Q1RjttVRaAYtWTF maCwdDeY7VeOnSJorG0r8yw1VINgDxJ9HTB3LrPpwQKBgQD4p9ve6TzoU747ueDU w8Rx7q/1A+YfTU8lu5CW75tuTCzH/g69g2BTZlGu2PDGevv2qdf9IJtKvbR3Czby 90rNFK0BVumccDc1qufm6gi+QyfZjONx+27SCN7+F/OHqkZe7TSZA49zbXYUwRTS K5TfzFvQqdDF5b8Qe3scBv7pdQKBgQDUX/vQWHn36l/zG93Njppot77qFANOUX8G K4GK+BK07g0SWf9RvQvf21ejr0Dq/QfAjzsVm7fbvfsmwuzA6NkjEfuFlh6zBnfB 5oba5gUW1bMfxXe2MOyTaRBZGocKVimTc1h5IwLXG8kGhmacP5H3IRjKVXmVnimP hzseg+hC2QKBgQCzsZLaX5GNj989CFIrUCJp94UfOqcV3eehrA+MlDGuHsyJ5ta+ K+/ztVC4W7x8oyntEsas/eBbvgZptSgLo5xh4lw4SJfgXtP3K8AVBvI0lRF6TS+d Eof+rzx/Qc3TL8FVHnTRU1panzMjQnmKfMZEiUmc3Our6CEQhzvrgD69dQKBgAOJ EYUXY/hnk29VoGyimhlyLaBx8tgj7SxqHv70QEN4zwjmLKTss7znRt83tKn0ymM/ PymN7RKgaATuK8jOV4cI7pn7tMkgK3Az6TzNpXoK1q+JtwN2bwnJLvd8xJC8fHay 7d8eYRa5pLASHrUtLb3idCoyIBMIjgKQqsBIS96JAoGBAO/pzcrHxpmcOuHlmFbG 0RvFDgPsxKIaExfFPCJNaWbKreqCJlzd5jZ8RvDfI2Md1bhFICOezCkVWkrZFXkN l0JrwbEFnuuMghKBT5HYrRzt90mJXU0BWRwYA+H21uzBXcWfw2e+5mA+RZFGQu7I WpNCkdMST22/aGMBSjcBC3pP";
public static void main(String[] args) throws Exception {
String original = "你好呀!";
String encrypted = encrypt(original);
System.out.println("加密结果: " + encrypted);
String decrypted = decrypt(encrypted);
System.out.println("解密结果: " + decrypted);
}
/**
* 加密
* @param content
* @return
*/
public static String encrypt(String content) {
if (StringUtils.isEmpty(content))return content;
//处理公钥
String publicKeyPEM = publicKey
.replace("-----BEGIN PUBLIC KEY-----", "")
.replace("-----END PUBLIC KEY-----", "")
.replaceAll("\\s", "");
byte[] publicBytes = Base64.getDecoder().decode(publicKeyPEM);
X509EncodedKeySpec x509EncodedKeySpec = new X509EncodedKeySpec(publicBytes);
try {
KeyFactory rsaInstance = KeyFactory.getInstance(ALGORITHM);
PublicKey publicKey = rsaInstance.generatePublic(x509EncodedKeySpec);
Cipher cipher = Cipher.getInstance(ALGORITHM);
cipher.init(Cipher.ENCRYPT_MODE, publicKey);
byte[] bytes = cipher.doFinal(content.getBytes(StandardCharsets.UTF_8));
return Base64.getEncoder().encodeToString(bytes);
} catch (Exception ex) {
ex.printStackTrace();
}
return null;
}
/**
* 解密
* @param encryptedBase64
* @return
* @throws Exception
*/
public static String decrypt(String encryptedBase64) {
if (StringUtils.isEmpty(encryptedBase64))return encryptedBase64;
try {
//处理私钥(将私钥转换为PKCS8格式)
String privateKeyPEM = privateKey
.replace("-----BEGIN PRIVATE KEY-----", "")
.replace("-----END PRIVATE KEY-----", "")
.replaceAll("\\s", "");
byte[] keyBytes = Base64.getDecoder().decode(privateKeyPEM);
PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(keyBytes);
KeyFactory keyFactory = KeyFactory.getInstance(ALGORITHM);
PrivateKey privateKey = keyFactory.generatePrivate(keySpec);
// 使用私钥进行解密
Cipher cipher = Cipher.getInstance(ALGORITHM);
cipher.init(Cipher.DECRYPT_MODE, privateKey);
byte[] decryptedBytes = cipher.doFinal(Base64.getDecoder().decode(encryptedBase64));
return new String(decryptedBytes);
} catch (NoSuchAlgorithmException e) {
throw new RuntimeException(e);
} catch (InvalidKeySpecException e) {
throw new RuntimeException(e);
} catch (NoSuchPaddingException e) {
throw new RuntimeException(e);
} catch (InvalidKeyException e) {
throw new RuntimeException(e);
} catch (IllegalBlockSizeException e) {
throw new RuntimeException(e);
} catch (BadPaddingException e) {
throw new RuntimeException(e);
}
}
}