c#加密:四、公钥加密和签名

article/2025/9/24 9:21:28

一、公钥加密

1、概述

        公钥加密是非对称的,因此加密和解密需要使用不同的密钥。对称加密的密钥可以是一串长度合适的任意字节串。但非对称加密则需要专门制作一对密钥。

        这个密钥对包含一个公钥和一个私钥。它们将一起完成如下工作:

        公钥加密消息,私钥对消息进行解密。(.Net平台默认是使用公钥行加密,私钥进行解密。如果需要私钥加密(或因为平台不一致,导致无法互相加解密)需要自己实现或者使用第三方dll,比如BouncyCastle.Crypto。

        制作密钥对的一方会保证私钥的安全,而将公钥自由分发。这种加密技术的特点在于无法仅通过公钥而计算出私钥。因此,如果私钥丢失就无法解密了。相反,如果私钥泄露了,那么加密系统也就无法起到保护作用了。

        公钥握手可以使两台计算机在公共网络中无须事先达成一致或共享安全信息就能安全地通信。

        为了说明其中的环节,不妨假设计算机Origin希望给另一台计算机Target发送一条机密信息:        

        1.Target计算机生成一个公钥/私钥对,并将公钥分发给Origin。

        2.Origin使用Target的公钥将机密消息加密,并发送给Target。

        3.Target使用私钥解密机密消息。

        窃听者可以获取以下数据:

        1、Target的公钥

        2、使用Target的公钥加密后的消息

        但是在没有Target的私钥的情况下,加密的消息是无法解密的。

        这种方式并不能防范中间人攻击。换句话说,Origin无法知道Target是否是恶意攻击方。为了验证接收者,发送者需要事先知道接收者的公钥,或者通过网站的数字证书验证其身份。

        Origin发送给Target的加密消息中一般包含了一个新创建的对称加密密钥,而接下来的通信将使用该密钥进行对称加密。这样,本次会话中的后续通信就不需要再使用Origin的公钥了。这是因为对称加密算法更适合于处理大的消息。如果每一次会话都会生成新的公钥/私钥对的话,这种协议就更加安全了,因为通信双方不需要存储任何密钥。

        公钥加密算法要求加密的信息小于密钥的长度,因此更适合于加密少量的数据(例如对称加密的密钥)。如果试图加密的数据长度大于密钥长度的一半,则会抛出异常,所以如果数据长度太大需要分段加密。

        .NET Framework提供了很多非对称加密算法。其中RSA算法最为流行。

2、RSA加密demo-1,不指定公钥私钥

byte[] data = { 5,6,8,4,10 };
using (var rsa = new RSACryptoServiceProvider())
{byte[] encrypted = rsa.Encrypt(data, true);byte[] decrypted = rsa.Decrypt(encrypted, true);
}

        由于没有指定公钥或私钥,因此加密程序会默认使用1024位长度自动生成一个密钥对。我们可以在构造器中,以8字节为增量来指定更长的密钥。对于安全性要求较高的应用程序,应当选用2048位密钥长度:

var rsa = new RSACryptoServiceProvider(2048)

3、生成密钥对

        第一次调用ToXmlString方法会强制生成一个新的密钥对,fasle仅为公钥,true位公钥和私钥。

using (var rsa = new RSACryptoServiceProvider())
{File.WriteAllText("PublicKeyOnly.xml", rsa.ToXmlString(false));File.WriteAllText("PublicPrivate.xml", rsa.ToXmlString(true));
}

4、RSA加密demo-2,指定公钥私钥

        使用上面生成的公钥私钥进行加密解密。

byte[] data = Encoding.UTF8.GetBytes("一个短消息");
string PublicKeyOnly = File.ReadAllText("PublicKeyOnly.xml");
string PublicPrivate = File.ReadAllText("PublicPrivate.xml");byte[] encrypted;
byte[] decrypted;//加密
using (var rsaPublicOnly = new RSACryptoServiceProvider())
{rsaPublicOnly.FromXmlString(PublicKeyOnly);encrypted = rsaPublicOnly.Encrypt(data, true);
}//解密
using (var rsaPublicPrivate = new RSACryptoServiceProvider())
{rsaPublicPrivate.FromXmlString(PublicPrivate);decrypted = rsaPublicPrivate.Decrypt(encrypted, true);
}

5、RSA加密demo-3,分段加密

        1024位的证书,加密时最大支持117个字节,解密时为128;
        2048位的证书,加密时最大支持245个字节,解密时为256。

string PublicKeyOnly = File.ReadAllText("PublicKeyOnly.xml");
string PublicPrivate = File.ReadAllText("PublicPrivate.xml");
string a = "测试中文,如果这是一个数字and一串英文字母,这个够长不够长?可能不太够长,也可能太长了?哈哈,顶顶顶缺陷检测和图像处理图像识别项目一般,好像涉及到一些线性代数的计算";
string encrypted, decrypted;//加密
using (var rsa = new RSACryptoServiceProvider())
{rsa.FromXmlString(PublicPrivate);byte[] bytes = Encoding.UTF8.GetBytes(a);int encriptedChunckSize = rsa.KeySize / 8 - 11;int dataLength = bytes.Length;int iterations = dataLength / encriptedChunckSize + 1;ArrayList arrayList = new ArrayList();for (int i = 0; i < iterations; i++){byte[] tempBytes = new byte[encriptedChunckSize];System.Buffer.BlockCopy(bytes, encriptedChunckSize * i, tempBytes, 0, (tempBytes.Length* (i + 1) > bytes.Length) ? (bytes.Length - tempBytes.Length * i) : tempBytes.Length);byte[] data1 = rsa.Encrypt(tempBytes, false);arrayList.AddRange(data1);}var descrypt = (byte[])arrayList.ToArray(typeof(Byte));encrypted = Convert.ToBase64String(descrypt);
}using (var rsa = new RSACryptoServiceProvider())
{//解密//byte[] buffer = Encoding.UTF8.GetBytes(encrypted);//string keys = Encoding.UTF8.GetString(buffer);var bytes = Convert.FromBase64String(encrypted);rsa.FromXmlString(PublicPrivate);int encriptedChunckSize = rsa.KeySize / 8;int dataLength = bytes.Length;int iterations = dataLength / encriptedChunckSize;ArrayList arrayList = new ArrayList();for (int i = 0; i < iterations; i++){byte[] tempBytes = new byte[encriptedChunckSize];System.Buffer.BlockCopy(bytes, encriptedChunckSize * i, tempBytes, 0, (tempBytes.Length * (i + 1) > bytes.Length) ? (bytes.Length - tempBytes.Length * i) : tempBytes.Length);arrayList.AddRange(rsa.Decrypt(tempBytes, false));}var descrypt = (byte[])arrayList.ToArray(typeof(Byte));decrypted = Encoding.UTF8.GetString(descrypt).Trim();
}

        其它代码参考

C# RSA 分段加解密 - FrankYou - 博客园RSA加解密: 1024位的证书,加密时最大支持117个字节,解密时为128;2048位的证书,加密时最大支持245个字节,解密时为256。 加密时支持的最大字节数:证书位数/8 -11(比如:204https://www.cnblogs.com/frankyou/p/5993756.html

6、数字签名

        公钥算法可以对消息或文档进行数字签名。签名与散列值类似,但是这个散列值会用私钥进行加密从而防止伪造,而公钥则用来验证这个数字签名。例如:

        要制作数字签名首先要对数据进行散列,而后用非对称加密算法加密散列值。由于散列值的长度固定且不大,因此即使是大型的文档也可以很快地进行数字签名(公钥加密比散列算法的计算量大得多)。如果需要,还可以手动对数据进行散列,而后调用SignHash而不是SignData:

         SignHash方法需要提供散列算法的信息。CryptoConfig.MapNameToOID方法可以以一个用户友好的名字(例如“SHA1”)来查询该信息。

        RSACryptoServiceProvider将创建长度和密钥匹配的签名。目前,主流的算法生成的签名长度都不会少于128字节(例如,生成产品激活码)。

        为了更加高效地添加数字签名,接收者必须了解并信任发送者的公钥。这可以通过事前通信、预先配置或保存网站证书来实现。网站证书包含发送者的公钥和名称,并且它本身会由独立受信的机构进行签名。System.Security.Cryptography.X509Certificates命名空间中的类型可用来处理证书相关的操作。


http://chatgpt.dhexx.cn/article/WyLldWWg.shtml

相关文章

为什么用公钥加密却不能用公钥解密?

本文为掘金社区首发签约文章&#xff0c;14天内禁止转载&#xff0c;14天后未获授权禁止转载&#xff0c;侵权必究&#xff01; 一直以来我都在逃避写HTTPS。 毕竟。 HTTPS里名词太多。概念又巨繁琐。 实在是太难解释了&#xff0c;能不写我尽量不写。。。。 但为了让图解网…

公钥加密算法

3 公钥加密算法 加密工具使用 运行RSA-Tool&#xff0c;点击Start按钮&#xff0c;滑动鼠标生成一个随机数。点击Generate生成一对大质数p、q及Npq。 自己选定一个可用的整数e(可使用默认的10001&#xff0c;也可以使用其他的)。点击Calc.D生成d。 3 将公钥(N,e)发送给小伙…

2021-05-05

5.5 实训主题&#xff1a;密码学&#xff08;后续&#xff09; 公钥加密算法 RSA算法的数学原理 阅读RSA.cpp中的代码&#xff0c;了解其实现方法。调试运行RSA.cpp&#xff0c;选择两个不同的素数。根据生成的d和e验证公式de ≡ 1 (mod (p-1)(q-1))。输入要加密的数。验证…

公钥密钥加密原理

转载自&#xff1a;https://www.jianshu.com/p/0bf1c3c047e5 第6章 网络编程与网络框架 6.1 公钥密钥加密原理 6.1.1 基础知识 密钥&#xff1a;一般就是一个字符串或数字&#xff0c;在加密或者解密时传递给加密/解密算法。对称加密算法&#xff1a;加密和解密都是使用的同…

公钥密码体制及RSA公钥加密算法(上)

一.公钥密码体制 &#xff08;1&#xff09;公钥&#xff08;非对称&#xff09;密码概述&#xff1a; 优点&#xff1a;免去密钥分发&#xff0c;密钥管理简单 &#xff08;2&#xff09;公钥加密的设计原则&#xff1a; 已知公私钥&#xff0c;进行加密解密是简单容易的 单…

网关与路由器的区别!!

自我认识&#xff1a; “网关” &#xff1a;让两个不同网络相互之间进行通信&#xff0c;可以使具有不同协议的网络相互连接。 “路由器”&#xff1a;能在计算机网络之间发送和接收数据包的设备&#xff0c;并且提供最佳路由路径的一种网络互联设备。但是只能在使用相同协议…

什么是网关和网关的作用

什么是网关? 网关(Gateway)指的是这一个网络连接到另一个网络的“关口”&#xff0c;它又称网间连接器、协议转换器。在Internet网里&#xff0c;网关的作用是一种连接内部网与Internet上其它网的一种中间设备&#xff0c;通俗来说&#xff0c;也叫做“路由器”。网关地址是能…

微服务——API网关

什么是API网关 API网关&#xff08;API Gateway&#xff09;是应用服务之前的系统&#xff0c;用来代理业务系统的服务API&#xff0c;在网关层处理所有的非业务功能&#xff0c;实现管理授权、访问控制和流量限制等功能。这样业务系统就可以专注于业务&#xff0c;而不用去处…

网关和路由器的区别

摘要&#xff1a;网关是逻辑概念,路由器是物理设备,路由器可以作为网关来使用。路由器是一个设备&#xff0c;而网关是一个结点&#xff08;概念层&#xff09;。应该说&#xff1a;路由器可以实现网关的功能。另外&#xff0c;网关的功能还可以由局域网中一台双网卡的机器&…

PowerBI Server端管理数据网关

作为企业PowerBI的管理员&#xff0c;日常工作除了分发报表&#xff0c;可能就是管理网关了&#xff0c;目前国际版的Server端已经更新了网关管理的页面&#xff0c;但是入口没变&#xff0c;仍然是设置—管理网关。 新建数据源 进入管理网关页面后&#xff0c;左上角有一个新…

守护企业网关

相比UTM、防毒墙等概念&#xff0c;用户关注的只是网关处如何确保网络安全以及对病毒攻击的拦截。 有一天&#xff0c;在一家大型外企工作的小王&#xff0c;利用午休空挡通过MSN将一个名为Dancing Skeleton的游戏小程序传给朋友分享&#xff0c;当消息发过去后&#xff0c;屏…

网关介绍

网关(Gateway)又称网间连接器、协议转换器。网关在网络层以上实现网络互连&#xff0c;是最复杂的网络互连设备&#xff0c;仅用于两个高层协议不同的网络互连。网关既可以用于广域网互连&#xff0c;也可以用于局域网互连。 网关是一种充当转换重任的计算机系统或设备。在使用…

微服务网关——需求篇

概念 API Gateway&#xff08;API GW / API 网关&#xff09;&#xff0c;顾名思义&#xff0c;是企业 软件系统在系统边界上提供给外部访问内部接口服务的统一入口。网关并不是微服务所特有的&#xff0c;实际上网关在微服务之前就已经存在很久了&#xff0c;例如银行、证券等…

网关是什么?工业网关是什么?

网关是什么&#xff1f;工业网关是什么&#xff1f; 网关(Gateway)又称网间衔接器、协议转化器。网关在传输层上以完结网络互连&#xff0c;是最复杂的网络互连设备&#xff0c;仅用于两个高层协议不同的网络互连。网关的结构也和路由器相似&#xff0c;不同的是互连层。网关既…

守护企业网关

相比UTM、防毒墙等概念&#xff0c;用户关注的只是网关处如何确保网络安全以及对病毒攻击的拦截。 有一天&#xff0c;在一家大型外企工作的小王&#xff0c;利用午休空挡通过MSN将一个名为Dancing Skeleton的游戏小程序传给朋友分享&#xff0c;当消息发过去后&#xff0c;屏…

B2B网关支付方案介绍

B2B网关支付方案介绍 目录 一、B2B网关概述 二、B2B网关方案 一、B2B网关概述 业务背景&#xff1a;近年来&#xff0c;随着互联网支付业务逐步进化&#xff0c;C端已成红海&#xff0c;而B端成为群蓝海。市场上普遍存在的对B端支付需求又得不到满足。 业务场景&#xff1a…

网关的简介

好想你 ------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 转自&#xff1a;https://www.cnblogs.com/coolfiry/p/8193768.html 一、API网关的…

路由器和网关的区别

转载自&#xff1a;https://blog.csdn.net/H12KJGJ/article/details/73436678 顾名思义&#xff0c;网关&#xff08;Gateway&#xff09;就是一个网络连接到另一个网络的“关口”。 按照不同的分类标准&#xff0c;网关也有很多种。TCP/IP协议里的网关是最常用的&#xff0c;在…

网关的选型方案

1. 选型场景描述 目前了解分析&#xff0c;将遇到的客户场景有三类&#xff1a; 极简私有化中高度私有云需求SaaS云端 极简私有化 &#xff1a;对企业数据敏感要求高&#xff0c;系统的使用率和性能要求低&#xff0c;因此设备资源提供也相对低。 极简私有化&#xff0c;适…

企业级API网关的设计

原创 2017-05-25 郑治国 EAWorld 转载本文需注明出处&#xff1a;微信公众号EAWorld&#xff0c;违者必究。 本文目录&#xff1a; 一、网关简介 二、网关的作用和价值 三、企业级API网关需要具备的条件 四、业界常用的API网关方案 五、如何设计一个好的企业级API网关产品 …