VB.net 2010 视频教程 VB.net 2010 视频教程 python基础视频教程
SQL Server 2008 视频教程 c#入门经典教程 Visual Basic从门到精通视频教程
当前位置:
首页 > 编程开发 > c#编程 >
  • C#网络编程之加密与解密(对称加密、非对称加密、哈希算法)

第17章 加密与解密
17.1 加密与解密(对称加密、非对称加密、哈希算法)
一、为什么要搞加密?我踩过的“裸奔坑”
刚写了一个聊天程序,直接把明文消息通过网络发送——结果用Wireshark抓包一看,所有消息都能被看到,包括用户的密码、聊天内容。后来用加密技术把消息加密后再发送,抓包只能看到乱码,安全多了。这节我把自己vb.net教程C#教程python教程SQL教程access 2010教程从“裸奔传输”到“加密传输”的经验揉进去,用大白话讲透对称加密、非对称加密、哈希算法的原理,结合C#代码逐行讲解,让你的网络程序像银行系统一样安全。
二、先搞懂加密的核心:“锁”和“钥匙”
加密的核心是用“钥匙”把明文变成密文,再用“钥匙”把密文变回明文——不同的加密算法有不同的“锁”和“钥匙”。
类比:加密就像你寄快递——你把明文(快递)放到箱子里,用锁(加密算法)锁起来,把钥匙(密钥)发给收件人,收件人用钥匙打开箱子,拿到明文。如果没有钥匙,别人只能看到箱子(密文),看不到里面的内容(明文)。
三、对称加密:一把钥匙开一把锁
对称加密是用同一把钥匙加密和解密的技术——加密和解密用的是同一把密钥,速度快,适合加密大文件、大流量数据。
核心原理:对称加密算法把明文分成块,用密钥对每个块进行加密,生成密文——解密时用同一把密钥把密文分成块,每个块解密后拼接成明文。
常见的对称加密算法:AES、DES、3DES、RC4。其中AES是目前最安全、最流行的对称加密算法,DES和3DES已经被淘汰,RC4是流加密算法,适合加密小数据。

  1. C#实战:用AES加密解密文件
    示例:用AES加密解密1GB的大文件,速度快,安全可靠
    csharp
	using System;
	using System.IO;
	using System.Security.Cryptography;
	
	namespace AesDemo;
	
	class Program
	{
	static void Main(string[] args)
	{
	string inputFilePath = @"C:	est明文文件.txt";
	string encryptedFilePath = @"C:	est加密文件.aes";
	string decryptedFilePath = @"C:	est解密文件.txt";
	string password = "MyStrongPassword123!"; // 密码,用来生成密钥
	
	// 加密文件
	EncryptFile(inputFilePath, encryptedFilePath, password);
	Console.WriteLine("文件加密完成");
	
	// 解密文件
	DecryptFile(encryptedFilePath, decryptedFilePath, password);
	Console.WriteLine("文件解密完成");
	}
	
	/// <summary>
	/// 用AES加密文件
	/// </summary>
	static void EncryptFile(string inputFilePath, string outputFilePath, string password)
	{
	// 创建AES对象
	using (Aes aes = Aes.Create())
	{
	// 用密码和盐生成密钥和IV(初始化向量)
	var salt = new byte[16]; // 盐,增加密码的复杂度
	using (var rng = RandomNumberGenerator.Create())
	{
	rng.GetBytes(salt); // 生成随机盐
	}
	
	// 用PBKDF2算法从密码和盐生成密钥和IV
	var keyDerivation = new Rfc2898DeriveBytes(password, salt, 100000, HashAlgorithmName.SHA256);
	aes.Key = keyDerivation.GetBytes(aes.KeySize / 8); // 生成密钥
	aes.IV = keyDerivation.GetBytes(aes.BlockSize / 8); // 生成IV
	
	// 创建文件流
	using (var inputStream = new FileStream(inputFilePath, FileMode.Open))
	using (var outputStream = new FileStream(outputFilePath, FileMode.Create))
	{
	// 先把盐写到输出文件的开头,解密时需要用盐生成密钥和IV
	outputStream.Write(salt, 0, salt.Length);
	
	// 创建加密流
	using (var cryptoStream = new CryptoStream(outputStream, aes.CreateEncryptor(), CryptoStreamMode.Write))
	{
	// 把输入文件的内容写到加密流,自动加密
	inputStream.CopyTo(cryptoStream);
	}
	}
	}
	}
	
	/// <summary>
	/// 用AES解密文件
	/// </summary>
	static void DecryptFile(string inputFilePath, string outputFilePath, string password)
	{
	// 创建AES对象
	using (Aes aes = Aes.Create())
	{
	// 读取输入文件开头的盐
	var salt = new byte[16];
	using (var inputStream = new FileStream(inputFilePath, FileMode.Open))
	{
	inputStream.Read(salt, 0, salt.Length);
	
	// 用PBKDF2算法从密码和盐生成密钥和IV
	var keyDerivation = new Rfc2898DeriveBytes(password, salt, 100000, HashAlgorithmName.SHA256);
	aes.Key = keyDerivation.GetBytes(aes.KeySize / 8);
	aes.IV = keyDerivation.GetBytes(aes.BlockSize / 8);
	
	// 创建解密流
	using (var cryptoStream = new CryptoStream(inputStream, aes.CreateDecryptor(), CryptoStreamMode.Read))
	using (var outputStream = new FileStream(outputFilePath, FileMode.Create))
	{
	// 把解密流的内容写到输出文件,自动解密
	cryptoStream.CopyTo(outputStream);
	}
	}
	}
	}
	}

