본문 바로가기
[ Program ]/Program Etc.

암호 이야기 #2 (.NET 암호화 클래스 사용)

by 관이119 2012. 9. 17.

오래전 (약 2002년 7월 정도) 암호화 관련 자료를 찾던 중 아래와 같은 내용을 발견하여

문서를 파일로 가지고 있었습니다.

문서를 정리하던 중 해당 내용을 블로그에 게시합니다.

너무 오랜된 일이라 원본 주소를 알 수가 없었서 원본 주소를 표시하지 못 하였다는 것을 알립니다.

----------------------------------------------------------------------------------------

 

이 기사는 탐구와 함께 시작합니다.

24개의 암호가 있지만 기억력이 예전과 같지 않아 암호를 암호화된 파일로 저장하는 방법을 알고 싶어 했습니다.

이러한 작업을 하는 상업용 도구가 있다는 것을 알고 있지만 .NET에서 새로운 기술을 학습하는 것도 유용한 연습이 될 것 같습니다.

Visual Basic .NET에서 파일을 암호화하거나 암호를 해독하는 간단하지만 완전한 프로그램을 완성했는데

그 과정에서 많은 것을 배웠습니다.

암호화는 여러 유형의 개발에서 중요한 주제이므로 이 기사에서는 그러한 프로그램을 만드는 방법에 대해 다루겠습니다.

 

Microsoft Crypto API처럼 암호화에 사용할 수 있는 낮은 수준의 기술은 많이 있습니다.

하지만 .NET의 원칙은 .NET Framework 클래스의 복잡성을 숨긴다는 것이며

암호화와 관련된 클래스를 포함하는 System.Security 네임스페이스도 있습니다.

해당 네임스페이스의 모든 클래스를 볼 수는 없지만, DES(Data Encryption Standard) 알고리즘을 사용하여

데이터를 암호화하고 암호를 해독하는 가장 간단한 클래스 중 하나를 검토하면

이러한 클래스의 일반적 작동 방법에 대해 대략 알 수 있습니다.

 

앞에서 말했듯이, 파일을 암호화하고 암호를 해독하는 예제를 실습할 것입니다.

하지만 프로그램과 관련된 기본 개념에 대한 설명을 먼저 어느 정도 이해해야 합니다.

암호화의 개념 이외에도 암호화 클래스는 스트림으로 구현되므로 .NET의 스트림에 대해서도 간단하게 살펴보아야 합니다.

 

스트림의 개요

 

스트림은 .NET에서 바이트를 처리하는 기본 개념입니다. 스트림의 작동 방법에 대한 간단한 개요가 다음에 나와 있습니다.

파일을 읽어 모든 대문자를 소문자로 바꾼 다음 결과를 다른 파일에 쓴다고 가정합니다.

그림 1은 수행하려고 하는 작업에 대한 다이어그램입니다.

그림 1. 파일을 읽어 내용을 처리하고 결과를 다시 작성하는 프로세스

 

.NET 에서 이러한 작업을 하는 가장 좋은 방법은 스트림을 사용하는 것입니다. "스트림"은 바이트 정보를 받고 (또는) 내보내는 개체입니다. 스트림에는 두 가지 유형인 백 엔드 스트림과 통과(passthrough) 스트림이 있습니다.

백 엔드 스트림

백 엔드 스트림은 바이트를 보유할 수 있는 위치에서 바이트를 가져오거나 저장합니다. 파일 스트림은 백 엔드 스트림의 예입니다.

파일 스트림은 바이트용 백 엔드 저장소로 파일을 사용하고 파일에서 읽거나 파일에 씁니다.

파일 스트림은 System.IO 네임스페이스에 있는 FileStream 클래스를 사용하여 .NET에서 구현됩니다.

FileStream 개체에는 파일을 액세스하는 ReadWrite 메소드가 있습니다.

FileStream 개체를 기존 파일에 연결하면 Read 메소드를 사용하여 파일 내용을 일련의 바이트로 가져올 수 있습니다.

