RSA加密算法完整加密流程

news2024/9/28 19:26:05

RSA完整加密流程总结

1.1-RSA加密介绍

  1. RSA公钥加密算法是1977年由罗纳德·李维斯特(Ron Rivest)、阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)一起提出的。1987年7月首次在美国公布,当时他们三人都在麻省理工学院工作实习。RSA就是他们三人姓氏开头字母拼在一起组成的。

  1. RSA是目前最有影响力和最常用的公钥加密算法,它能够抵抗到目前为止已知的绝大多数密码攻击,已被ISO推荐为公钥数据加密标准。

  1. 今天只有短的RSA钥匙才可能被强力方式解破。到2008年为止,世界上还没有任何可靠的攻击RSA算法的方式。只要其钥匙的长度足够长,用RSA加密的信息实际上是不能被解破的。但在分布式计算和量子计算机理论日趋成熟的今天,RSA加密安全性受到了挑战和质疑。

  1. RSA算法基于一个十分简单的数论事实:将两个大质数相乘十分容易,但是想要对其乘积进行因式分解却极其困难,因此可以将乘积公开作为加密密钥。

1.2-关于公钥和私钥

1.公钥是谁所持有的?

服务器和客户端

2.私钥是谁所持有的?

服务器

3.哪一把钥匙用来加密?

公钥

4.哪一把钥匙用来解密?

私钥

1.3-RSA加密完整流程

服务端需要准备两把钥匙,公钥和私钥

百度搜索:openssl.exe工具

安装包路径默认在:C:\OpenSSL-Win64\bin

1.客户端需要加密时,先向服务端发起一个请求,请求RSA的公钥

2.服务端获取到请求之后,生成公钥,返回给客户端

3.客户端拿到公钥之后,使用公钥加密明文

4.客户端将公钥加密之后的密文发给服务器

5.服务端获取客户端密文,使用私钥解密可以得到明文

1.4-服务端生成公钥私钥流程

1.打开终端生成公私钥

* genrsa -out rsa_private_key.pem 1024

* 如果是java开发者则需要将私钥转成PKCS8格式,nodejs可以不用

* pkcs8 -topk8 -inform PEM -in rsa_private_key.pem -outform PEM -nocrypt -out rsa_private_key_pkcs8.pem

2.生成公钥 rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem

3.退出程序

exit:方便下一次继续生成,每一次进入和退出生成的公私钥都是不一样的

4.将刚刚生成的两个公私钥证书放入项目目录

使用文件读写来读取公钥和私钥

1.5-服务端编写一个rsa模块用于RSA加密和解密


//导入nodejs内置加密模块
var crypto = require('crypto');
//文件读写模块
var fs = require('fs');

//读取私钥pem证书文件
var privatePem = fs.readFileSync('./rsa_private_key.pem');
//读取公钥pem证书文件
var publicPem = fs.readFileSync('./rsa_public_key.pem');
//将公私钥转化为字符串
var prikey = privatePem.toString();
var pubkey = publicPem.toString();

///< rsa加解密  

///< 公钥加密  

var rsa = module.exports;

//浏览器只需要公钥
rsa.encrypt = function(){
    return pubkey;
};

//解密
rsa.decrypt = function(data){

    //1.由于jsencrypt加密之后是base64格式,所以这里需要转成base64格式的二进制
    var buff = new Buffer(data,'base64');
//     //使用私钥解密 第一个参数是私钥 第二个参数是密文(二进制)
    //console.log(crypto.constants);
    //padding是设置加密填充模式(文本不足时的填充),jsencrypts使用的是RSA_PKCS1_PADDING模式
    //(不同的模式对同样的字符串加密会得到不同的密文,所以使用什么模式加密就必须使用什么模式解密)
     var dedata = crypto.privateDecrypt({key:prikey,padding:crypto.constants.RSA_PKCS1_PADDING},buff);
console.log('解密' + dedata.toString());

     return dedata.toString();
};


//将base64格式钥匙转成16进制
// var cipher = crypto.createCipher('blowfish', publicPem);
// console.log(cipher.update(key,'base64','hex'));

//AES加密钥匙
rsa.AESKey = 'welcom to itheima learn big qianduan';

1.6-客户端RSA公钥加密流程

前端rsa加密我们需要借助npm第三方:https://www.npmjs.com/package/jsencrypt

npm install jsencrypt

该第三方可以使用npm来安装,但是该第三方只能用于网页端,不支持node端

使用我们项目案例的注册界面来演示


