跳至页脚内容
.NET 帮助

C# AES 加密(开发者如何使用)

AES(高级加密标准) 是最常用的对称加密算法之一。 它使用相同的密钥来加密和解密数据,使 AES 加密在许多应用程序中能有效快速地保护敏感数据。

本教程将专注于 C# 中的 AES 加密,使用 AES 类来加密和解密数据以及 IronPDF 库。 我们将涵盖实用示例,分步讲解加密过程,并了解如何使用密码块链(CBC)模式增加安全性。 我们还将讨论加密密钥管理和初始化向量(IV)的作用。

C# 中的 AES 加密介绍

高级加密标准(AES)是一种由美国国家标准与技术研究院 (NIST) 标准化的对称加密算法。 该算法可以拥有 128、192 或 256 位的密钥大小,可高度安全地加密机密数据。 它使用相同的加密密钥来加密和解密数据。

AES的工作原理是将原始数据分成区块并对这些区块进行转换。 它以不同的密码模式运行,如 CBC(密码块链)和电子密码本(ECB),每种模式均提供不同的安全特性。

C# 中 AES 的工作原理

C# 中的 AES 加密算法是 System.Security.Cryptography 命名空间的一部分。 此命名空间包括 AES 类,允许我们创建 AES 实例,指定密钥大小、密码模式和填充模式,然后使用秘密密钥加密和解密数据。

要在 C# 中使用 AES,请遵循以下基本步骤:

  1. 使用 Aes.Create() 创建 AES 类的实例。
  2. 设置密钥、IV 和其他相关参数,如密码模式。
  3. 使用 ICryptoTransform 接口加密数据并将其写入 MemoryStream。
  4. 使用相同的密钥和 IV 解密数据。

我们来创建一个基本的加密和解密 C# 程序。

using System;
using System.IO;
using System.Security.Cryptography;
using System.Text;

class Program
{
    // Declare a static byte array for encrypted data
    public static byte[] encryptedData;

    // Main method to demonstrate encryption and decryption
    public static void Main(string[] args)
    {
        // String plaintext to be encrypted
        string plaintext = "This is some sensitive data!";
        string key = "abcdefghijklmnop"; // 128-bit key (16 characters)

        // Encrypt the plaintext
        string ciphertext = Encrypt(plaintext, key);
        Console.WriteLine("Encrypted Data: " + ciphertext);

        // Decrypt the ciphertext
        string decryptedData = Decrypt(ciphertext, key);
        Console.WriteLine("Decrypted Data: " + decryptedData);
    }

    // Method to encrypt data
    public static string Encrypt(string plaintext, string key)
    {
        // Create a new instance of the AES encryption algorithm
        using (Aes aes = Aes.Create())
        {
            aes.Key = Encoding.UTF8.GetBytes(key);
            aes.IV = new byte[16]; // Initialization vector (IV)

            // Create an encryptor to perform the stream transform
            ICryptoTransform encryptor = aes.CreateEncryptor(aes.Key, aes.IV);

            // Create the streams used for encryption
            using (MemoryStream ms = new MemoryStream())
            {
                // Create a CryptoStream using the encryptor
                using (CryptoStream cs = new CryptoStream(ms, encryptor, CryptoStreamMode.Write))
                {
                    using (StreamWriter sw = new StreamWriter(cs))
                    {
                        sw.Write(plaintext);
                    }
                }
                // Store the encrypted data in the public static byte array
                encryptedData = ms.ToArray();
                return Convert.ToBase64String(encryptedData);
            }
        }
    }

    // Method to decrypt data
    public static string Decrypt(string ciphertext, string key)
    {
        using (Aes aes = Aes.Create())
        {
            aes.Key = Encoding.UTF8.GetBytes(key);
            aes.IV = new byte[16]; // Initialization vector (IV)

            // Create a decryptor to perform the stream transform
            ICryptoTransform decryptor = aes.CreateDecryptor(aes.Key, aes.IV);

            // Create the streams used for decryption
            using (MemoryStream ms = new MemoryStream(Convert.FromBase64String(ciphertext)))
            {
                using (CryptoStream cs = new CryptoStream(ms, decryptor, CryptoStreamMode.Read))
                {
                    using (StreamReader sr = new StreamReader(cs))
                    {
                        return sr.ReadToEnd();
                    }
                }
            }
        }
    }
}
using System;
using System.IO;
using System.Security.Cryptography;
using System.Text;

class Program
{
    // Declare a static byte array for encrypted data
    public static byte[] encryptedData;