代码逐行讲:
1.Aes.Create():创建AES对象,AES是对称加密算法,支持128、192、256位密钥;
2.RandomNumberGenerator.Create():生成随机盐,盐的作用是增加密码的复杂度——如果两个用户用了相同的密码,盐不同,生成的密钥也不同;
3.Rfc2898DeriveBytes:用PBKDF2算法从密码和盐生成密钥和IV——PBKDF2是慢哈希算法,破解难度大,适合从密码生成密钥;
4.CryptoStream:加密流/解密流,自动把输入的明文加密成密文,或者把输入的密文解密成明文——不需要手动处理块加密;
5.CopyTo:把输入流的内容写到输出流,自动加密/解密——适合加密大文件,因为不需要把整个文件读到内存里,边读边加密/解密。
2. 对称加密的优缺点
优点:速度快,适合加密大文件、大流量数据;
缺点:密钥管理难——如果密钥泄露,所有加密的数据都能被解密;如果有多个用户,每个用户都需要保存密钥,密钥分发难。
四、非对称加密:两把钥匙,一把加密,一把解密
非对称加密是用两把钥匙加密和解密的技术——一把是公钥,用来加密;一把是私钥,用来解密。公钥可以公开,私钥必须保密,适合加密小数据、密钥分发。
核心原理:非对称加密算法用数学难题(比如大质数分解、离散对数)生成公钥和私钥——用公钥加密的密文,只能用私钥解密;用私钥加密的密文,只能用公钥解密。
常见的非对称加密算法:RSA、ECC、DSA。其中RSA是目前最流行的非对称加密算法,ECC是椭圆曲线加密算法,比RSA更安全,密钥长度更短,适合移动设备;DSA是数字签名算法,适合签名,不适合加密。

  1. C#实战:用RSA加密解密小数据
    示例:用RSA加密解密用户的密码,安全可靠
    csharp
	using System;
	using System.Security.Cryptography;
	using System.Text;
	
	namespace RsaDemo;
	
	class Program
	{
	static void Main(string[] args)
	{
	string plaintext = "MyPassword123!"; // 明文,比如用户的密码
	
	// 生成RSA密钥对
	using (RSA rsa = RSA.Create(2048)) // 2048位密钥,安全可靠
	{
	// 导出公钥,公钥可以公开
	string publicKey = rsa.ToXmlString(false);
	Console.WriteLine("公钥:");
	Console.WriteLine(publicKey);
	
	// 导出私钥,私钥必须保密
	string privateKey = rsa.ToXmlString(true);
	Console.WriteLine("私钥:");
	Console.WriteLine(privateKey);
	
	// 用公钥加密明文
	byte[] encryptedBytes = Encrypt(plaintext, publicKey);
	string encryptedText = Convert.ToBase64String(encryptedBytes);
	Console.WriteLine("加密后的密文:");
	Console.WriteLine(encryptedText);
	
	// 用私钥解密密文
	string decryptedText = Decrypt(encryptedText, privateKey);
	Console.WriteLine("解密后的明文:");
	Console.WriteLine(decryptedText);
	}
	}
	
	/// <summary>
	/// 用RSA公钥加密明文
	/// </summary>
	static byte[] Encrypt(string plaintext, string publicKey)
	{
	using (RSA rsa = RSA.Create())
	{
	rsa.FromXmlString(publicKey); // 导入公钥
	byte[] plaintextBytes = Encoding.UTF8.GetBytes(plaintext);
	// 用公钥加密,OAEP填充模式更安全
	return rsa.Encrypt(plaintextBytes, RSAEncryptionPadding.OaepSHA256);
	}
	}
	
	/// <summary>
	/// 用RSA私钥解密密文
	/// </summary>
	static string Decrypt(string encryptedText, string privateKey)
	{
	using (RSA rsa = RSA.Create())
	{
	rsa.FromXmlString(privateKey); // 导入私钥
	byte[] encryptedBytes = Convert.FromBase64String(encryptedText);
	// 用私钥解密,OAEP填充模式更安全
	byte[] decryptedBytes = rsa.Decrypt(encryptedBytes, RSAEncryptionPadding.OaepSHA256);
	return Encoding.UTF8.GetString(decryptedBytes);
	}
	}
	}

