C# | 上位机开发新手指南(九)加密算法——RSA

news2024/10/5 21:19:50

在这里插入图片描述

上位机开发新手指南(九)加密算法——RSA

文章目录

  • 上位机开发新手指南(九)加密算法——RSA
    • 前言
    • RSA的特性
      • 非对称性
      • 安全性
      • 可逆性
      • 签名
      • 速度较慢
      • 密钥管理
    • RSA算法的参数
      • 公钥
        • 公钥指数e
        • 模数n
      • 私钥
        • 私钥指数d
        • 模数n
        • 质数p和q
        • dp和dq
        • qInv
      • 质数
      • 填充方式
      • 密钥长度
    • RSA在HTTPS中的应用
      • HTTPS实现加密通信的流程
      • 对称与非对称各取所长
    • C#中使用RSA
      • RSACryptoServiceProvider类
        • 核心参数
        • 核心方法
        • 使用建议
      • 示例代码
    • 结束语

前言


RSA的特性

非对称性

RSA算法使用公钥和私钥两个不同的密钥,公钥用于加密数据,私钥用于解密数据。公钥可以公开,任何人都可以使用,而私钥只有密钥持有人可以访问。

安全性

RSA算法基于大数分解难题,即将一个大的合数分解成其质数因子的乘积。由于目前没有有效的算法可以在合理的时间内对大质数进行分解,因此RSA算法被认为是一种安全的加密算法。

可逆性

RSA算法既可以用于加密,也可以用于解密。加密和解密都是可逆的过程,只要使用正确的密钥,就可以还原原始数据。

签名

RSA算法可以用于数字签名,用于验证数据的完整性和真实性。签名过程是将数据使用私钥进行加密,验证过程是将签名使用公钥进行解密。

速度较慢

RSA算法的加密和解密速度较慢,尤其是对于大的数据块。因此在实际应用中,通常使用RSA算法来传输对称密钥,然后使用对称加密算法来加密数据。

密钥管理

RSA算法需要管理公钥和私钥,其中私钥需要保护密钥持有人的私密信息。此外,RSA算法还需要注意密钥的长度,以确保安全性。


RSA算法的参数

公钥

RSA公钥由两个参数组成,即公钥指数e模数n

公钥指数e

公钥指数是一个大整数,通常为65537。在RSA加密过程中,明文数据会被加密为一个新的数值,该数值与明文数据的指数e取模后得到密文数据。公钥指数e可以是任何大于1且不与欧拉函数φ(n)共有质因子的正整数。

模数n

模数n是两个大质数p和q的乘积,即n = p*q。在RSA加密和解密过程中,模数n作为加密和解密的公共参数。模数n的长度取决于所使用的密钥长度,通常为1024位或2048位。模数n越大,加密强度越高,但加密和解密的速度也会变慢。

私钥

RSA私钥由多个参数组成,包括私钥指数d模数n质数p质数qdpdqqInv

私钥指数d

私钥指数是一个大整数,用于解密数据。在RSA解密过程中,密文数据会被解密为一个新的数值,该数值与私钥指数d取模后得到明文数据。

模数n

与公钥模数相同。

质数p和q

质数p和q是私钥的关键参数,用于计算私钥参数dp、dq和qInv。p和q必须是两个不同的质数,且长度必须相等。

dp和dq

私钥参数dp和dq是通过质数p和q计算得到的,用于解密数据。dp和dq的计算公式为:dp = d mod (p-1) 和 dq = d mod (q-1)。

qInv

qInv是q的乘法逆元,用于计算私钥参数dp和dq。计算公式为:qInv = q^-1 mod p。

质数

RSA算法的安全性基于质数分解难题,因此质数是RSA算法的关键参数。通常选择两个大质数作为RSA算法的质数,其大小一般为512位或1024位。

填充方式

RSA算法在加密和解密过程中需要对数据进行填充,以增强安全性和可靠性。

密钥长度

密钥长度是指模数的位数,一般为1024位或2048位。密钥长度越长,加密强度越高,但加密和解密的速度也会变慢。


RSA在HTTPS中的应用

RSA加密算法的应用非常广泛,其中就包含在HTTPS中的应用。接下来我们就以RSA在HTTPS中的应用为例,来详细讲解RSA是如何帮助客户端与服务端实现安全通信的。

HTTPS实现加密通信的流程