    // Main method to demonstrate encryption and decryption
    public static void Main(string[] args)
    {
        // String plaintext to be encrypted
        string plaintext = "This is some sensitive data!";
        string key = "abcdefghijklmnop"; // 128-bit key (16 characters)

        // Encrypt the plaintext
        string ciphertext = Encrypt(plaintext, key);
        Console.WriteLine("Encrypted Data: " + ciphertext);

        // Decrypt the ciphertext
        string decryptedData = Decrypt(ciphertext, key);
        Console.WriteLine("Decrypted Data: " + decryptedData);
    }

    // Method to encrypt data
    public static string Encrypt(string plaintext, string key)
    {
        // Create a new instance of the AES encryption algorithm
        using (Aes aes = Aes.Create())
        {
            aes.Key = Encoding.UTF8.GetBytes(key);
            aes.IV = new byte[16]; // Initialization vector (IV)

            // Create an encryptor to perform the stream transform
            ICryptoTransform encryptor = aes.CreateEncryptor(aes.Key, aes.IV);

            // Create the streams used for encryption
            using (MemoryStream ms = new MemoryStream())
            {
                // Create a CryptoStream using the encryptor
                using (CryptoStream cs = new CryptoStream(ms, encryptor, CryptoStreamMode.Write))
                {
                    using (StreamWriter sw = new StreamWriter(cs))
                    {
                        sw.Write(plaintext);
                    }
                }
                // Store the encrypted data in the public static byte array
                encryptedData = ms.ToArray();
                return Convert.ToBase64String(encryptedData);
            }
        }
    }

    // Method to decrypt data
    public static string Decrypt(string ciphertext, string key)
    {
        using (Aes aes = Aes.Create())
        {
            aes.Key = Encoding.UTF8.GetBytes(key);
            aes.IV = new byte[16]; // Initialization vector (IV)

            // Create a decryptor to perform the stream transform
            ICryptoTransform decryptor = aes.CreateDecryptor(aes.Key, aes.IV);

            // Create the streams used for decryption
            using (MemoryStream ms = new MemoryStream(Convert.FromBase64String(ciphertext)))
            {
                using (CryptoStream cs = new CryptoStream(ms, decryptor, CryptoStreamMode.Read))
                {
                    using (StreamReader sr = new StreamReader(cs))
                    {
                        return sr.ReadToEnd();
                    }
                }
            }
        }
    }
}
$vbLabelText   $csharpLabel

C# AES 加密(开发者如何使用):图 1 - 使用内存流加密和解密输出

代码解释

  1. Aes.Create()这将创建一个新的 AES 加密算法实例。
  2. aes.Key用于加密和解密的密钥。 它必须是有效大小,如 128 位(16 字节)、192 位或 256 位。
  3. aes.IV初始化向量(IV)用于随机化加密过程。 在此示例中,我们使用全零 IV 以简化。
  4. MemoryStream:这使我们能够以字节流的形式处理加密数据。
  5. CryptoStream:它转换数据流(加密或解密)。

高级示例:使用自定义密钥和 IV 进行 AES 加密

我们在前一个示例的基础上建立,通过生成随机密钥IV,确保加密更安全。

public static string EncryptData(string plaintext)
{
    using (Aes aes = Aes.Create())
    {
        aes.Key = new byte[32]; // AES-256 requires a 256-bit key (32 bytes)
        aes.IV = new byte[16];  // 128-bit block size

        // Randomly generate key and IV
        using (RandomNumberGenerator rng = RandomNumberGenerator.Create())
        {
            rng.GetBytes(aes.Key); // Generate a random key
            rng.GetBytes(aes.IV);  // Generate a random IV
        }

        // Create an encryptor to perform the stream transform
        ICryptoTransform encryptor = aes.CreateEncryptor(aes.Key, aes.IV);

        // Create the streams used for encryption
        using (MemoryStream ms = new MemoryStream())
        {
            using (CryptoStream cs = new CryptoStream(ms, encryptor, CryptoStreamMode.Write))
            {
                using (StreamWriter sw = new StreamWriter(cs))
                {
                    sw.Write(plaintext);
                }
            }
            return Convert.ToBase64String(ms.ToArray());
        }
    }
}
public static string EncryptData(string plaintext)
{
    using (Aes aes = Aes.Create())
    {
        aes.Key = new byte[32]; // AES-256 requires a 256-bit key (32 bytes)
        aes.IV = new byte[16];  // 128-bit block size

        // Randomly generate key and IV
        using (RandomNumberGenerator rng = RandomNumberGenerator.Create())
        {
            rng.GetBytes(aes.Key); // Generate a random key
            rng.GetBytes(aes.IV);  // Generate a random IV
        }

        // Create an encryptor to perform the stream transform
        ICryptoTransform encryptor = aes.CreateEncryptor(aes.Key, aes.IV);

        // Create the streams used for encryption
        using (MemoryStream ms = new MemoryStream())
        {
            using (CryptoStream cs = new CryptoStream(ms, encryptor, CryptoStreamMode.Write))
            {
                using (StreamWriter sw = new StreamWriter(cs))
                {
                    sw.Write(plaintext);
                }
            }
            return Convert.ToBase64String(ms.ToArray());
        }
    }
}
$vbLabelText   $csharpLabel