<script src="/node_modules/jquery/dist/jquery.js"></script>
  <!-- rsa加密 -->
  <script src="/node_modules/jsencrypt/bin/jsencrypt.js"></script>
  <script>

    $('#form').on('submit', function (e) {
      e.preventDefault();
      //1.先获取公钥
      $.ajax({
          url: '/publicKey',
          type: 'get',
          dataType: 'json'
          }).then(function (data) {
            console.log(data.key);

          // 2.使用服务器返回的公钥加密 

          //2.1创建encrypt对象
          var encrypt = new JSEncrypt();
          //2.2设置公钥
          encrypt.setPublicKey(data.key);
          //2.3开始加密  这里动态获取密码输入框文本,原因是什么?
          var encrypted = encrypt.encrypt($('[name="password"]').val());
          //设置密码框的值为密文
          $('[name="password"]').val(encrypted);

          console.log(encrypted);
          //此时再获取表单数据就是已经加密好的数据
          //3.再一次提交注册表单
          $.ajax({
            url: '/register',
            type: 'post',
            data: $('#form').serialize(),
            dataType: 'json'
          }).then(function (data) {

            var err_code = data.err_code;
            if (err_code === 2000) {
              //暂时先跳转回首页
              window.location.href = '/';
            } else if (err_code === 2001) {
              window.alert(data.err_message);
            }
            else{
               window.alert(data.err_message);
            }
          });
      });

    });

  </script>

1.7-服务端RSA私钥解密流程

1.处理路由,如果请求路径是:/publicKey,返回公钥

2.处理路由:如果请求路径是:/register

(1)获取bosy数据

(2)将bosy的password使用私钥解密

RSA加密的最大特点就是只能用公钥加密,只能用私钥解密

(3)存入数据库

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

实习------Spring 框架学习

Spring 是什么&#xff08;了解&#xff09; 在不同的语境中&#xff0c;Spring 所代表的含义是不同的。下面我们就分别从“广义”和“狭义”两个角度&#xff0c;对 Spring 进行介绍。 广义上的 Spring 泛指以 Spring Framework 为核心的 Spring 技术栈。 经过十多年的发展&…

【原创】升级需谨慎,开发两行泪!——记一次MySQL驱动包升级引发的事故

一、背景最近项目组在版本迭代时&#xff0c;组件也要进行升级&#xff0c;此时涉及到MySQL驱动包jdbc的版本升级。即从5.1.X升级到8.0.X。然鹅在上线之后就出现了一部分兼容性问题&#xff0c;造成了一次“事故”&#xff1a;调用接口出现“系统错误”。查看日志&#xff1a;j…

C. Least Prefix Sum(可以后悔的拿取+multiset)

Problem - C - Codeforces 波罗的海&#xff0c;一个著名的棋手&#xff0c;同时也是一个数学家&#xff0c;他有一个数组a1,a2,...,an&#xff0c;他可以进行以下几次&#xff08;可能是0次&#xff09;操作。 选择某个索引i&#xff08;1≤i≤n&#xff09;。 将ai与-1相乘&…

Ffmpeg中AVFrame数据保存成YUV--讨论AVFrame的linesize

目录 YUV播放器 AVFrame中保存成YUV实现 linesize的意义 实测(PC机-64bits-win10) 总结&#xff1a; YUV播放器 首先要有一个YUVplayer用来播放测试的YUV数据&#xff0c;雷神改良过的YUV播放器&#xff1a; 修改了一个YUV/RGB播放器_雷霄骅的博客-CSDN博客 播放器播放界…

查询是: LOCK TABLE test.xx_test IN ACCESS SHARE MODE问题解决办法

如题所示&#xff0c;这个问题是我在postgresql中使用pg_dump备份多个schema的表时遇到的问题。bin\pg_dump --dbnamepostgresql://dbuser:123456localhost:5432/test --table public.xx_user --table test.xx_test -f d:\tools\pgsql\dump.sql pg_dump: 错误: 查询失败: 閿欒…

react生命周期(类组件/函数组件)

1.react代码模式分为两种 类组件和函数组件&#xff08;生命周期也有所不同&#xff09; 2.类组件&#xff08;写法如下&#xff09; import React from react export default class App1 extends React.Component{state {username:,password:}setUser (event) > {this.s…

《MySQL系列-InnoDB引擎12》启动、关闭与恢复

启动、关闭与恢复 InnoDB是MySQL数据库得存储引擎之一&#xff0c;因此InnoDB存储引擎得启动和关闭&#xff0c;可以说是MySQL实例得启动过程中对InnoDB存储引擎的处理过程。 在关闭时&#xff0c;参数innodb_fast_shutdown影响着表的存储引擎为InnoDB的行为。该参数可取值为0、…

BIOS(控制权交接第一棒)

计算机系统的控制权&#xff08;CPU的使用权&#xff09;交接的第一棒是BIOS&#xff01;接下来&#xff0c;我们简单学习一下BIOS相关知识。 在计算机接电后按下开机键&#xff0c;首先运行的软件是基本输入输出系统&#xff08;Basic Input Output System&#xff0c;BIOS&a…