HTTPS中使用加密算法进行加密通信的流程如下:

  1. 客户端向服务器发起HTTPS请求,请求中包含了客户端支持的加密算法列表。

  2. 服务器从客户端发送的加密算法列表中选择一种非对称加密算法(如RSA),并向客户端发送自己的数字证书,其中包含了服务器的公钥和其他身份信息。

  3. 客户端收到服务器发送的数字证书后,使用自己内置的证书颁发机构(CA)的公钥对数字证书进行解密,以验证服务器的真实性和合法性。

  4. 客户端使用服务器的公钥对一个随机生成的会话密钥进行加密,然后将加密后的数据发送给服务器。

  5. 服务器收到客户端发送的加密数据后,使用自己的私钥对数据进行解密,以获取会话密钥。

  6. 服务器使用会话密钥对通信过程中的数据进行对称加密,然后将加密后的数据发送给客户端。

  7. 客户端收到服务器发送的加密数据后,使用会话密钥对数据进行解密,以获取原始数据。

思考:从上述的流程中,我们看到HTTPS通信中不仅使用了非对称加密,还使用了对称加密。既然同是加密算法,为什么不直接使用非对称加密(如RSA)对通信数据加密呢?

对称与非对称各取所长

从之前的流程中,我们看到HTTPS通信中不仅使用了非对称加密,还使用了对称加密,这是因为对称加密和非对称加密分别具有不同的优缺点,通过两种加密方式的组合,可以充分发挥它们各自的优势,实现更高效和安全的通信。

首先,对称加密算法具有加密速度快的优点,但是其安全性较低,容易受到中间人攻击等安全威胁。因此,在HTTPS通信中,为了保证通信数据的安全性,会话密钥采用对称加密算法进行加密,但是为了保证传输过程中的安全性,会话密钥本身采用非对称加密算法进行加密,即服务器使用自己的私钥对会话密钥进行加密,然后将加密后的会话密钥发送给客户端,客户端使用服务器的公钥对会话密钥进行解密,从而获取会话密钥,以实现对称加密通信。

其次,非对称加密算法具有较高的安全性,但是加密速度较慢,因此,在HTTPS通信中,RSA算法通常用于加密和签名数字证书,以验证网站的真实性和合法性,同时也用于对会话密钥进行加密,以保证通信过程中的安全性。

因此,HTTPS通信中采用对称加密和非对称加密的组合方式,既保证了加密速度的快捷和通信效率的高效,又保证了通信数据的安全性和可靠性。


C#中使用RSA

RSACryptoServiceProvider类

使用加密服务提供程序 (CSP) 提供的 RSA 算法的实现执行非对称加密和解密。 >> 跳转至官方文档

核心参数

  1. KeySize:指定RSA密钥长度,一般推荐使用2048位或以上的密钥长度。
  2. Padding:指定RSA加密和解密时使用的填充模式,默认为PKCS#1填充模式。
  3. KeyExchangeAlgorithm:指定RSA密钥交换算法,一般使用RSA。
  4. SignatureAlgorithm:指定RSA签名算法,一般使用RSA-SHA256。

核心方法

  1. GenerateKeyPair:生成RSA密钥对。
  2. Encrypt:使用公钥加密数据。
  3. Decrypt:使用私钥解密数据。
  4. ExportParameters:导出RSA密钥参数。
  5. ImportParameters:导入RSA密钥参数。
  6. FromXmlString:从XML字符串中加载RSA密钥。
  7. ToXmlString:将RSA密钥导出为XML字符串。

使用建议

在RSA算法中,每个RSA密钥对只能对应一个公钥和一个私钥。因此每次通过RSACryptoServiceProvider创建随机的RSA秘钥后需妥善保管参数。
在创建一个新的RSA秘钥时,可以使用ToXmlString方法将其转化为XML格式进行储存。
在需要使用RSA解密时,通过FromXmlString还原创建时的参数,再使用私钥进行解密。

示例代码

引用库:

using System.Security.Cryptography;

创建指定秘钥长度(如2048)的RSACryptoServiceProvider对象:

// 创建RSACryptoServiceProvider对象
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(2048);

生成公钥和私钥:

// 生成RSA密钥对
RSAParameters privateKey = rsa.ExportParameters(true);
RSAParameters publicKey = rsa.ExportParameters(false);

加密数据的方法:

        static byte[] EncryptData(byte[] data, RSAParameters publicKey)
        {
            // 创建RSACryptoServiceProvider对象
            RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();

            // 设置公钥
            rsa.ImportParameters(publicKey);

            // 加密数据
            byte[] encryptedData = rsa.Encrypt(data, false);

            return encryptedData;
        }

