.Net之美读书笔记9
加密与解密
在消息传输的情境下,加密与解密是为了保证消息的安全。
保证消息安全的三要性
- 完整性 消息的接收方可以确保消息在传输过程中没被篡改过
- 保密性 消息的发送方能够确定消息只有预期的接收方可理解(第三方截获的消息加密,不能理解)
- 可认证性 消息的接受方可以确定消息是谁发来的
散列算法保证消息的完整性
散列算法可以对任何数据进行散列运算的到摘要。散列算法的特点:运算的不可逆性 源极小修改摘要不同 摘要为64bit或128bit
消息进行散列运算产生摘要,发送发将消息和摘要发送给接受方,接收方收到后以相同的散列算法得到消息摘要,再将两份摘要比对。发送方和接收方对消息加盐,得到摘要,放在第三方修改消息同事修改摘要。
public class Sender
{
private string message = "Hello World!";
private string salt = "[good]";
private byte[] GetHasHData(string message)
{
HashAlgorithm alg = HashAlgorithm.Create("SHA1");
byte[] plainData = Encoding.Default.GetBytes(this.salt + message);
byte[] hashData = alg.ComputeHash(plainData);
return hashData;
}
public Tuple<byte[], string> SendMessage()
{
byte[] hashData = this.GetHasHData(message);
return Tuple.Create(hashData, message);
}
}
public class Receiver
{
private string message = string.Empty;
private string salt = "[good]";
public bool ReceiveData(Tuple<byte[], string> data)
{
byte[] sourceHashData = data.Item1;
string msg = data.Item2;
HashAlgorithm alg = HashAlgorithm.Create("SHA1");
byte[] plainData = Encoding.Default.GetBytes(this.salt + msg);
byte[] hashData = alg.ComputeHash(plainData);
if(sourceHashData.SequenceEqual(hashData))
{
this.message = msg;
return true;
}
else
{
return false;
}
}
public void DisplayMsg()
{
Console.WriteLine(this.message);
}
}
//调用
Sender sender = new Sender();
Receiver receiver = new Receiver();
if (receiver.ReceiveData(sender.SendMessage()))
{
receiver.DisplayMsg();
}
这里散列算法都继承自HashAlgorithm
,创建方法为HashAlgorithm.Create("SHA1"),通过传入不同的参数得到不同的算法(MD5,SHA,SHA1等)。
对称加密保证消息的保密性
将消息通过密钥加密得到消息的密文,发送方将密文发送,接收方用同一个密钥对密文进行解密的到原文。
非对称加密
非对称加密有两个密钥,一个公钥,一个私钥。消息经公钥加密得到密文,密文只能经对应的私钥解密为明文。
实现可认证性:甲方(发送方)有甲私钥(自己的私钥)与乙公钥,乙方有甲方公钥与乙私钥(自己的)。
- 加密性
甲方用乙方公钥加密为密文,将密文发送给乙方。密文需要乙方私钥解密,第三方无法理解秘闻。 - 认证性
甲方用甲私钥加密为密文,发送给乙方。乙方接到消息后用甲公钥解密,能成功解密认证消息是甲方所发。
数字签名
数字签名保证消息的完整性和认证性,用散列得到消息摘要,再对摘要进行非对称加密(为解决对称加密和非对称加密耗时问题)。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)