Write 메소드를 사용하면 FileStream 개체는 일련의 바이트를 기존 파일이나 새 파일 중 하나에 쓸 수 있습니다.

또한 FileStream 클래스에는 파일의 특정 위치로 이동하는 Seek 메소드가 있습니다.

 

백 엔드 스트림의 다른 예제는 TCP/IP 스택에서 데이터를 가져오거나 놓아 두는 네트워크 스트림과 메모리를

임시 백 엔드로 사용하는 메모리 스트림입니다.

이러한 스트림에는 백 엔드 저장소의 바이트를 액세스하는 ReadWrite 메소드와 함께 FileStream 개체와

동일한 기본 구조가 있습니다.

네트워크 스트림과 같은 일부 백 엔드 스트림은 Seek 메소드를 지원하지 않습니다.

검색 작업을 실행할 영구 저장소가 없기 때문입니다.

통과 스트림

통과 스트림은 바이트를 받아서 처리한 다음 다른 스트림, 즉 일반적으로 백 엔드 스트림에 쓰는 스트림입니다. 예를 들어, Stream이 라는 .NET 기본 클래스에서 상속받고 대문자를 소문자로 바꾸는 통과 스트림을 만들 수 있었습니다. 그런 다음 이 스트림을 필요한 백 엔드 스트림에 연결할 수 있었습니다. 그러면 이전 다이어그램을 그림 2와 같이 표현할 수 있습니다.

그림 2. 스트림 측면에서 표현된 파일을 읽어 내용을 처리하고 결과를 다시 작성하는 프로세스

이러한 "소문자로 변환" 스트림 클래스는 해당 작업을 정기적으로 실행하는 경우에만 유용합니다. 하지만, 이러한 스트림 클래스는 자신을 통과하는 바이트에 대해 필요한 조작을 할 수 있습니다.

.NET에서 암호화

암호화와 암호 해독은 통과 스트림을 사용하여 .NET에서 이루어집니다. 예를 들어, 암호화의 경우 일반적인 일련의 단계는 다음과 같습니다.

  1. 바이트가 일부 입력 스트림(예:디스크의 암호화되지 않은 파일)에서 들어옵니다.
  2. 바이트가 암호화 스트림에 공급됩니다. 이러한 암호화 스트림 자체는 일부 출력 스트림(예: 암호화 데이터를 보유할 파일)에 연결되어 있습니다.
  3. 암호화 스트림은 바이트를 암호화하고 연결된 출력 스트림에 자동으로 놓습니다.

암호화 스트림은 CryptoStream라는 클래스에서 캡슐화됩니다. 이 클래스에 대해서는 이 기사의 뒷 부분에서 살펴보겠습니다.

디스크 파일에서 읽어서 디스크 파일에 쓴다고 가정하여 이 용어를 사용하는 경우 해당 프로세스의 다이어그램은 그림 3과 같습니다.

그림 3. 파일 암호화 프로세스

 

암호화 유형

 

정보를 암호화하는 방법은 오랫동안 계속되어 왔습니다. Edgar Allen Poe도 암호화에 잠시 관심을 가졌었으며 코드를 만들고 해독하는 과정은 2차 세계 대전에서 주요한 역할을 하였습니다. 하지만, 컴퓨터의 출현이 암호화 작업의 증가에 박차를 가하였습니다. 암호화된 메시지를 무단으로 분석하는 컴퓨터의 기능으로 인해 갈수록 해독하기 어려운 암호화 기술을 찾는 연구가 활발해지고 있습니다.

이러한 탐구는 여러가지 유형의 암호화를 이끌어 내었습니다. .NET에서 사용 가능하며 일반적으로 사용되는 방법 중 일부는 다음과 같습니다.

암호화 방법

일반 유형

방법을 구현하는 .NET 클래스