解密数据的方法

        static byte[] DecryptData(byte[] data, RSAParameters privateKey)
        {
            // 创建RSACryptoServiceProvider对象
            RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();

            // 设置私钥
            rsa.ImportParameters(privateKey);

            // 解密数据
            byte[] decryptedData = rsa.Decrypt(data, false);

            return decryptedData;
        }

结束语

RSA加密已经被框架集成好了,为什么(有什么必要)还需要去了解其实现细节?

框架应对的问题是有穷的,现实开发中面对的问题是无穷的。

我对RSA算法的了解源自于曾经供职公司的真实需求,自研的硬件设备需要对数据进行保护,要求一机一密,但由于原本的硬件算力不足以支持RSA的运算,因此引入了一颗加密芯片。
为加密芯片提供参数时产生了一些困惑,比如为什么芯片不要求填入DP和DQ就能进行加解密运算?
而每当回忆起在当时对RSA的特性并不了解的情况下采用了所有数据完全使用RSA进行加密造成了大量的性能浪费,总会心生惭愧…

这便是原因。


禁止转载声明:
本文受到版权保护,未经作者许可,严禁转载。任何机构或个人不得以任何形式将本文用于商业用途或进行二次创作、复制、转载等行为。任何未经授权使用本文所涉及的任何内容,作者保留追究法律责任的权利。如需引用本文,请务必注明出处并获得作者的明确授权。本文刊载于[https://blog.csdn.net/lgj123xj/article/details/130036450],感谢您的理解与支持!

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

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

相关文章

性能测试,python 内存分析工具 -memray

Memray是一个由彭博社开发的、开源内存剖析器;开源一个多月,已经收获了超8.4k的star,是名副其实的明星项目。今天我们就给大家来推荐这款python内存分析神器。 Memray可以跟踪python代码、本机扩展模块和python解释器本身中内存分配&#xf…

yolov5-v7.0实例分割快速体验

简介 🚀yolov5-v7.0版本正式发布,本次更新的v7.0则是全面的大版本升级,最主要的功能就是全面集成支持了实例分割,yolov5已经集成检测、分类、分割任务。 前面几篇文章已经介绍过关于Yolov5的一些方面 yolov5目标检测:https://bl…

[计算机图形学]几何:曲线和曲面(前瞻预习/复习回顾)

一、曲线 1.Bzier Curves—贝塞尔曲线 贝塞尔曲线也是一种显式的几何表示方法。贝塞尔曲线定义了一系列的控制点,致使确定满足这些控制点关系的唯一一条曲线:如上图定义的贝塞尔曲线满足 起始点为p0,结束点为p3,起始点的切线方向…

ABB机械臂和RobotStudio编程简介

ABB机械臂和RobotStudio编程简介机械臂ABB机械臂ABB示教器RobotStudio与编程简介RobotStudio简介与安装RobotStudio使用RAPID程序指令机械臂 一种能够进行编程并在自动控制下执行某些操作和 移动作业任务的机械装置。 —— 美国国家标准局(NSB) 一种用于移动各种材料、零部件、…

基于目标级联法的微网群多主体分布式优化调度(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

家政服务小程序实战开发教程017-我的页面未注册功能开发

顾客在家政服务小程序可以在线提交预约信息,预约成功后可以查看订单的进度。我们本篇就来实现一下我的页面的功能。 1 新建页面 进入编辑器,在组件页面区域点击号,创建我的页面 2 未登录页面开发 我的页面的逻辑是如果用户未注册&#…

【MyBatisPlus】一文带你快速上手MyBatisPlus

文章目录MyBatisPlus学习笔记前言1、MyBatisPlus概述2、快速体验3、CRUD接口3.1 Mapper层CRUD接口3.1.1 Insert3.1.2 Delete3.1.3 Update3.1.4 Select3.2 Service层CRUD接口3.2.1 Save3.2.2 Remove3.2.3 Update3.2.4 Get3.3 自定义SQL接口4、常用注解和配置4.1 TableId4.2 Tabl…

【C++】模板进阶(非类型模板参数、类模板的特化和模板的分离编译)

之前我们讲解过模板初阶,没有阅读过的童鞋可以先去阅读之前的博文----->模板初阶 本章我们将针对模板进行进一步的讲解。 目录 (一)非类型模板参数 (二)模板的特化 (1)概念 &#xff0…

我的面试八股(Java集合篇)

Java集合 两个抽象接口派生:一个是Collection接口,存放单一元素;一个是Map接口存放键值对。 Vector为什么是线程安全 简单,因为官方在可能涉及到线程不安全的操作都进行了synchronized操作,就自身源码就给你加了把锁。 Vector…

Stacking:解决机器学习进行多模型组合的实用工具

文章目录1 Stacking原理第一步:生成预测结果第二步:整合预测结果2 使用Python实现Stacking第一步:生成预测结果第二步:整合预测结果借助sklearn实现stacking3 各领域内的一些实际应用在机器学习领域,算法的选择和参数的…

前端--文件上传--文件切片--利用FileReader()中的readAsDataURL()做缩略图--多文件上传--formData--切片上传实现

一、文件上传 <template><div><input type"file" name"file" change"fileChange" /><button click"submit">提交</button></div> </template><script setup>function fileChange(e)…

ROS开发之如何制作launch启动文件?

文章目录0、引言1、Launch文件语法2、Launch示例0、引言 笔者因研究课题涉及ROS开发&#xff0c;学习了古月居出品的ROS入门21讲&#xff0c;为巩固launch的知识&#xff0c;本文将ROS的launch启动文件制作一讲内容进行总结。launch文件通过XML文件实现多节点的配置和启动&…

Compose (11/N) - 手势

一、点击 1.1 可点击 Modifier.clickable( ) 允许应用检测对该元素的点击。 Composable fun ClickableSample() {val count remember { mutableStateOf(0) }Text(text count.value.toString(),modifier Modifier.clickable { count.value 1 }) } 1.2 手势检测 Modifier.p…

【技术分享】接口自动化测试中,如何做断言验证?

在服务端自动化测试过程中&#xff0c;发起请求之后还需要对响应值进行验证。验证响应信息符合预期值之后&#xff0c;这一条接口自动化测试用例才算完整的通过。所以这一章节&#xff0c;将会讲解在接口自动化测试中&#xff0c;如何对服务端返回的响应内容做断言验证。 实战…

C语言函数大全-- i 开头的函数

C语言函数大全 本篇介绍C语言函数大全– i 开头的函数 1. imagesize 1.1 函数说明 函数声明函数功能unsigned imagesize(int left, int top, int right, int bottom);获取保存位图像所需的字节数 1.2 演示示例 #include <graphics.h> #include <stdlib.h> #in…

【Java数据结构】链表OJ提交小记

目录 1.删除链表中所有值为val的节点 2.反转单链表 3.返回链表的中间节点 4.返回链表倒数第k个节点 5.按次序合并链表 6.按值分割链表 7.判断链表是否为回文 1.删除链表中所有值为val的节点 1. 删除链表中所有值为val的节点https://leetcode.cn/problems/remove…

考研数据结构-绪论

绪论 文章目录绪论1. 什么是数据结构2. 基本概念数据结构的四类基本结构&#xff08;逻辑结构&#xff09;存储结构顺序存储和链式存储比较分析3. 算法概念特征优点&#xff08;也是要求&#xff09;算法效率的度量概念时间复杂度空间复杂度(了解)1. 什么是数据结构 数据结构是…

【Python】字符串 ⑦ ( input 字符串输入 | input 函数自带提示参数 | input 函数接收的变量类型 )

文章目录一、input 字符串输入二、代码示例三、input 函数自带提示参数四、input 函数接收的变量类型一、input 字符串输入 在命令行中 , 使用 printf 可以输出数据 , 将 变量 , 字面量 , 表达式 输出到命令行中 ; 在命令行中 , 使用 input 语句可以 在 命令行 中 , 从键盘获取…

2023年第五届传智杯前四题题解(后俩没写出来)

比赛链接&#xff1a;第五届“传智杯”全国大学生计算机大赛&#xff08;决赛B组&#xff09; - 比赛详情 - 洛谷 时效「月岩笠的诅咒」 题目背景 蓬莱之药&#xff0c;被诅咒的不死之药。 奉命将蓬莱之药投入富士山中销毁的月岩笠&#xff0c;最终打算把蓬莱之药改投入八岳销…

STM32Cube的debug和release切换

一&#xff0c; Debug / Release版本区别 来源&#xff1a;STM32CUBEIDE中 Debug 和 Release 的作用/区别/使用场景 - svchao - 博客园 (cnblogs.com) 二&#xff0c;Debug / Release使用。 1&#xff0c;在编译的时候可以选择Debug 还是 Release . 2,使用stm32CubeIDE调试或运…