在这种情况下,每次调用该函数时,我们都会生成一个新密钥IV。 这提供了更强的加密,因为对于每个操作不会重复使用相同的密钥AES 支持的密钥大小包括 128、192 和 256 位。

使用 AES 解密数据

解密是加密数据的逆过程。 在我们的示例中,必须提供用于加密的相同密钥和 IV 才能解密数据。 解密过程涉及将加密数据转换回其原始形式。

以下是一个使用先前加密数据的示例:

public static string DecryptData(string ciphertext, byte[] key, byte[] iv)
{
    using (Aes aes = Aes.Create())
    {
        aes.Key = key;
        aes.IV = iv;

        // Create a decryptor to perform the stream transform
        ICryptoTransform decryptor = aes.CreateDecryptor(aes.Key, aes.IV);

        // Create the streams used for decryption
        using (MemoryStream ms = new MemoryStream(Convert.FromBase64String(ciphertext)))
        {
            using (CryptoStream cs = new CryptoStream(ms, decryptor, CryptoStreamMode.Read))
            {
                using (StreamReader sr = new StreamReader(cs))
                {
                    return sr.ReadToEnd();
                }
            }
        }
    }
}
public static string DecryptData(string ciphertext, byte[] key, byte[] iv)
{
    using (Aes aes = Aes.Create())
    {
        aes.Key = key;
        aes.IV = iv;

        // Create a decryptor to perform the stream transform
        ICryptoTransform decryptor = aes.CreateDecryptor(aes.Key, aes.IV);

        // Create the streams used for decryption
        using (MemoryStream ms = new MemoryStream(Convert.FromBase64String(ciphertext)))
        {
            using (CryptoStream cs = new CryptoStream(ms, decryptor, CryptoStreamMode.Read))
            {
                using (StreamReader sr = new StreamReader(cs))
                {
                    return sr.ReadToEnd();
                }
            }
        }
    }
}
$vbLabelText   $csharpLabel

此代码将加密数据解密回原始数据

与 AES 加密结合使用的 IronPDF

IronPDF 是一个简单且开发者友好的 .NET 库,旨在使用简单的 C# 代码生成、编辑和操作 PDF。 它允许开发人员直接从 HTML、CSS 和 JavaScript创建 PDF 文档,这在动态生成报告、发票或其他文档时非常有用。 通过支持合并、分割以及添加密码或数字签名等安全功能,IronPDF 是 .NET 应用程序中全面的 PDF 生成解决方案。

将 IronPDF 与 AES 加密集成

C# AES 加密(开发者如何使用):图 2 - IronPDF

当您生成敏感报告或文档时,可能需要确保在共享之前对 PDF 内的数据进行加密。 AES(高级加密标准)加密是安全加密 PDF 文件内容的完美解决方案。 通过结合使用 IronPDF 和 AES 加密,您可以保护 PDF 中的数据,同时仍可以操作文档本身。

步骤 1:使用 IronPDF 创建 PDF

使用ChromePdfRenderer类从 HTML 内容生成 PDF 并保存到文件:

var htmlContent = "<h1>Confidential</h1><p>This is sensitive data.</p>";
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf(htmlContent);
pdf.SaveAs(@"C:\Reports\ConfidentialReport.pdf");
var htmlContent = "<h1>Confidential</h1><p>This is sensitive data.</p>";
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf(htmlContent);
pdf.SaveAs(@"C:\Reports\ConfidentialReport.pdf");
$vbLabelText   $csharpLabel

步骤 2:使用 AES 加密 PDF

PDF文件创建完成后,使用AES算法对其进行加密:

byte[] pdfBytes = File.ReadAllBytes(@"C:\Reports\ConfidentialReport.pdf");
using (Aes aes = Aes.Create())
{
    aes.Key = Encoding.UTF8.GetBytes("abcdefghijklmnop");
    aes.IV = new byte[16];
    using (var encryptor = aes.CreateEncryptor(aes.Key, aes.IV))
    using (var ms = new MemoryStream())
    {
        using (var cs = new CryptoStream(ms, encryptor, CryptoStreamMode.Write))
        {
            cs.Write(pdfBytes, 0, pdfBytes.Length);
        }
        File.WriteAllBytes(@"C:\Reports\ConfidentialReport.encrypted", ms.ToArray());
    }
}
byte[] pdfBytes = File.ReadAllBytes(@"C:\Reports\ConfidentialReport.pdf");
using (Aes aes = Aes.Create())
{
    aes.Key = Encoding.UTF8.GetBytes("abcdefghijklmnop");
    aes.IV = new byte[16];
    using (var encryptor = aes.CreateEncryptor(aes.Key, aes.IV))
    using (var ms = new MemoryStream())
    {
        using (var cs = new CryptoStream(ms, encryptor, CryptoStreamMode.Write))
        {
            cs.Write(pdfBytes, 0, pdfBytes.Length);
        }
        File.WriteAllBytes(@"C:\Reports\ConfidentialReport.encrypted", ms.ToArray());
    }
}
$vbLabelText   $csharpLabel