데이터 암호화 표준(DES) 대칭(개인 키) DESCryptoServiceProvider
RC2(RSA Data Security, Inc.) 대칭(개인 키) RC2CryptoServiceProvider
Rijndael 대칭(개인 키) RijndaelManaged
TripleDES(한 행에서 세 개의 DES 암호화 사용) 대칭(개인 키) TripleDESCryptoServiceProvider
디지털 서명 알고리즘 비대칭(공개 키) DSACryptoServiceProvider
RSA(Rivest, Shamir, Adelman이라는 세 사람에 의해 발명됨. 머리글자어) 비대칭(공개 키) RSACryptoServiceProvider

두 가지 일반적인 유형의 알고리즘은 대칭과 비대칭입니다. 대칭 알고리즘은 데이터를 암호화하고 암호를 해독하는 데 동일한 키를 사용합니다. 비대칭 알고리즘은 일반적으로 암호화에 사용할 수 있는 "공개 키"를 사용하고 다른 비밀 키는 암호를 해독하는 데 사용합니다. 이 항목에 대해서는 기사의 끝 부분에서 좀 더 살펴보겠습니다.

이러한 암호화 방법을 사용하기 위해 그 작동 방법에 대한 자세한 내용을 알 필요는 없습니다. 이러한 작동 방법 중 일부는 아주 복잡하므로 다행한 일입니다. 하지만 알고리즘을 선택한 경우라면 다음과 같은 세 가지 주요 요소는 살펴보아야 합니다.

  • 알고리즘으로 암호화된 메시지를 해독할 때의 어려움
  • 알고리즘 성능
  • 키의 보안

이러한 요소에 대해 논의하는 웹 사이트는 많이 있지만 살펴볼 만한 두 사이트는 http://www.microsoft.com/korea/security/와 Snake Oil FAQ[http://www.interhack.net/people/cmcurtin/snake-oil-faq.html ]입니다.

 

.NET 암호화 클래스 사용

 

이 표에 나열된 .NET 클래스는 System.Security.Cryptography 네임스페이스에 모두 있으므로 사용하려면 System.Security.dll을 참조해야 합니다. 사용자 코드를 좀 더 간결하게 하기 위해 다음과 같이 두 개의 IMPORTS 문을 사용하면 네임스페이스를 참조하는 데 도움이 됩니다.

Imports System.Security Imports System.Security.Cryptography 

위의 표에 있는 클래스는 모두 CryptoStream이라는 일반 암호화 스트리밍 클래스와 함께 작동합니다. 이렇게 하면 다양한 암호화 유형을 구현할 수 있는 단일 클래스에서 스트리밍 작업을 처리할 수 있습니다. 사용자 고유의 암호화 클래스를 만들어 CryptoStream에 연결할 수도 있습니다. 하지만 위에 나열된 클래스처럼 안전하지는 않습니니다.

본 예제에서는 .NET의 가장 간단한 암호화 양식을 사용합니다. 이 양식은 DES 알고리즘을 사용하여 대칭 키 암호화를 합니다. DES를 구현하는 통과 스트림은 DESCryptoServiceProvider라고 합니다.

대부분의 대칭 알고리즘에는 암호화 프로세스에 사용되는 두 개의 별도 바이트 배열이 필요합니다. 첫 번째 배열은 키입니다. DES의 키는 8바이트이지만 다른 알고리즘에서는 다양한 크기를 사용합니다.

이러한 개인 키는 안전한 방법로 파일을 해독할 다른 사용자에게 전달되어야 합니다. 이 키가 손상되면 암호화된 메시지도 손상됩니다. 비록 이 방법이 가장 안전한 알고리즘은 아니지만, 키가 안전한 경우 DES 암호화는 잘 작동합니다.

정 보 블록(일반적으로 8바이트)을 암호화하기 위해서 키와 마지막 블록의 결과가 모두 사용됩니다. 이는 동일한 원본 문자가 있는 블록이 같은 내용으로 암호화되지 않음을 의미합니다. 위의 내용은 반복되는 블록으로 암호 해독을 좀 더 쉽게 할 수 있는 실마리를 제공하지 않는 다는 것입니다.

