
C# AES 加密(开发者如何使用)
AES(高级加密标准) 是最常用的对称加密算法之一。 它使用相同的密钥来加密和解密数据,使 AES 加密在许多应用程序中能有效快速地保护敏感数据。
本教程将专注于 C# 中的 AES 加密,使用 AES 类来加密和解密数据以及 IronPDF 库。 我们将涵盖实用示例,分步讲解加密过程,并了解如何使用密码块链(CBC)模式增加安全性。 我们还将讨论加密密钥管理和初始化向量(IV)的作用。
Introduction of AES Encryption in C#
高级加密标准(AES)是一种由美国国家标准与技术研究院 (NIST) 标准化的对称加密算法。 该算法可以拥有 128、192 或 256 位的密钥大小,可高度安全地加密机密数据。 它使用相同的加密密钥来加密和解密数据。
AES的工作原理是将原始数据分成区块并对这些区块进行转换。 它以不同的密码模式运行,如 CBC(密码块链)和电子密码本(ECB),每种模式均提供不同的安全特性。
How AES Works in C#
C# 中的 AES 加密算法是 System.Security.Cryptography 命名空间的一部分。 此命名空间包括 AES 类,允许我们创建 AES 实例,指定密钥大小、密码模式和填充模式,然后使用秘密密钥加密和解密数据。
要在 C# 中使用 AES,请遵循以下基本步骤:
- 使用
Aes.Create()创建AES类的实例。 - 设置密钥、IV 和其他相关参数,如密码模式。
- 使用 ICryptoTransform 接口加密数据并将其写入 MemoryStream。
- 使用相同的密钥和 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();
}
}
}
}
}
}Imports System
Imports System.IO
Imports System.Security.Cryptography
Imports System.Text
Friend Class Program
' Declare a static byte array for encrypted data
Public Shared encryptedData() As Byte
' Main method to demonstrate encryption and decryption
Public Shared Sub Main(ByVal args() As String)
' String plaintext to be encrypted
Dim plaintext As String = "This is some sensitive data!"
Dim key As String = "abcdefghijklmnop" ' 128-bit key (16 characters)
' Encrypt the plaintext
Dim ciphertext As String = Encrypt(plaintext, key)
Console.WriteLine("Encrypted Data: " & ciphertext)
' Decrypt the ciphertext
Dim decryptedData As String = Decrypt(ciphertext, key)
Console.WriteLine("Decrypted Data: " & decryptedData)
End Sub
' Method to encrypt data
Public Shared Function Encrypt(ByVal plaintext As String, ByVal key As String) As String
' Create a new instance of the AES encryption algorithm
Using aes As Aes = System.Security.Cryptography.Aes.Create()
aes.Key = Encoding.UTF8.GetBytes(key)
aes.IV = New Byte(15){} ' Initialization vector (IV)
' Create an encryptor to perform the stream transform
Dim encryptor As ICryptoTransform = aes.CreateEncryptor(aes.Key, aes.IV)
' Create the streams used for encryption
Using ms As New MemoryStream()
' Create a CryptoStream using the encryptor
Using cs As New CryptoStream(ms, encryptor, CryptoStreamMode.Write)
Using sw As New StreamWriter(cs)
sw.Write(plaintext)
End Using
End Using
' Store the encrypted data in the public static byte array
encryptedData = ms.ToArray()
Return Convert.ToBase64String(encryptedData)
End Using
End Using
End Function
' Method to decrypt data
Public Shared Function Decrypt(ByVal ciphertext As String, ByVal key As String) As String
Using aes As Aes = System.Security.Cryptography.Aes.Create()
aes.Key = Encoding.UTF8.GetBytes(key)
aes.IV = New Byte(15){} ' Initialization vector (IV)
' Create a decryptor to perform the stream transform
Dim decryptor As ICryptoTransform = aes.CreateDecryptor(aes.Key, aes.IV)
' Create the streams used for decryption
Using ms As New MemoryStream(Convert.FromBase64String(ciphertext))
Using cs As New CryptoStream(ms, decryptor, CryptoStreamMode.Read)
Using sr As New StreamReader(cs)
Return sr.ReadToEnd()
End Using
End Using
End Using
End Using
End Function
End Class
代码解释
- **
Aes.Create():**这将创建AES加密算法的新实例。 - **
aes.Key:**用于加密和解密的密钥。 它必须是有效大小,如 128 位(16 字节)、192 位或 256 位。 - **
aes.IV:**初始化向量(IV),用于使加密过程随机化。 在此示例中,我们使用全零 IV 以简化。 - **MemoryStream:**这使我们能够以字节流的形式处理加密数据。
- **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 Shared Function EncryptData(ByVal plaintext As String) As String
Using aes As Aes = Aes.Create()
aes.Key = New Byte(31){} ' AES-256 requires a 256-bit key (32 bytes)
aes.IV = New Byte(15){} ' 128-bit block size
' Randomly generate key and IV
Using rng As RandomNumberGenerator = RandomNumberGenerator.Create()
rng.GetBytes(aes.Key) ' Generate a random key
rng.GetBytes(aes.IV) ' Generate a random IV
End Using
' Create an encryptor to perform the stream transform
Dim encryptor As ICryptoTransform = aes.CreateEncryptor(aes.Key, aes.IV)
' Create the streams used for encryption
Using ms As New MemoryStream()
Using cs As New CryptoStream(ms, encryptor, CryptoStreamMode.Write)
Using sw As New StreamWriter(cs)
sw.Write(plaintext)
End Using
End Using
Return Convert.ToBase64String(ms.ToArray())
End Using
End Using
End Function在这种情况下,每次调用该函数时,我们都会生成一个新密钥和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 Shared Function DecryptData(ByVal ciphertext As String, ByVal key() As Byte, ByVal iv() As Byte) As String
Using aes As Aes = Aes.Create()
aes.Key = key
aes.IV = iv
' Create a decryptor to perform the stream transform
Dim decryptor As ICryptoTransform = aes.CreateDecryptor(aes.Key, aes.IV)
' Create the streams used for decryption
Using ms As New MemoryStream(Convert.FromBase64String(ciphertext))
Using cs As New CryptoStream(ms, decryptor, CryptoStreamMode.Read)
Using sr As New StreamReader(cs)
Return sr.ReadToEnd()
End Using
End Using
End Using
End Using
End Function此代码将加密数据解密回原始数据。
与 AES 加密结合使用的 IronPDF
IronPDF 是一个简单且开发者友好的 .NET 库,旨在使用简单的 C# 代码生成、编辑和操作 PDF。 它允许开发人员直接从 HTML、CSS 和 JavaScript创建 PDF 文档,这在动态生成报告、发票或其他文档时非常有用。 通过支持合并、分割以及添加密码或数字签名等安全功能,IronPDF 是 .NET 应用程序中全面的 PDF 生成解决方案。
将 IronPDF 与 AES 加密集成

