首先,创建一个文件流,指向新生成的“EncryptedFile.txt”并设置为写入模式。接着从控制台读取用户输入的字符串,将其转换为字节数组——这一步至关重要,因为加密操作本质上处理的是字节流。
using System;
using System.IO;
using System.Security.Cryptography;
using System.Text;
class FileEncrypt {
public static Byte[] ConvertStringToByteArray(String s)
{
return (new UnicodeEncoding()).GetBytes(s);
}
public static void Main()
{
//创建文件流
FileStream fs = new FileStream("EncryptedFile.txt",FileMode.Create,FileAccess.Write);
Console.WriteLine("输入一些要存储在加密文件中的文本::");
String strinput = Console.ReadLine();
Byte[] bytearrayinput=ConvertStringToByteArray(strinput);
//具有随机密钥的 DES 实例
DESCryptoServiceProvider des = new DESCryptoServiceProvider();
//从此实例创建 DES 加密器
ICryptoTransform desencrypt = des.CreateEncryptor();
//创建使用 des 加密转换文件流的加密流
CryptoStream cryptostream = new CryptoStream(fs,desencrypt,CryptoStreamMode.Write);
//写出 DES 加密文件
cryptostream.Write(bytearrayinput,0,bytearrayinput.Length);
cryptostream.Close();
//创建文件流以读回加密文件
FileStream fsread = new FileStream("EncryptedFile.txt",FileMode.Open,FileAccess.Read);
//从此 des 实例创建 DES 解密器
ICryptoTransform desdecrypt = des.CreateDecryptor();
//创建加密流集合以便对传入的字节进行读取并执行 des 解密转换
CryptoStream cryptostreamDecr = new CryptoStream(fsread,desdecrypt,CryptoStreamMode.Read);
//输出已解密文件的内容
Console.WriteLine( (new StreamReader(cryptostreamDecr, new UnicodeEncoding())).ReadToEnd() );
Console.WriteLine ();
Console.WriteLine ("按 Enter 键继续...");
Console.ReadLine();
}
}
接下来,实例化DESCryptoServiceProvider,这里利用了其自动生成的随机密钥——每次运行密钥都不同,但由于加密和解密使用的是同一个DES对象,因此密钥是一致的。随后通过CreateEncryptor()获取加密器,并借助CryptoStream将数据流实时加密后写入文件。注意,CryptoStream工作在写入模式,它会调用底层加密器对字节进行变换,实现C#对称加密中的核心步骤。
写入完成后,立即关闭加密流(同时也刷新了缓冲区)。紧接着,为了验证解密的正确性,代码重新以读取模式打开同一个文件,用CreateDecryptor()创建解密器,再套一层CryptoStream并设置为读取模式。最后通过StreamReader将解密后的字节流读取为字符串,并输出到控制台。
整个流程一目了然:输入→加密→写文件→读文件→解密→输出。对于想上手.NET加密的开发者来说,这段代码足以作为C#文件加密解密的入门模板。当然,在实际生产环境中,DES已被认为不够安全,建议改用AES算法。但从学习对称加密原理的角度来看,这段代码将核心环节都展示清楚了,非常值得收藏和参考。