그러나 첫 번째 블록에는 암호화의 입력으로 사용할 앞의 블록이 없습니다. 이러한 첫 번째 블록에 알려진 정보(예: 네트워크 머리글)가 포함되는 경우 키를 가져오기 위해 첫 번째 블록을 리버스 엔지니어링하기가 훨씬 더 쉽습니다.

이 렇게 키를 가져가는 것을 막기 위해서 DES는 "초기화 벡터"라는 것을 사용합니다. 이 벡터는 키와 같은 크기의 다른 바이트 배열이며 8바이트의 첫 번째 블록을 추가 암호화하는 데 키와 함께 사용됩니다. 일부 다른 대칭 알고리즘에서도 초기화 벡터를 사용합니다.

 

키 만들기

 

대칭 암호화 알고리즘에서 사용되는 키가 불규칙한 경우에 이 알고리즘이 가장 강력합니다. 따라서 키를 생성하는 가장 좋은 방법은 임의 과정 일부를 사용하여 필요한 8바이트를 가져오는 것입니다. 하지만 8개의 임의의 바이트를 기억하는 것은 쉽지가 않습니다. 아래의 예제에서는 키를 생성하기 위해 "암호"를 사용합니다. 즉, 암호는 8자 문자열이며 문자의 ASCII 값은 키를 구성하는 바이트 배열을 초기화하는 데 사용됩니다.

하나의 암호는 키에 필요하며 다른 암호는 초기화 벡터에 필요합니다. 이 방법은 키를 생성하는 가장 안전한 방법은 아니지만 본 예제에서는 잘 작동하며 일상적인 사용에 적합한 보안 수준을 제공합니다.

암호화/암호 해독 프로그램

암호화 및 암호 해독과 관련된 개념에 대해 설명했으므로 파일을 암호화하고 암호 해독하는 프로그램을 만들 준비가 되었습니다. Windows Forms 응용 프로그램으로 이 프로그램을 만들려고 합니다.

Visual Studio에서 새 Windows Forms 응용 프로그램을 만듭니다. 암호화 클래스에 액세스하려면 프로젝트 | 참조 추가로 이동하여 System.Security에 참조를 추가합니다.

프로젝트 양식에는 네 개의 레이블과 네 개의 텍스트 상자가 나란히 있어야 하며 두 개의 단추는 아래쪽에, 상태 표시줄은 아래쪽 가장자리에 있어야 합니다. 작업을 마친 경우 양식은 그림 4와 같아야 합니다.

그림 4. 암호화/암호 해독 프로그램을 위한 양식 레이아웃

다음 이름을 사용하여 텍스트 상자를 위에서 아래로 설정합니다.

  • txtUnencryptedFile
  • txtEncryptedFile
  • txtKeyPassword
  • txtIVPassword

각 텍스트 상자의 Text 속성을 지웁니다. 상태 표시줄의 이름을 sbEncryptionStatus라고 지정합니다.

단추 이름을 각각 btnEncrypt와 btnDecrypt로 지정한 다음 Text 속성을 각각 Encrypt와 Decrypt로 변경합니다. btnEncrypt 단추 뒤에 다음 코드를 둡니다.

Dim byteKey() As Byte byteKey = GetKeyByteArray(txtKeyPassword.Text) Dim byteInitializationVector() As Byte byteInitializationVector = GetKeyByteArray(txtIVPassword.Text) EncryptOrDecryptFile(txtUnencryptedFile.Text, _ txtEncryptedFile.Text, _ byteKey, byteInitializationVector, _ CryptoAction.actionEncrypt) 

btnDecrypt 단추 뒤에 다음 코드를 둡니다.

Dim byteKey() As Byte byteKey = GetKeyByteArray(txtKeyPassword.Text) Dim byteInitializationVector() As Byte byteInitializationVector = GetKeyByteArray(txtIVPassword.Text) EncryptOrDecryptFile(txtEncryptedFile.Text, _ txtUnencryptedFile.Text, _ byteKey, byteInitializationVector, _ CryptoAction.actionDecrypt) 

