RSA之前端加密后端解密

news/发布时间2024/5/14 23:12:19

RSA之前端加密后端解密

RSA加密解密方式有:
(1)公钥加密,私钥解密;
(2)私钥加密,公钥解密;
此文章中以下我使用的是前端公钥加密,后端私钥解密

秘钥对生成

http://web.chacuo.net/netrsakeypair
生成对应的公钥和私钥
在这里插入图片描述

前端公钥加密

前端加密js文件
链接: https://pan.baidu.com/s/1NIMayTcmjbMOf7BqPhPQoA 提取码: t7an
下载js文件并引入

<script th:src="@{/js/jsencrypt.min.js}"></script>
<script type="text/javascript">
function rsaPassword() {var encryptor = new JSEncrypt();encryptor.setPublicKey('公钥字符串'); // 设置公钥var rsaPassword=encryptor.encrypt('要加密的字符串');
}
</script>

后端私钥解密

示例

String encryptPassword=RsaUtil.encryptByPublicKey("要加密的字符串","公钥字符串");
System.out.println("加密:"+encryptPassword);
String decryptPassword=RsaUtil.decryptByPrivateKey(encryptPassword,"私钥字符串");
System.out.println("解密:"+decryptPassword);

后端加解密工具类

import javax.crypto.Cipher;
import java.security.*;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
import java.util.Base64;
import java.util.HashMap;
import java.util.Map;/*** @author 初颜sir*/
public class RsaUtil {//签名算法名称private static final String RSA_KEY_ALGORITHM = "RSA";//RSA密钥长度,默认密钥长度是1024,密钥长度必须是64的倍数,在512到65536位之间,不管是RSA还是RSA2长度推荐使用2048private static final int KEY_SIZE = 2048;/*** 公钥加密(用于数据加密)** @param data         加密前的字符串* @param publicKeyStr base64编码后的公钥* @return base64编码后的字符串* @throws Exception*/public static String encryptByPublicKey(String data, String publicKeyStr) throws Exception {//Java原生base64解码byte[] pubKey = Base64.getDecoder().decode(publicKeyStr);//创建X509编码密钥规范X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(pubKey);//返回转换指定算法的KeyFactory对象KeyFactory keyFactory = KeyFactory.getInstance(RSA_KEY_ALGORITHM);//根据X509编码密钥规范产生公钥对象PublicKey publicKey = keyFactory.generatePublic(x509KeySpec);//根据转换的名称获取密码对象Cipher(转换的名称:算法/工作模式/填充模式)Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());//用公钥初始化此Cipher对象(加密模式)cipher.init(Cipher.ENCRYPT_MODE, publicKey);//对数据加密byte[] encrypt = cipher.doFinal(data.getBytes());//返回base64编码后的字符串return Base64.getEncoder().encodeToString(encrypt);}/*** 私钥解密(用于数据解密)** @param data          解密前的字符串* @param privateKeyStr 私钥* @return 解密后的字符串* @throws Exception*/public static String decryptByPrivateKey(String data, String privateKeyStr) throws Exception {//Java原生base64解码byte[] priKey = Base64.getDecoder().decode(privateKeyStr);//创建PKCS8编码密钥规范PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(priKey);//返回转换指定算法的KeyFactory对象KeyFactory keyFactory = KeyFactory.getInstance(RSA_KEY_ALGORITHM);//根据PKCS8编码密钥规范产生私钥对象PrivateKey privateKey = keyFactory.generatePrivate(pkcs8KeySpec);//根据转换的名称获取密码对象Cipher(转换的名称:算法/工作模式/填充模式)Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());//用私钥初始化此Cipher对象(解密模式)cipher.init(Cipher.DECRYPT_MODE, privateKey);//对数据解密byte[] decrypt = cipher.doFinal(Base64.getDecoder().decode(data));//返回字符串return new String(decrypt);}/*** 私钥加密(用于数据签名)** @param data          加密前的字符串* @param privateKeyStr base64编码后的私钥* @return base64编码后后的字符串* @throws Exception*/public static String encryptByPrivateKey(String data, String privateKeyStr) throws Exception {//Java原生base64解码byte[] priKey = Base64.getDecoder().decode(privateKeyStr);//创建PKCS8编码密钥规范PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(priKey);//返回转换指定算法的KeyFactory对象KeyFactory keyFactory = KeyFactory.getInstance(RSA_KEY_ALGORITHM);//根据PKCS8编码密钥规范产生私钥对象PrivateKey privateKey = keyFactory.generatePrivate(pkcs8KeySpec);//根据转换的名称获取密码对象Cipher(转换的名称:算法/工作模式/填充模式)Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());//用私钥初始化此Cipher对象(加密模式)cipher.init(Cipher.ENCRYPT_MODE, privateKey);//对数据加密byte[] encrypt = cipher.doFinal(data.getBytes());//返回base64编码后的字符串return Base64.getEncoder().encodeToString(encrypt);}/*** 公钥解密(用于数据验签)** @param data         解密前的字符串* @param publicKeyStr base64编码后的公钥* @return 解密后的字符串* @throws Exception*/public static String decryptByPublicKey(String data, String publicKeyStr) throws Exception {//Java原生base64解码byte[] pubKey = Base64.getDecoder().decode(publicKeyStr);//创建X509编码密钥规范X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(pubKey);//返回转换指定算法的KeyFactory对象KeyFactory keyFactory = KeyFactory.getInstance(RSA_KEY_ALGORITHM);//根据X509编码密钥规范产生公钥对象PublicKey publicKey = keyFactory.generatePublic(x509KeySpec);//根据转换的名称获取密码对象Cipher(转换的名称:算法/工作模式/填充模式)Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());//用公钥初始化此Cipher对象(解密模式)cipher.init(Cipher.DECRYPT_MODE, publicKey);//对数据解密byte[] decrypt = cipher.doFinal(Base64.getDecoder().decode(data));//返回字符串return new String(decrypt);}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.bcls.cn/suLc/1791.shtml

如若内容造成侵权/违法违规/事实不符,请联系编程老四网进行投诉反馈email:xxxxxxxx@qq.com,一经查实,立即删除!

相关文章

重复导航到当前位置引起的。Vue Router 提供了一种机制,阻止重复导航到相同的路由路径。

代码&#xff1a; <!-- 侧边栏 --><el-col :span"12" :style"{ width: 200px }"><el-menu default-active"first" class"el-menu-vertical-demo" select"handleMenuSelect"><el-menu-item index"…

SQL中的各种连接的区别总结

前言 今天主要的内容是要讲解SQL中关于Join、Inner Join、Left Join、Right Join、Full Join、On、 Where区别和用法&#xff0c;不用我说其实前面的这些基本SQL语法各位攻城狮基本上都用过。但是往往我们可能用的比较多的也就是左右连接和内连接了&#xff0c;而且对于许多初学…

【Qt】环境安装与初识

目录 一、Qt背景介绍 二、搭建Qt开发环境 三、新建工程 四、Qt中的命名规范 五、Qt Creator中的快捷键 六、QWidget基础项目文件详解 6.1 .pro文件解析 6.2 widget.h文件解析 6.3 widget.cpp文件解析 6.4 widget.ui文件解析 6.5 main.cpp文件解析 七、对象树 八、…

蓝桥杯备赛_python_BFS搜索算法_刷题学习笔记

1 bfs广度优先搜索 1.1 是什么 1.2怎么实现 2案例学习 2.1.走迷宫 2.2.P1443 马的遍历 2.3. 九宫重排&#xff08;看答案学的&#xff0c;实在写不来&#xff09; 2.4.青蛙跳杯子&#xff08;学完九宫重排再做bingo&#xff09; 2.5. 长草 3.总结 1 bfs广度优先搜索 【P…

Linux篇:指令

一 基本常识&#xff1a; 1. 文件文件内容文件的属性 2. 文件的操作对文件内容的操作对文件属性的操作 3. 文件的类型&#xff1a; d&#xff1a;目录文件 -&#xff1a;普通文件 4. 指令是可执行程序&#xff0c;指令的代码文件在系统的某一个位置存在的。/u…

Sora专辑|OpenAI Sora视频生成模型技术报告中英全文+总结+影响分析

▌01. OpenAI Sora 视频生成模型技术报告总结 •不管是在视频的保真度、长度、稳定性、一致性、分辨率、文字理解等方面&#xff0c;Sora都做到了SOTA&#xff08;当前最优&#xff09;。 •技术细节写得比较泛&#xff08;防止别人模仿&#xff09;大概就是用视觉块编码…

springboot746旧物置换网站

springboot746旧物置换网站 获取源码——》公主号&#xff1a;计算机专业毕设大全

【Linux】Linux编译器-gcc/g++ Linux项目自动化构建工具-make/Makefile

目录 Linux编译器-gcc/g使用 1.背景知识 Linux中头文件的目录在 Linux 库 条件编译的典型应用 2.gcc如何完成 动态库 vs 静态库 debug && release Linux项目自动化构建工具-make/Makefile 背景 用法 特殊符号 Linux编译器-gcc/g使用 1.背景知识 预处理&am…

element-ui 自定义表头label(利用 :slot=“header“ slot-scope=“slot“)

<el-table :data"Gbtable" border style"width: 100%"><el-table-column prop" date" label"责任方" align"center" ></el-table-column><el-table-column prop"name" label"柜名"…

【微服务生态】Docker

文章目录 一、基础篇1. 简介2. 下载与安装3. 常用命令3.1 帮助启动类3.2 镜像命令3.3 容器命令 4. Docker 容器数据券5. Docker 镜像5.1 commit 生成镜像5.2 Docker Registry5.3 发布镜像 6. Docker 常规安装软件 二、高级篇1. Dockerfile1.1 概述1.2 基础知识1.3 Dockerfile常…

计算机网络-广域通信网

1.广域网概念和分类 什么是广域网&#xff1f; 广域网是指长距离跨地区的各种局域网、计算机、终端互联在一起&#xff0c;组成一个资源共享的通信网络。 广域网分为传统广域网和现代广域网。 传 统 广 域 网公共交换电话网PSTN公共数据网X.25帧中继网FR综合业务数据网ISDN…

VScode为什么选择了Electron,而不是QT?

选择Electron而不是QT可能是基于以下几个原因&#xff1a; Web技术的普及和开发者生态系统&#xff1a;Web技术如HTML、CSS和JavaScript在开发者中非常普及&#xff0c;开发者生态系统庞大且活跃。使用Electron可以利用这些熟悉的Web技术和丰富的开发者社区资源。跨平台支持&am…

opencv之cvScalar

CV_INLINE CvScalar cvScalar( double val0, double val1 CV_DEFAULT(0), double val2 CV_DEFAULT(0), double val3 CV_DEFAULT(0)) { CvScalar scalar; scalar.val[0] val0; scalar.val[1] val1; scalar.val[2] val2; scalar.val[3] val3; return scalar; } 该函数的…

电脑进水无法开机怎么办 电脑进水开不了机的解决方法

意外总是会不定时打破你的计划&#xff0c;电脑这类电器最怕遇到的除了火还有水&#xff0c;设备进水会导致数据丢失&#xff0c;那么我们遇到电脑进水怎么办&#xff1f;进水之后不正确处理也会引起很多不必要的麻烦. 解决办法 第一步&#xff1a;关机 如果您的电脑是在开…

c语言结构体与共用体

前面我们介绍了基本的数据类型 在c语言中 有一种特殊的数据类型 由程序员来定义类型 目录 一结构体 1.1概述 1.2定义结构体 1.3 结构体变量的初始化 1.4 访问结构体的成员 1.5结构体作为函数的参数 1.6指向结构的指针 1.7结构体大小的计算 二共用体 2.1概述 2.2 访…

C# OpenCvSharp DNN Image Retouching

目录 介绍 模型 项目 效果 代码 下载 C# OpenCvSharp DNN Image Retouching 介绍 github地址&#xff1a;https://github.com/hejingwenhejingwen/CSRNet (ECCV 2020) Conditional Sequential Modulation for Efficient Global Image Retouching 模型 Model Properti…

PHP脉聊交友系统网站源码,可通过广告变现社交在线聊天交友即时通讯APP源码,附带视频搭建教程

探索全新社交体验&#xff1a;一站式PHP交友网站解决方案 &#x1f310; 全球化交友&#xff0c;无界沟通 在数字化的浪潮下&#xff0c;社交已不再受地域限制。我们的PHP交友网站不仅支持多国语言&#xff0c;还配备了即时翻译功能&#xff0c;让您轻松跨越语言障碍&#xff…

【AI学习】LangChain学习

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学习,不断总结,共同进步,活到老学到老导航 檀越剑指大厂系列:全面总结 jav…

C++初阶篇----新手进村

目录 一、什么是C二、C关键字三、命名空间3.1命名空间的定义3.2命名空间的使用 四、C输入和输出五、缺省参数5.1缺省参数的概念5.2缺省参数的分类 六、函数重载6.1函数重载的概念6.2函数重载的原理----名字修饰 七、引用7.1引用概念7.2引用特性7.3常引用7.4引用的使用7.5传值、…

Vue3实现带动画效果的tab栏切换

效果图如下所示&#xff1a; 实现思路&#xff1a; 其实很简单 1、首先切换tab栏时tab标签激活下标与对应显示内容下标要一致。 2、其次点击tab栏切换时更新下标 3、最后就是css添加动画效果 这样就了&#xff01;&#xff01;&#xff01; 上全部代码 <template><…
推荐文章