使用 C# 的简单 AES 加密






3.65/5 (12投票s)
一个简短易懂的文本 (文件) 加密
引言
这是一个使用 C# 编写的非常简单的加密工具,作为一个 Windows 窗体项目。它使用基于用户提供的密码的 AES 对称加密。
我创建这个工具是因为我需要一些非常简单和快速的解决方案来加密文本文件,而不是互联网上发现的那些通常更全面和复杂的工具。
一个重要的注意事项 – 该工具实际上并没有加密文件本身,而是加密文本文件内的文本。加密后的文本可以保存为另一个文本文件。
解决方案
该工具由一个简单的窗体组成,如下图所示
上方的文本框用于指定要加密/解密的文件的路径。 这个框使用 浏览 按钮填充,该按钮将打开一个 OpenFileDialog
。文本文件会自动在下面的 RichTextBox
中打开。
密码在标记为“Password
”的 textbox
中输入。 单击 加密 按钮将导致 RichTextBox
中的文本立即被加密,而 解密 按钮将解密它(返回到原始状态)。
已经加密的文件的解密工作方式相同 – 通过 浏览 按钮打开文件并将其加载到 Richtextbox
中 – 然后用户需要输入用于加密原始文件(文本)的密码,然后单击 解密 – 原始文本将出现在 RichTextBox
中。
此外,可以手动将任意文本输入到 Richtextbox
中,或者可以在加密之前更改原始文本。
可以使用 另存为 按钮保存 Richtextbox
的当前状态(无论是文本的加密版本还是解密版本)。 您可以选择将其保存到现有文件或新文件。
删除原始文件 按钮用于删除原始文件(使用 浏览 按钮打开的文件)。
Using the Code
代码基本上只在一个文件中,即 *Form1.cs*,并且包含 5 个按钮点击处理程序。 我将只描述实际进行加密和解密的部分。
加密
private void Encrypt_Click(object sender, EventArgs e)
{
if (textBoxPassword.Text == "") return;
byte[] bytes = Encoding.Unicode.GetBytes(richTextBox1.Text);
//Encrypt
SymmetricAlgorithm crypt = Aes.Create();
HashAlgorithm hash = MD5.Create();
crypt.BlockSize = BlockSize;
crypt.Key = hash.ComputeHash(Encoding.Unicode.GetBytes(textBoxPassword.Text));
crypt.IV = IV;
using (MemoryStream memoryStream = new MemoryStream())
{
using (CryptoStream cryptoStream =
new CryptoStream(memoryStream, crypt.CreateEncryptor(), CryptoStreamMode.Write))
{
cryptoStream.Write(bytes, 0, bytes.Length);
}
richTextBox1.Text = Convert.ToBase64String(memoryStream.ToArray());
}
}
此方法初始化 AES SymmetricAlgorithm
和 MD5 HashAlgorithm
对象。
AES 对象用于加密来自 Richtextbox
的文本(首先必须将其转换为字节数组)。
MD5 对象用于从提供的密码创建 MD5 哈希,以便将其用作对称密钥,因为 AES 算法使用 16 字节的加密密钥(AES 的最小密钥大小为 128 位) – 这将确保我们得到用户密码的唯一 (1 : 1) 16 字节表示。
AES 算法的 IV(初始化向量)和 BlockSize
设置为全局变量中的固定值
private byte[] IV = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16};
private int BlockSize = 128;
要进行加密本身,我们必须使用 CryptoStream
对象,该对象使用使用先前设置的 Aes 对称算法创建的 Encryptor
。 CryptoStream
获取原始字节数组并将加密的字节发送到提供的 MemoryStream
中,然后我们读取并将其转换为 Base64 string
,以便可以读取它。
生成的加密文本被写入 RichTextBox
中。
解密
private void Decrypt_Click(object sender, EventArgs e)
{
if (textBoxPassword.Text == "") return;
//Decrypt
byte[] bytes = Convert.FromBase64String(richTextBox1.Text);
SymmetricAlgorithm crypt = Aes.Create();
HashAlgorithm hash = MD5.Create();
crypt.Key = hash.ComputeHash(Encoding.Unicode.GetBytes(textBoxPassword.Text));
crypt.IV = IV;
using (MemoryStream memoryStream = new MemoryStream(bytes))
{
using (CryptoStream cryptoStream =
new CryptoStream(memoryStream, crypt.CreateDecryptor(), CryptoStreamMode.Read))
{
byte[] decryptedBytes = new byte[bytes.Length];
cryptoStream.Read(decryptedBytes, 0, decryptedBytes.Length);
richTextBox1.Text = Encoding.Unicode.GetString(decryptedBytes);
}
}
}
此方法以与 Encrypt_Click
方法相同的方式初始化 Aes 和 MD5 对象,但使用相反的方法来解密输入字符串(字节数组)。
由于在加密期间,我们将加密的字符串转换为 Base64 string
,现在我们需要恢复,因此首先,我们将 FromBase64String
转换为一个字节数组,该字节数组随后用作解密器的输入。
对于 CryptoStream
,这次创建了一个 decryptor
对象。 CryptoStream
将读取提供的 MemoryStream
,解密字节数据并将解密的字节数组返回到提供的变量中。
示例
历史
- 2019 年 2 月 28 日:初始版本