代码逐行讲:
1.RSA.Create(2048):创建RSA对象,2048位密钥是目前最安全的,1024位密钥已经被淘汰;
2.ToXmlString(false):导出公钥,false表示只导出公钥,不导出私钥;
3.ToXmlString(true):导出私钥,true表示导出公钥和私钥;
4.Encrypt:用公钥加密明文,OAEP填充模式更安全,PKCS#1 v1.5填充模式已经被淘汰;
5.Decrypt:用私钥解密密文,必须和加密时用的填充模式一致。
2. 非对称加密的优缺点
优点:密钥管理容易——公钥可以公开,私钥必须保密,不需要分发密钥;
缺点:速度慢,适合加密小数据(比如密码、密钥),不适合加密大文件、大流量数据。
五、哈希算法:不可逆的“指纹”
哈希算法是不可逆的加密技术——把任意长度的明文转换成固定长度的哈希值,不能把哈希值变回明文,适合验证数据的完整性、存储密码。
核心原理:哈希算法把明文分成块,对每个块进行哈希运算,生成固定长度的哈希值——即使明文只有一个字符不同,哈希值也会完全不同;即使明文很长,哈希值的长度也是固定的。
常见的哈希算法:MD5、SHA-1、SHA-256、SHA-512。其中MD5和SHA-1已经被淘汰,因为可以找到碰撞(两个不同的明文生成相同的哈希值),SHA-256和SHA-512是目前最安全、最流行的哈希算法。

  1. C#实战:用SHA-256验证文件的完整性
    示例:下载文件后,用SHA-256验证文件的完整性,防止文件被篡改
    csharp
	using System;
	using System.IO;
	using System.Security.Cryptography;
	
	namespace HashDemo;
	
	class Program
	{
	static void Main(string[] args)
	{
	string filePath = @"C:	est下载的文件.exe";
	string expectedHash = "7c898a0e89a0e89a0e89a0e89a0e89a0e89a0e89a0e89a0e89a0e89a0e89a0e8"; // 官方提供的哈希值
	
	// 计算文件的SHA-256哈希值
	string actualHash = ComputeSha256Hash(filePath);
	Console.WriteLine("文件的SHA-256哈希值:");
	Console.WriteLine(actualHash);
	
	// 验证哈希值是否一致
	if (actualHash.Equals(expectedHash, StringComparison.OrdinalIgnoreCase))
	{
	Console.WriteLine("文件完整,没有被篡改");
	}
	else
	{
	Console.WriteLine("文件被篡改,不要运行");
	}
	}
	
	/// <summary>
	/// 计算文件的SHA-256哈希值
	/// </summary>
	static string ComputeSha256Hash(string filePath)
	{
	using (SHA256 sha256 = SHA256.Create())
	{
	using (FileStream fs = new FileStream(filePath, FileMode.Open))
	{
	// 计算文件的哈希值,不需要把整个文件读到内存里,边读边计算
	byte[] hashBytes = sha256.ComputeHash(fs);
	// 把哈希值转换成十六进制字符串
	return BitConverter.ToString(hashBytes).Replace("-", "").ToLowerInvariant();
	}
	}
	}
	}

