一、RSA 加密解密
密钥对生成
1.前端加密解密
(1).vue页面引入
npm install jsencrypt
(2)工具 jsencrypt.js
import JSEncrypt from 'jsencrypt/bin/jsencrypt.min'// 密钥对生成 http://web.chacuo.net/netrsakeypairconst 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);}}
}