加密解密记录

一、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);
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值