当您生成敏感报告或文档时,可能需要确保在共享之前对 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");Dim htmlContent = "<h1>Confidential</h1><p>This is sensitive data.</p>"
Dim renderer = New ChromePdfRenderer()
Dim pdf = renderer.RenderHtmlAsPdf(htmlContent)
pdf.SaveAs("C:\Reports\ConfidentialReport.pdf")步骤 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());
}
}Dim pdfBytes() As Byte = File.ReadAllBytes("C:\Reports\ConfidentialReport.pdf")
Using aes As Aes = Aes.Create()
aes.Key = Encoding.UTF8.GetBytes("abcdefghijklmnop")
aes.IV = New Byte(15){}
Using encryptor = aes.CreateEncryptor(aes.Key, aes.IV)
Using ms = New MemoryStream()
Using cs = New CryptoStream(ms, encryptor, CryptoStreamMode.Write)
cs.Write(pdfBytes, 0, pdfBytes.Length)
End Using
File.WriteAllBytes("C:\Reports\ConfidentialReport.encrypted", ms.ToArray())
End Using
End Using
End Using结论
将 IronPDF 与 AES 加密集成可以生成动态、安全的文档,这些文档既可访问又加密。 无论是开发需要安全文档生成的应用程序,还是管理敏感报告,将 IronPDF 与强加密结合可以保护您的数据。 IronPDF 简化了 PDF 的使用,而 AES 能确保内容的安全。
IronPDF 提供了免费试用,便于开发人员在购买前探索其功能。 如果您准备将IronPDF实现到您的项目中,许可证的起价为$999,可一次性购买。

Jacob Mellor 是 Iron Software 的首席技术官,也是一位开创 C# PDF 技术的有远见的工程师。作为 Iron Software 核心代码库的原始开发者,他从公司成立之初就开始塑造公司的产品架构,与首席执行官 Cameron Rimington 一起将公司转变为一家拥有 50 多名员工的公司,为 NASA、特斯拉和全球政府机构提供服务。
相关文章


