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

简介: RSA的特性非对称性RSA算法使用公钥和私钥两个不同的密钥,公钥用于加密数据,私钥用于解密数据。公钥可以公开,任何人都可以使用,而私钥只有密钥持有人可以访问。安全性RSA算法基于大数分解难题,即将一个大的合数分解成其质数因子的乘积。由于目前没有有效的算法可以在合理的时间内对大质数进行分解,因此RSA算法被认为是一种安全的加密算法。可逆性RSA算法既可以用于加密,也可以用于解密。加密和解密都是可逆的过程,只要使用正确的密钥,就可以还原原始数据。签名RSA算法可以用于数字签名,用于验证数据的完整性和真实性。签名过程是将数据使用私钥进行加密,验证过程是将签名使用公钥进行解密。

在这里插入图片描述

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

前言

本文和大家聊一聊加密算法中的明星——RSA!如果你需要用到非对称加密,那么RSA算法一定是你不可错过的重要一环。


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] ,感谢您的理解与支持!
相关文章
|
2月前
|
存储 监控 算法
电脑监控管理中的 C# 哈希表进程资源索引算法
哈希表凭借O(1)查询效率、动态增删性能及低内存开销,适配电脑监控系统对进程资源数据的实时索引需求。通过定制哈希函数与链地址法冲突解决,实现高效进程状态追踪与异常预警。
174 10
|
6月前
|
存储 运维 监控
基于 C# 语言的 Dijkstra 算法在局域网内监控软件件中的优化与实现研究
本文针对局域网监控系统中传统Dijkstra算法的性能瓶颈,提出了一种基于优先队列和邻接表优化的改进方案。通过重构数据结构与计算流程,将时间复杂度从O(V²)降至O((V+E)logV),显著提升大规模网络环境下的计算效率与资源利用率。实验表明,优化后算法在包含1000节点、5000链路的网络中,计算时间缩短37.2%,内存占用减少21.5%。该算法适用于网络拓扑发现、异常流量检测、故障定位及负载均衡优化等场景,为智能化局域网监控提供了有效支持。
156 5
|
2月前
|
存储 机器学习/深度学习 监控
网络管理监控软件的 C# 区间树性能阈值查询算法
针对网络管理监控软件的高效区间查询需求,本文提出基于区间树的优化方案。传统线性遍历效率低,10万条数据查询超800ms,难以满足实时性要求。区间树以平衡二叉搜索树结构,结合节点最大值剪枝策略,将查询复杂度从O(N)降至O(logN+K),显著提升性能。通过C#实现,支持按指标类型分组建树、增量插入与多维度联合查询,在10万记录下查询耗时仅约2.8ms,内存占用降低35%。测试表明,该方案有效解决高负载场景下的响应延迟问题,助力管理员快速定位异常设备,提升运维效率与系统稳定性。
219 4
|
7月前
|
存储 算法 安全
如何控制上网行为——基于 C# 实现布隆过滤器算法的上网行为管控策略研究与实践解析
在数字化办公生态系统中,企业对员工网络行为的精细化管理已成为保障网络安全、提升组织效能的核心命题。如何在有效防范恶意网站访问、数据泄露风险的同时,避免过度管控对正常业务运作的负面影响,构成了企业网络安全领域的重要研究方向。在此背景下,数据结构与算法作为底层技术支撑,其重要性愈发凸显。本文将以布隆过滤器算法为研究对象,基于 C# 编程语言开展理论分析与工程实践,系统探讨该算法在企业上网行为管理中的应用范式。
212 8
|
7月前
|
存储 监控 算法
解析公司屏幕监控软件中 C# 字典算法的数据管理效能与优化策略
数字化办公的时代背景下,企业为维护信息安全并提升管理效能,公司屏幕监控软件的应用日益普及。此软件犹如企业网络的 “数字卫士”,持续记录员工电脑屏幕的操作动态。然而,伴随数据量的持续增长,如何高效管理这些监控数据成为关键议题。C# 中的字典(Dictionary)数据结构,以其独特的键值对存储模式和高效的操作性能,为公司屏幕监控软件的数据管理提供了有力支持。下文将深入探究其原理与应用。
175 4
|
8月前
|
机器学习/深度学习 监控 算法
员工上网行为监控软件中基于滑动窗口的C#流量统计算法解析​
在数字化办公环境中,员工上网行为监控软件需要高效处理海量网络请求数据,同时实时识别异常行为(如高频访问非工作网站)。传统的时间序列统计方法因计算复杂度过高,难以满足低延迟需求。本文将介绍一种基于滑动窗口的C#统计算法,通过动态时间窗口管理,实现高效的行为模式分析与流量计数。
228 2
|
8月前
|
人工智能 运维 算法
基于 C# 深度优先搜索算法的局域网集中管理软件技术剖析
现代化办公环境中,局域网集中管理软件是保障企业网络高效运行、实现资源合理分配以及强化信息安全管控的核心工具。此类软件需应对复杂的网络拓扑结构、海量的设备信息及多样化的用户操作,而数据结构与算法正是支撑其强大功能的基石。本文将深入剖析深度优先搜索(Depth-First Search,DFS)算法,并结合 C# 语言特性,详细阐述其在局域网集中管理软件中的应用与实现。
198 3
|
5月前
|
监控 算法 安全
基于 C# 基数树算法的网络屏幕监控敏感词检测技术研究
随着数字化办公和网络交互迅猛发展,网络屏幕监控成为信息安全的关键。基数树(Trie Tree)凭借高效的字符串处理能力,在敏感词检测中表现出色。结合C#语言,可构建高时效、高准确率的敏感词识别模块,提升网络安全防护能力。
142 2
|
6月前
|
监控 算法 数据处理
内网实时监控中的 C# 算法探索:环形缓冲区在实时数据处理中的关键作用
本文探讨了环形缓冲区在内网实时监控中的应用,结合C#实现方案,分析其原理与优势。作为固定长度的循环队列,环形缓冲区通过FIFO机制高效处理高速数据流,具备O(1)时间复杂度的读写操作,降低延迟与内存开销。文章从设计逻辑、代码示例到实际适配效果展开讨论,并展望其与AI结合的潜力,为开发者提供参考。
281 2
|
6月前
|
监控 算法 安全
公司电脑监控软件关键技术探析:C# 环形缓冲区算法的理论与实践
环形缓冲区(Ring Buffer)是企业信息安全管理中电脑监控系统设计的核心数据结构,适用于高并发、高速率与短时有效的多源异构数据处理场景。其通过固定大小的连续内存空间实现闭环存储,具备内存优化、操作高效、数据时效管理和并发支持等优势。文章以C#语言为例,展示了线程安全的环形缓冲区实现,并结合URL访问记录监控应用场景,分析了其在流量削峰、关键数据保护和高性能处理中的适配性。该结构在日志捕获和事件缓冲中表现出色,对提升监控系统效能具有重要价值。
176 1