본문 바로가기
C++ 200제/코딩 IT 정보

C# 3DES(Triple des) 암호화 복호화 알고리즘 dll

by vicddory 2017. 3. 2.
반응형

.NET C# 라이브러리는 문자열 암/복호화를 위한 기본 요소를 제공합니다. 암복호화를 위해선 몇 가지 단계가 필요한데, 이 포스트에서는 암복호화 과정에 대한 간단한 루틴을 소개합니다.


MD5 해쉬 합계 생성기(MD5 hash sum generator)의 도움을 조금 받아, 실제 암호화를 위해 사용할 3DES(Triple DES)를 사용합니다. 전체 소스 코드는 맨 아래에 있지만, 먼저 구현 순서를 살펴보는 것도 괜찮습니다.


3DES 프로젝트 다운로드EncryptionSample.zip


c# 암호화 triple des[닷넷 프로그래밍] encrypt 예제

◆ 문제점

암호화할 문자열 값을 설정한 뒤, 비밀번호(Password 변수의 secret)로 암호화하여 비교적 안전하게 문자열을 보관할 수 있도록 Base64로 인코딩해야 합니다.



1
2
3
4
5
6
7
8
9
10
// 메세지 암호화 (복호화 전 단계)
string Msg = "This world is round, not flat, don't believe them!";
string Password = "secret";
string EncryptedString = EncryptString(Msg, Password);
string DecryptedString = DecryptString(EncryptedString, Password);
 
Console.WriteLine("Message: {0}",Msg);
Console.WriteLine("Password: {0}",Password);
Console.WriteLine("Encrypted string: {0}",EncryptedString);
Console.WriteLine("Decrypted string: {0}",DecryptedString);
cs



Triple Des 알고리즘 사용을 위해서, EncrypString 함수에 암호화할 문자열과 키를 지정합니다.


또, MD5 해쉬 알고리즘을 사용해서 128 비트의 키를 생성합니다.



1
2
3
4
5
// Step 1. MD5 해쉬를 사용해서 암호화하고,    
// MD5 해쉬 생성기를 사용해서 결과는 128 비트 바이트 배열인데,    
// 3DES Triple Des 인코딩을 위한 올바른 길이가 됨.
MD5CryptoServiceProvider HashProvider = new MD5CryptoServiceProvider();    
byte[] TDESKey = HashProvider.ComputeHash(UTF8.GetBytes(Passphrase));
cs



3DES 알고리즘 자체는 바이트 배열을 암호화된 바이트 배열로 변경합니다.

triple des c# 알고리즘[닷넷 프로그래밍] encrypt 예제

그래서 처음 System.Text.UTF8Encoding 인코더를 통해 바이트 배열로 C# 메세지 문자열을 컨버팅해야 합니다. 키는 3DES 알고리즘을 초기화하는 데 사용됩니다.


또한, 한 번의 인코딩 모드 지정(CipherMode.ECB), pad(padding) 설정(PaddingMode.PKCS7)을 통해 3DES 사용 방법을 정의합니다.



1
2
3
4
5
6
7
// Step 2. TripleDESCryptoServiceProvider object 생성
TripleDESCryptoServiceProvider TDESAlgorithm = new TripleDESCryptoServiceProvider();
 
// Step 3. Encoder 모드 설정
TDESAlgorithm.Key = TDESKey;
TDESAlgorithm.Mode = CipherMode.ECB;
TDESAlgorithm.Padding = PaddingMode.PKCS7;
cs



결과적으로 Triple DES로 암호화된 바이트 배열은 쉽게 저장할 수 있도록 Base64로 인코딩됩니다.


UTF8 형식의 문자열에서 Base64로 인코딩된 암호화 문자열로 변환하는 것을 제외하고 DecryptString 함수는 암호화 함수(EncryptString)와 비슷합니다.



c# 3des 암호화 dll[닷넷 프로그래밍] encrypt 예제

◆ 위 방법의 단점

아래의 완성된 코드를 위해 MD5 해쉬는 128트로만 사용했는데, C#에서는 64, 128, 192 비트의 키 길이를 지원합니다.


그래서 다른 길이의 키를 생성하기 위한 부분이 없고 모두와 호환이 되진 않습니다.



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
using System;
using System.Text;
using System.Security.Cryptography;
 
namespace EncryptStringSample{ 
 