이러한 두 단추 뒤의 코드가 유사함을 알 수 있을 것입니다. 키와 초기화 벡터의 배열을 가져오기 위해 같은 함수를 사용하며 EncryptOrDecryptFile이라는 파일을 암호화하거나 암호를 해독하기 위해 같은 함수를 사용합니다. EncryptOrDecryptFile 사용에서 유일한 차이는 텍스트 상자의 파일 이름이 입력 및 출력 파일의 역순이며 해당 작업(암호화나 암호 해독)이 다르다는 것입니다.

해당 작업은 CryptoAction이라는 열거 형식으로 지정되므로 열거를 정의해야 합니다. 다음 코드를 Inherits System.Windows.Forms.Form이라는 줄 아래에 두십시오.

Private Enum CryptoAction actionEncrypt = 1 actionDecrypt = 2 End Enum 

그리고 암호화 클래스와 스트림 클래스를 쉽게 참조하려면 모듈 맨 위에 문을 두어야 합니다. 다음과 같은 필요한 코드 줄이 있습니다.

Imports System.Security.Cryptography Imports System.Security Imports System.IO 

지금까지는 코드가 다소 간단하였습니다. 이제 키가 오는 위치를 알아보겠습니다. 다음은 암호를 바이트 배열로 바꾸는 함수입니다. 따라서 다음 양식의 코드에 함수를 추가해야 합니다.

Private Function GetKeyByteArray(ByVal sPassword As String) As Byte() Dim byteTemp(7) As Byte sPassword = sPassword.PadRight(8) ' 8자인지 확인합니다. Dim iCharIndex As Integer For iCharIndex = 0 To 7 byteTemp(iCharIndex) = Asc(Mid$(sPassword, iCharIndex + 1, 1)) Next Return byteTemp End Function 

이것 역시 간단한 코드입니다. Visual Basic 6.0 개발자가 길이가 올바른지 확인하려면 String의 PadRight 메소드 사용에 주의해야 합니다. 이 메소드는 Visual Basic 6.0에서 동등한 문자열 조작 코드를 대신합니다.

이제 그 내용에 대해 살펴보겠습니다. 암호화와 암호 해독을 처리하려면 다음 함수를 삽입합니다.

Private Sub EncryptOrDecryptFile(ByVal sInputFile As String, _ ByVal sOutputFile As String, _ ByVal byteDESKey() As Byte, _ ByVal byteDESIV() As Byte, _ ByVal Direction As CryptoAction) '파일 스트림을 만들어 입력 및 출력 파일을 처리합니다. Dim fsInput As New FileStream(sInputFile, _ FileMode.Open, FileAccess.Read) Dim fsOutput As New FileStream(sOutputFile, _ FileMode.OpenOrCreate, FileAccess.Write) fsOutput.SetLength(0) '암호화/암호 해독 프로세스 중 필요한 변수입니다. Dim byteBuffer(4096) As Byte '처리를 위해 바이트 블록을 보유합니다. Dim nBytesProcessed As Long = 0 '암호화된 바이트의 실행 카운트 Dim nFileLength As Long = fsInput.Length Dim iBytesInCurrentBlock As Integer Dim desProvider As New DESCryptoServiceProvider() Dim csMyCryptoStream As CryptoStream Dim sDirection As String ' 암호화나 암호 해독을 위한 설정 Select Case Direction Case CryptoAction.actionEncrypt csMyCryptoStream = New CryptoStream(fsOutput, _ desProvider.CreateEncryptor(byteDESKey, byteDESIV), _ CryptoStreamMode.Write) sDirection = "암호화" Case CryptoAction.actionDecrypt csMyCryptoStream = New CryptoStream(fsOutput, _ desProvider.CreateDecryptor(byteDESKey, byteDESIV), _ CryptoStreamMode.Write) sDirection = "암호 해독" End Select sbEncryptionStatus.Text = sDirection + " 시작..." '입력 파일에서 읽은 다음 암호화하거나 암호를 해독하고 '출력 파일에 씁니다. While nBytesProcessed < nFileLength iBytesInCurrentBlock = fsInput.Read(byteBuffer, 0, 4096) csMyCryptoStream.Write(byteBuffer, 0, iBytesInCurrentBlock) nBytesProcessed = nBytesProcessed + CLng(iBytesInCurrentBlock) sbEncryptionStatus.Text = sDirection + _ " 처리 중 - 처리된 바이트 - " + _ nBytesProcessed.ToString End While sbEncryptionStatus.Text = "마침 " + sDirection + _ ". 처리된 총 바이트 - " + nBytesProcessed.ToString csMyCryptoStream.Close() fsInput.Close() fsOutput.Close() End Sub 

