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를 사용하려면 다음 기본 단계를 따르십시오:
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();
}
}
}
}
}
}
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)는 암호화 과정을 무작위화하기 위해 사용됩니다. 이 예에서는 간단히 위해 0으로 된 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 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 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
이 코드는 암호화된 데이터를 다시 원본 데이터로 복호화합니다.
IronPDF와 AES 암호화
IronPDF는 간단한 C# 코드를 사용하여 PDF를 생성, 편집, 조작하도록 설계된 간단하고 개발자 친화적인 .NET 라이브러리입니다. 개발자가 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");
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());
}
}
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를 구현할 준비가 되셨다면, 라이선스는 일회성 구매 비용 $799부터 시작합니다.
자주 묻는 질문
C#에서 HTML을 PDF로 변환하는 방법은 무엇인가요?
IronPDF의 RenderHtmlAsPdf 메서드를 사용하여 HTML 문자열을 PDF로 변환할 수 있습니다. 또한 RenderHtmlFileAsPdf 사용하여 HTML 파일을 PDF로 변환할 수도 있습니다.
AES 암호화란 무엇이며 C#에서 어떻게 사용되나요?
AES(고급 암호화 표준)는 데이터를 보호하는 데 사용되는 대칭 암호화 알고리즘입니다. C#에서는 System.Security.Cryptography 네임스페이스의 AES 클래스를 사용하여 AES 암호화를 구현합니다. AES 인스턴스를 생성하고 키와 IV 매개변수를 설정한 후, ICryptoTransform 인터페이스를 사용해 데이터를 암호화 및 복호화합니다.
AES 암호화에 있어 CBC(암호 블록 연쇄) 모드를 사용하는 이점은 무엇인가요?
암호 블록 연결(CBC) 모드는 동일한 평문 블록이 서로 다른 암호문 블록을 생성하도록 보장함으로써 보안을 강화합니다. 이는 블록 암호화를 연결하는 초기화 벡터(IV)를 사용하여 달성됩니다.
C#에서 AES를 사용하여 PDF 문서를 암호화할 수 있나요?
C#에서 AES를 사용하여 PDF를 암호화하려면, IronPDF를 사용하여 PDF 파일을 처리하고, 지정된 키와 IV로 PDF 바이트를 암호화하여 암호화된 데이터를 새로운 파일로 다시 작성하면 됩니다.
C# 애플리케이션에서 AES 암호화를 구현하는 과정은 무엇인가요?
C#에서 AES 암호화를 구현하려면 AES 인스턴스를 생성하고 키와 IV를 설정한 다음 암호화기를 생성한 후 MemoryStream과 CryptoStream을 사용하여 데이터를 변환해야 합니다.
C#에서 AES 암호화를 위해 사용자 지정 키와 IV를 사용할 수 있나요?
네, AES 암호화에서는 보안을 강화하기 위해 사용자 지정 키와 IV를 지정할 수 있습니다. 각 암호화 세션마다 임의의 값을 생성하는 것이 더 나은 보호를 위해 권장됩니다.
C#에서 개발자는 PDF 문서의 보안을 어떻게 강화할 수 있나요?
개발자는 IronPDF와 AES 암호화를 결합하여 C#에서 PDF 문서의 보안을 강화할 수 있습니다. 이는 PDF 생성, 편집, 보안 기능을 제공하며 암호 추가 및 디지털 서명을 포함합니다.
IronPDF는 PDF 콘텐츠를 공유하기 전 보안을 어떻게 도와주나요?
IronPDF는 개발자가 AES를 사용하여 PDF를 암호화할 수 있도록 하여 PDF 콘텐츠를 공유하기 전에 보안을 돕습니다. 이 과정은 PDF 파일 생성, 편집 및 암호화 방법을 사용하여 데이터를 보호하는 것을 포함합니다.
AES 암호화에서 키 관리는 왜 중요한가요?
키 관리는 AES 암호화에서 필수적입니다. 왜냐하면 암호화된 데이터의 보안은 암호화 키의 비밀성과 강도에 크게 의존하기 때문입니다. 적절한 관리는 무단 접근을 방지합니다.
C# 개발자를 위한 IronPDF 라이브러리의 주요 기능은 무엇인가요?
IronPDF 라이브러리는 C# 개발자가 쉽게 PDF 문서를 생성, 편집 및 조작할 수 있도록 합니다. 병합, 분할 및 암호화를 통한 보안과 같은 기능을 지원하여 문서 관리 및 보안을 향상시킵니다.




