티스토리 뷰

목차

    반응형

    .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

    반응형