이 코드에 대해 살펴보겠습니다.

첫 번째 섹션은 읽은 파일의 입력을 처리하고 새 파일에 출력을 실행하기 위해 파일 스트림 객체(fsInputfsOutput)를 만듭니다. 그리고 함수의 나머지 부분에서 필요한 변수와 객체에 대한 몇 가지 선언이 있습니다. 선언된 요소는 다음과 같습니다.

  • byteBuffer: 데이터의 현재 블록을 처리하기 위해 사용할 바이트의 배열입니다. 이 배열은 입력 파일을 읽어서 채워진 다음 암호화를 위해 CryptoStream 개체로 전달됩니다. 뒷 부분의 코드에는 입력 파일을 처리하는 루프가 있고 byteBuffer에 있는 4096 바이트 블록으로 루프를 가져옵니다.
  • nBytesProcessed: 현재까지 처리된 입력 파일 총 바이트 수의 실행 카운트입니다.
  • nFileLength: 입력 파일의 길이입니다.
  • iBytesInCurrentBlock: 루프의 특정 반복에서 처리된 바이트 수입니다. 마지막 반복을 제외한 모든 반복에서 4096바이트가 될 것입니다. 마지막 반복에서는 파일의 마지막 블록의 나머지 바이트 수(일반적으로 4096 미만)가 됩니다.
  • desProvider: 사용할 암호화/암호 해독 기능을 제공하기 위해 CryptoStream에 연결됩니다.
  • csMyCryptoStream: 암호화나 암호 해독에 사용되는 CryptoStream 개체입니다.
  • sDirection: 이러한 함수를 실행하여 처리할 작업에 대한 CryptoAction 값(actionEncrypt 또는 actionDecrypt)입니다.

다음 섹션은 함수 실행으로 처리할 내용에 따라 암호화나 암호 해독을 설정하는 Select Case입니다. DESCryptoServiceProviderCreateEncryptorCreateDecryptor 메소드 중 하나를 사용하여 각각 암호 생성기나 암호 해독기를 만들 수 있습니다. 이 함수는 csMyCryptoStream이라는 사용할 CryptoStream 개체를 인스턴스화하기 위해 사용됩니다. 출력용으로 사용할 스트림을 알기 위해 csMyCryptoStream 개체도 필요합니다. 암호화와 암호 해독 모두에 대해 fsOutput 스트림이 csMyCryptoStream의 인스턴스화 동안에 이러한 용도로 지정됩니다.

또한 Encryption이나 Decryption 값을 사용하여 상태 표시줄 메시지에 사용할 문자열도 설정합니다.

마지막으로 암호화나 암호 해독을 실제로 실행하는 섹션을 살펴보겠습니다. While 루프는 한 번에 한 블록씩 입력 파일에서 데이터를 읽습니다. 이 블록은 해당 Write 메소드를 사용하여 csMyCryptoStream에 쓰여집니다. 그런 다음 csMyCryptoStream은 자동으로 암호화나 암호 해독을 실행하고 fsOutput이라는 연결 파일 스트림에 결과를 씁니다. 그리고 나서 처리된 총 실행 바이트 수와 상태 표시줄 메시지를 업데이트하고 다른 블록을 처리하기 위해 다시 반복합니다.

