C#中有哪些⽅式可以实现对⽂件的加密解密操作?并⽐较它们的优劣

B站影视 2025-02-03 14:15 3

摘要:在 C# 中,实现文件加密和解密的操作可以通过多种方法,常见的包括使用 .NET Framework 提供的加密库,如 System.Security.Cryptography 类库。这些方法通常依赖于对称加密和非对称加密算法。在对文件进行加密和解密时,我们需

在 C# 中,实现文件加密和解密的操作可以通过多种方法,常见的包括使用 .NET Framework 提供的加密库,如 System.Security.Cryptography 类库。这些方法通常依赖于对称加密和非对称加密算法。在对文件进行加密和解密时,我们需要选择合适的加密算法、密钥管理方式和加密模式。

对称加密是指加密和解密操作使用相同的密钥。这种方式通常速度较快,适合加密大量数据,比如文件内容。

using System;using System.IO;using System.Security.Cryptography;using System.Text;class Program{static void Main{string FilePath = @"C:\temp\example.txt";string encryptedFilePath = @"C:\temp\encrypted.txt";string decryptedFilePath = @"C:\temp\decrypted.txt";string key = "mysecretkey12345"; // 16 bytes key for AESstring iv = "1234567890123456"; // 16 bytes IV for AES// 加密EncryptFile(filePath, encryptedFilePath, key, iv);Console.WriteLine("文件加密完成");// 解密DecryptFile(encryptedFilePath, decryptedFilePath, key, iv);Console.WriteLine("文件解密完成");}static void EncryptFile(string inputFilePath, string outputFilePath, string key, string iv){using (Aes aesAlg = Aes.Create){aesAlg.Key = Encoding.UTF8.Getbytes(key);aesAlg.IV = Encoding.UTF8.GetBytes(iv);using (FileStream fsInput = new FileStream(inputFilePath, FileMode.Open))using (FileStream fsOutput = new FileStream(outputFilePath, FileMode.Create))using (CryptoStream cs = new CryptoStream(fsOutput, aesAlg.CreateEncryptor, CryptoStreamMode.Write)){fsInput.CopyTo(cs);}}}static void DecryptFile(string inputFilePath, string outputFilePath, string key, string iv){using (Aes aesAlg = Aes.Create){aesAlg.Key = Encoding.UTF8.GetBytes(key);aesAlg.IV = Encoding.UTF8.GetBytes(iv);using (FileStream fsInput = new FileStream(inputFilePath, FileMode.Open))using (FileStream fsOutput = new FileStream(outputFilePath, FileMode.Create))using (CryptoStream cs = new CryptoStream(fsInput, aesAlg.CreateDecryptor, CryptoStreamMode.Read)){cs.CopyTo(fsOutput);}}}}密钥管理问题:对称加密的密钥必须安全管理,密钥泄露会导致加密文件的安全性失效。

非对称加密使用一对密钥,公钥用于加密,私钥用于解密。常见的非对称加密算法包括 RSA。

using System;using System.IO;using System.Security.Cryptography;class Program{static void Main{string filePath = @"C:\temp\example.txt";string encryptedFilePath = @"C:\temp\encrypted.txt";string decryptedFilePath = @"C:\temp\decrypted.txt";// RSA 密钥对生成RSA rsa = RSA.Create;rsa.KeySize = 2048;// 公钥与私钥string publicKey = Convert.ToBase64String(rsa.ExportRSAPublicKey);string PrivateKey = Convert.ToBase64String(rsa.ExportRSAPrivateKey);// 加密文件EncryptFile(filePath, encryptedFilePath, publicKey);Console.WriteLine("文件加密完成");// 解密文件DecryptFile(encryptedFilePath, decryptedFilePath, privateKey);Console.WriteLine("文件解密完成");}static void EncryptFile(string inputFilePath, string outputFilePath, string publicKey){using (RSA rsa = RSA.Create){rsa.ImportRSAPublicKey(Convert.FromBase64String(publicKey), out _);byte data = File.ReadAllBytes(inputFilePath);byte encryptedData = rsa.Encrypt(data, RSAEncryptionPadding.OaepSHA256);File.WriteAllBytes(outputFilePath, encryptedData);}}static void DecryptFile(string inputFilePath, string outputFilePath, string privateKey){using (RSA rsa = RSA.Create){rsa.ImportRSAPrivateKey(Convert.FromBase64String(privateKey), out _);byte encryptedData = File.ReadAllBytes(inputFilePath);byte decryptedData = rsa.Decrypt(encryptedData, RSAEncryptionPadding.OaepSHA256);File.WriteAllBytes(outputFilePath, decryptedData);}}}

混合加密方法结合了对称加密和非对称加密的优点。首先使用非对称加密算法(如 RSA)加密一个对称密钥(如 AES),然后使用这个对称密钥加密文件。解密时先用私钥解密对称密钥,再用对称密钥解密文件。

来源:面试八股文

相关推荐