65.9K
CodeProject 正在变化。 阅读更多。
Home

使用 C# 的简单 AES 加密

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.65/5 (12投票s)

2019年2月28日

公共领域

3分钟阅读

viewsIcon

88239

downloadIcon

3758

一个简短易懂的文本 (文件) 加密

Sample Image - maximum width is 600 pixels

引言

这是一个使用 C# 编写的非常简单的加密工具,作为一个 Windows 窗体项目。它使用基于用户提供的密码的 AES 对称加密。

我创建这个工具是因为我需要一些非常简单和快速的解决方案来加密文本文件,而不是互联网上发现的那些通常更全面和复杂的工具。

一个重要的注意事项 – 该工具实际上并没有加密文件本身,而是加密文本文件内的文本。加密后的文本可以保存为另一个文本文件。

解决方案

该工具由一个简单的窗体组成,如下图所示

SimpleEncrypt form

上方的文本框用于指定要加密/解密的文件的路径。 这个框使用 浏览 按钮填充,该按钮将打开一个 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 对称算法创建的 EncryptorCryptoStream 获取原始字节数组并将加密的字节发送到提供的 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,解密字节数据并将解密的字节数组返回到提供的变量中。

示例

Decrypted text Encrypted text

历史

  • 2019 年 2 月 28 日:初始版本
© . All rights reserved.