结论

C# AES 加密(开发者如何使用):图 3 - 授权

将 IronPDF 与 AES 加密集成可以生成动态、安全的文档,这些文档既可访问又加密。 无论是开发需要安全文档生成的应用程序,还是管理敏感报告,将 IronPDF 与强加密结合可以保护您的数据。 IronPDF 简化了 PDF 的使用,而 AES 能确保内容的安全。

IronPDF 提供了免费试用,便于开发人员在购买前探索其功能。 如果您准备将 IronPDF 实施到您的项目中,许可证起价$liteLicense,为一次性购买。

常见问题解答

如何在C#中将HTML转换为PDF?

你可以使用IronPDF的RenderHtmlAsPdf方法将HTML字符串转换为PDF。你还可以使用RenderHtmlFileAsPdf将HTML文件转换为PDF。

什么是 AES 加密,如何在 C# 中使用?

AES(高级加密标准)是一种用于保护数据的对称加密算法。在 C# 中,AES 加密使用 System.Security.Cryptography 命名空间中的 AES 类实现。您可以创建一个 AES 实例,设置密钥和 IV 参数,并使用 ICryptoTransform 接口加密和解密数据。

在 AES 加密中使用密码分组链接 (CBC) 模式有什么好处?

密码分组链接 (CBC) 模式通过确保相同的明文分组产生不同的密文分组来增强安全性。这是通过使用初始化向量 (IV) 来链接分组的加密来实现的。

如何在 C# 中使用 AES 加密 PDF 文档?

要在 C# 中使用 AES 加密 PDF,可以利用 IronPDF 来处理 PDF 文件,然后通过在写入加密数据到新文件之前,用指定的密钥和 IV 加密 PDF 字节来应用 AES 加密。

在 C# 应用程序中实施 AES 加密涉及哪些步骤?

要在 C# 中实施 AES 加密,您需要创建一个 AES 实例,设置密钥和 IV,创建一个加密器,并使用 MemoryStreamCryptoStream 转换数据。

我可以在 C# 中为 AES 加密使用自定义密钥和 IV 吗?

是的,在 AES 加密中,您可以指定自定义密钥和 IV 来增强安全性。建议为每次加密会话生成随机值以提供更好的保护。

开发人员如何在 C# 中增强 PDF 文档的安全性?

开发人员可以使用 IronPDF 结合 AES 加密来增强 C# 中 PDF 文档的安全性,允许创建、编辑和保护 PDF,包括添加密码和数字签名。

IronPDF 如何在共享之前帮助保护 PDF 内容?

IronPDF 在共享之前通过允许开发人员使用 AES 加密来帮助保护 PDF 内容。该过程包括生成、编辑和操作具有加密方法的 PDF 文件以确保数据保护。

在 AES 加密中,密钥管理为什么很重要?

在 AES 加密中,密钥管理至关重要,因为加密数据的安全性在很大程度上依赖于加密密钥的保密性和强度。适当的管理可以防止未经授权访问。

对于 C# 开发人员来说,IronPDF 库的关键功能是什么?

IronPDF 库允许 C# 开发人员轻松创建、编辑和操作 PDF 文档。它支持合并、拆分和使用加密保护 PDF 等功能,增强了文档管理和安全性。

Jacob Mellor,Team Iron 的首席技术官
首席技术官

Jacob Mellor 是 Iron Software 的首席技术官,是 C# PDF 技术的先锋工程师。作为 Iron Software 核心代码库的原始开发者,自公司成立以来,他就塑造了公司的产品架构,并与首席执行官 Cameron Rimington 一起将其转变成一家公司,拥有50多人,服务于 NASA、特斯拉和全球政府机构。

Jacob 拥有曼彻斯特大学 (1998-2001) 的一级荣誉土木工程学士学位。1999 年在伦敦创办了自己的第一家软件公司,并于 2005 年创建了他的第一个 .NET 组件后,他专注于解决微软生态系统中的复杂问题。

他的旗舰 IronPDF 和 Iron Suite .NET 库在全球已获得超过 3000 万次的 NuGet 安装,其基础代码继续为全球使用的开发者工具提供支持。拥有 25 年商业经验和 41 年编程经验的 Jacob 仍专注于推动企业级 C#、Java 和 Python PDF 技术的创新,同时指导下一代技术领导者。