阿里云故障有感

2304阿里云故障有感 为什么会写一个如此奇怪的议题。 人的生活轨迹&#xff0c;不一定只有唯一的叙事方式&#xff0c;可以不那么苦&#xff0c;不那么累&#xff0c;不那么怕&#xff0c;不那么憋屈。 不再去追求宏大的叙事&#xff0c;而是去关心自己的感受&#xff0c;吃没…

Spring Boot学习篇(六)

Spring Boot学习篇(六) mybatis-plus使用篇(二) 1 新增 1.1 示例代码 AutowiredISongsService songsService; Testpublic void add(){Songs snew Songs(null,"11","xx",null,"xx歌曲","2020-02-12");songsService.save(s);System.…

linux之vim编辑器

文章目录1. 概念2.安装3. vim的使用1.使用一些按键没有反应2. 模式转换1.命令模式转换到插入模式1. a2. i3. o2.命令模式切换到底行模式1. 退出3. 整体概念图4. 热键的使用1. 命令模式下1.复制——yy 粘贴——p复制若干行—— n yy粘贴若干行—— n p2. 撤销操作——u3. 对撤销…

03-Alibaba微服务组件Nacos注册中心实战

什么是 Nacos Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集&#xff0c;帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。 Nacos 的关键特性包括: 服务发现和服务健康监测 动态配置服务 动态 DNS 服务 服务及其元数据管理 Nacos…

陆道培医疗冲刺香港上市:持续亏损,毛利率下滑,陆佩华为董事长

2023年1月3日&#xff0c;陆道培医疗集团&#xff08;下称“陆道培医疗”&#xff09;在港交所递交招股书&#xff0c;准备在港交所主板上市。本次冲刺上市&#xff0c;陆道培医疗拟将募资金额用于河北燕达陆道培医院的扩建及搬迁及上海陆道培医院的开业等。 同时&#xff0c;陆…

新生儿只是睡?了解了他的生长发育情况后就不这么觉得了

在网上看到这样一句话&#xff0c;说:所谓坐月子&#xff0c;其实就是把最需要照顾的产妇和新生儿捆在一起&#xff0c;让他们互相治愈。是的&#xff0c;在很多人眼里&#xff0c;新生儿除了吃饭就是睡觉&#xff0c;照顾起来真的很容易&#xff0c;但是只要了解了新生儿的生长…

Android开发常见问题:为什么不要用Timer?

前言 从刚开始做Android开始&#xff0c;就时刻谨记一条规则&#xff1a;如果有能实现功能的Android API&#xff0c;就不要用Java API。所以我很少用Timer&#xff0c;直到前一阵一个朋友问我&#xff1a; 我有一个Timer计时器&#xff0c;我看logcat已经启动了&#xff0c;为…

嵌入式应该从哪里入手?

就从目前IT行业大的方向上来讲嵌入式工程师相对来讲是非常吃香的&#xff0c;学习嵌入式开发的朋友数量也是非常的多的&#xff0c;那么对于对嵌入式工程师我们应该从哪里入手呢? 下面就根据我自身多年的一个实际的工作经验来给哪些不知道怎么入门的朋友来简单的介绍一下。 前…

C语言进阶——指针(一)

目录 一. 字符指针 二. 指针数组 三. 数组指针 四. 数组参数、指针参数 1.一维数组传参 2.二维数组传参 3.一级指针传参 4.二级指针传参 一. 字符指针 在之前&#xff0c;我们就了解到过字符指针 int main() {char aW;//字符变量char* pa&a;//字符指针*…

1.3日报

今天优化了getMobileByScene接口&#xff0c; 测试accountadd接口 遇到的问题与解决 在升级安装python3时&#xff0c;由于操作失误&#xff0c;导致系统错误&#xff0c;在同事帮助下重装了系统&#xff0c;好在保住了文件。但是软件还得重新配置。 getMobileByScene接口在…

精益|什么是价值流图分析(VSM)?

在精益生产管理中&#xff0c;价值流研究主要是指利用制作价值流图&#xff0c;进行价值流图研究可以发现并消除浪费、降低成本&#xff0c;改进企业运营状况&#xff0c;提升企业竞争力。因此进行价值流研究离不开价值流图。 价值流图&#xff08;Value Stream Mapping&#x…

基于KT6368A蓝牙芯片开发智能抖音翻页翻页笔总结

一、功能简介 KT6368A蓝牙芯片也是基于 HID 开发&#xff0c;主要用于浏览当下火爆的抖音等小视频的上下翻页、左右菜单切换、暂停等操作。打开手机蓝牙进行连接&#xff0c;进入视频浏览界面操作对应按键即可。包含一个蓝牙的指示灯&#xff0c;表示是否连接 。同时支持adkey按…