代码逐行讲:
1.SHA256.Create():创建SHA-256对象,SHA-256生成的哈希值是64个十六进制字符(256位);
2.ComputeHash:计算文件的哈希值,不需要把整个文件读到内存里,边读边计算——适合大文件;
3.BitConverter.ToString:把哈希值的字节数组转换成十六进制字符串,Replace("-", "")去掉分隔符,ToLowerInvariant()转换成小写。
2. 哈希算法的常见用法
验证数据的完整性:比如下载文件后,验证文件的哈希值是否和官方提供的一致,防止文件被篡改;
存储密码:不要明文存储密码,要存储密码的哈希值——登录时,把用户输入的密码计算哈希值,和数据库里的哈希值比较;
数字签名:用私钥对哈希值进行签名,用公钥验证签名——验证数据的完整性和真实性;
去重:比如用哈希值判断两个文件是否相同,适合云存储、文件同步。
六、加密技术的组合使用:对称加密+非对称加密+哈希算法
实际开发中,一般不会单独使用一种加密技术,而是组合使用对称加密、非对称加密、哈希算法——用非对称加密分发对称加密的密钥,用对称加密加密大流量数据,用哈希算法验证数据的完整性。
示例:安全的文件传输流程
1.客户端生成对称加密的密钥(比如AES密钥);
2.客户端用服务器的公钥加密AES密钥,发送给服务器;
3.服务器用私钥解密AES密钥;
4.客户端用AES密钥加密文件,发送给服务器;
5.服务器用AES密钥解密文件;
6.客户端计算文件的哈希值,用自己的私钥签名,发送给服务器;
7.服务器用客户端的公钥验证签名,计算文件的哈希值,和客户端发送的哈希值比较,验证文件的完整性。
七、基础知识拓展

  1. 加密的攻击方式
    暴力破解:尝试所有可能的密钥,破解加密的数据——破解难度和密钥长度成正比,AES-256的密钥长度是256位,暴力破解需要尝试2^256次,几乎不可能;
    字典攻击:用字典里的密码尝试破解哈希值——破解难度和密码的复杂度成正比,密码越长、越复杂,破解难度越大;
    中间人攻击:在客户端和服务器之间拦截数据,篡改数据——可以用数字签名、HTTPS防止中间人攻击;
    碰撞攻击:找到两个不同的明文生成相同的哈希值——可以用SHA-256、SHA-512防止碰撞攻击。
  2. HTTPS的加密原理
    HTTPS是HTTP+SSL/TLS的组合,用非对称加密分发对称加密的密钥,用对称加密加密HTTP请求和响应,用哈希算法验证数据的完整性。
    HTTPS的加密流程:
    1.客户端向服务器发送HTTPS请求,服务器返回证书(包含公钥);
    2.客户端验证证书的真实性,生成对称加密的密钥(比如AES密钥);
    3.客户端用服务器的公钥加密AES密钥,发送给服务器;
    4.服务器用私钥解密AES密钥;
    5.客户端和服务器用AES密钥加密HTTP请求和响应;
    6.客户端和服务器用哈希算法验证数据的完整性。
    八、总结:加密技术是网络安全的“基石”
    对称加密:一把钥匙开一把锁,速度快,适合加密大文件、大流量数据——AES是目前最安全、最流行的对称加密算法;
    非对称加密:两把钥匙,一把加密,一把解密,密钥管理容易,适合加密小数据、密钥分发——RSA是目前最流行的非对称加密算法;
    哈希算法:不可逆的“指纹”,适合验证数据的完整性、存储密码——SHA-256是目前最安全、最流行的哈希算法;
    组合使用:实际开发中,一般组合使用对称加密、非对称加密、哈希算法,兼顾安全和性能。
    下一节我们会学习网络编程的高级特性:数字签名、证书、HTTPS,让你的网络程序像银行系统一样安全。

 本站原创,转载请注明出处:https://www.xin3721.com/ArticlecSharp/c49532.html


相关教程