루프가 완료된 후 상태 표시줄 텍스트를 업데이트하고 스트림 개체를 닫으면 작업이 끝납니다.

프로젝트를 테스트할 준비가 되었습니다. 테스트를 제대로 하려면 암호화할 적당한 크기의 파일이 필요합니다. 저작권 문제가 없는 다양한 작품의 텍스트 파일을 다운로드할 수 있는 웹 사이트인 Project Gutenberg[http://promo.net/pg/]의 텍스트 파일을 사용했습니다. 선택한 텍스트 파일은 아서 코난 도일의 셜록 홈즈 이야기입니다. 이 텍스트 파일의 길이는 573 KB입니다.

암호화하려고 선택한 파일의 경로 이름을 Unencrypted File 텍스트 상자에 입력하고 암호화된 버전의 경로 이름을 Encrypted File 텍스트 상자에 입력합니다. 또한 키와 초기화 벡터에 사용할 암호도 만들어야 합니다.

700-MHz Pentium III 컴퓨터에서 테스트했을 때 523 KB의 셜록 홈즈 이야기를 암호화하는 데 걸린 시간이 2초보다 짧았습니다. 즉, DES 알고리즘의 장점 중 하나인 좋은 성능이 증명된 셈입니다.

테 스트 후에 출력 파일을 열어보면 암호화가 잘 되어 있을 것입니다. 이제 같은 암호를 사용하여 이 파일을 다른 파일 이름으로 암호를 해독해 보십시오. 새로 암호가 해독된 파일이 원래 파일과 정확히 같음을 스스로 확인해보고 싶을 것입니다. Microsoft Windows에는 이 테스트에 사용할 수 있는 FC(File Compare)라는 명령줄 유틸리티가 있습니다.

암 호를 해독할 때 암호 변경을 하면 암호 해독이 제대로 작동하지 않습니다. 하지만 암호를 해독할 때 초기화 벡터를 변경하면 어떤 일이 발생하는지 알아보는 것도 흥미로울 것입니다. 해당 파일은 첫 번째 8 바이트만 제외하고는 암호가 제대로 해독됩니다. 따라서 초기화 벡터는 첫 번째 블록을 제외한 다른 내용은 보호하지 못합니다.

결론

앞 에서 언급했듯이, DES 알고리즘은 여러 가지 선택 사항 중 하나일 뿐입니다. 가장 융통성 있는 옵션 중 하나는 비대칭 암호화라고도 하는 공개 키 암호화 시스템을 사용하는 것입니다. 이 방법에서는 암호화와 암호 해독에 사용되는 키가 다릅니다. 암호화 키는 공개로 만들어지지만 암호 해독 키는 암호를 해독해야 하는 개인에 의해 비밀로 유지됩니다. 누구나 암호화 키를 사용하여 암호화할 수 있지만 암호 해독은 암호 해독 키를 사용해야만 실행될 수 있습니다.

공개 키 암호화의 가장 큰 단점은 성능 문제입니다. 대칭 알고리즘은 공개 키 알고리즘 처리 능력의 일부만을 필요로 합니다. 하지만 다른 사람(모르는 사람일지라도)이 파일을 암호화하게 한 다음 자신에게 보내게 하는 기능은 더 많은 융통성을 제공합니다.

선택한 암호화 기술에 상관없이 .NET 암호화 클래스는 이 기술을 사용하기 쉽게 만듭니다. 이 기사의 예제에서 볼 수 있듯이 필요한 키와 다른 매개 변수를 제공한 다음 암호화 클래스를 적절한 스트림에 연결하기만 하면 됩니다. 이렇게 하면 암호화 기술을 사용하는 Visual Basic .NET 응용 프로그램을 만들기가 더욱 쉽습니다.

댓글