   class MainClass   
   {      
      public static string EncryptString(string Message, string Passphrase)   
      {         
    byte[] Results;      
    System.Text.UTF8Encoding UTF8 = new System.Text.UTF8Encoding();
 
    // Step 1. MD5 해쉬를 사용해서 암호화하고,       
    // MD5 해쉬 생성기를 사용해서 결과는 128 비트 바이트 배열인데,          
    // 3DES 인코딩을 위한 올바른 길이가 됨.
 
        MD5CryptoServiceProvider HashProvider = new MD5CryptoServiceProvider();            
    byte[] TDESKey = HashProvider.ComputeHash(UTF8.GetBytes(Passphrase));            
 
    // Step 2. TripleDESCryptoServiceProvider object 생성            
    TripleDESCryptoServiceProvider TDESAlgorithm = new TripleDESCryptoServiceProvider();
 
    // Step 3. Triple DES Encoder 설정
    TDESAlgorithm.Key = TDESKey;            
    TDESAlgorithm.Mode = CipherMode.ECB;            
    TDESAlgorithm.Padding = PaddingMode.PKCS7;
 
    // Step 4. 암호화할 문자열을 Byte[]로 변환          
    byte[] DataToEncrypt = UTF8.GetBytes(Message);         
 
    // Step 5. 실제로 문자열을 암호화      
    try        
    {      
        ICryptoTransform Encryptor = TDESAlgorithm.CreateEncryptor();
        Results = Encryptor.TransformFinalBlock(DataToEncrypt, 0, DataToEncrypt.Length); 
    }
    finally      
    {
        // 중요한 3DES, Hashprovider의 속성을 해제       
        TDESAlgorithm.Clear();        
        HashProvider.Clear();     
    }
        // Step 6. 암호화된 문자열을 Base64로 변환하여 리턴      
        return Convert.ToBase64String(Results);    
      }     
      public static string DecryptString(string Message, string Passphrase)    
      {  
    byte[] Results;          
    System.Text.UTF8Encoding UTF8 = new System.Text.UTF8Encoding();        
    MD5CryptoServiceProvider HashProvider = new MD5CryptoServiceProvider();       
    byte[] TDESKey = HashProvider.ComputeHash(UTF8.GetBytes(Passphrase));
 
    // Step 2. TripleDESCryptoServiceProvider object 생성       
    TripleDESCryptoServiceProvider TDESAlgorithm = new TripleDESCryptoServiceProvider();
 
    // Step 3. Decoder 설정
    TDESAlgorithm.Key = TDESKey;       
    TDESAlgorithm.Mode = CipherMode.ECB;       
    TDESAlgorithm.Padding = PaddingMode.PKCS7;       
 
    // Step 4. 인자로 받은 문자열을 Byte[]로 변환       
    byte[] DataToDecrypt = Convert.FromBase64String(Message);
 
    // Step 5. 실제 문자열 복호화
    try         
    {
        ICryptoTransform Decryptor = TDESAlgorithm.CreateDecryptor();
        Results = Decryptor.TransformFinalBlock(DataToDecrypt, 0, DataToDecrypt.Length);
    }     
    finally
    {          
        // 중요한 3DES, Hashprovider의 속성을 해제
        TDESAlgorithm.Clear();                
        HashProvider.Clear();            
    }
        // Step 6. UTF-8 형태로 복호화된 문자열 리턴, Triple DES 복호
        return UTF8.GetString( Results );     
      }
      public static void Main(string[] args)  
      {  
          // 메세지 암호화
    string Msg = "This world is round, not flat, don't believe them!";
    string Password = "secret";       
    string EncryptedString = EncryptString(Msg, Password);      
    string DecryptedString = DecryptString(EncryptedString, Password);   
   
    Console.WriteLine("Message: {0}",Msg);          
    Console.WriteLine("Password: {0}",Password);          
    Console.WriteLine("Encrypted string: {0}",EncryptedString);     
    Console.WriteLine("Decrypted string: {0}",DecryptedString);    
    } 
   }
}
cs



3des 알고리즘 암호화 복호화[닷넷 프로그래밍] encrypt 예제


참조 - 빠른 암복호화 파일과 간략 설명


파일 1 - Encryptor.cs

파일 2 - Encryptor.dll


위의 파일들은 바이트 배열을 사용해 암복호를 신속하게 처리해 줍니다.

암호화 시 반환되는 형태는 "Convert.ToBase64String(message)"이고, 복호화 시 반환되는 형태는 "Encoding.UTF8.GetString(message)"로서, 역시나 일반적인 인코딩 규칙을 준수하는 코드입니다.



C# 3DES(Triple des) 암호화 복호화 알고리즘 dll[닷넷 프로그래밍] encrypt 예제



ps. 소싯적에 외국 형님 글을 번역한 겁니다. 출처가 생각나질 않아요.



관련 글


Crypto 암호화 알고리즘 로그인 폼, WinCE MFC 다이얼로그


BouncyCastle 자바 암호화 알고리즘, 3DES 등 예제 [Java강좌]


3DES 암호화 프로그램 소스, C#-자바(java)-안드로이드




ⓒ written by vicddory

반응형