티스토리 뷰
목차
.NET C# 라이브러리는 문자열 암/복호화를 위한 기본 요소를 제공합니다. 암복호화를 위해선 몇 가지 단계가 필요한데, 이 포스트에서는 암복호화 과정에 대한 간단한 루틴을 소개합니다.
MD5 해쉬 합계 생성기(MD5 hash sum generator)의 도움을 조금 받아, 실제 암호화를 위해 사용할 3DES(Triple DES)를 사용합니다. 전체 소스 코드는 맨 아래에 있지만, 먼저 구현 순서를 살펴보는 것도 괜찮습니다.
3DES 프로젝트 다운로드 - EncryptionSample.zip
[닷넷 프로그래밍] 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 알고리즘 자체는 바이트 배열을 암호화된 바이트 배열로 변경합니다.
[닷넷 프로그래밍] 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)와 비슷합니다.
[닷넷 프로그래밍] 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 |
[닷넷 프로그래밍] encrypt 예제
참조 - 빠른 암복호화 파일과 간략 설명
파일 1 - Encryptor.cs
파일 2 - Encryptor.dll
위의 파일들은 바이트 배열을 사용해 암복호를 신속하게 처리해 줍니다.
암호화 시 반환되는 형태는 "Convert.ToBase64String(message)"이고, 복호화 시 반환되는 형태는 "Encoding.UTF8.GetString(message)"로서, 역시나 일반적인 인코딩 규칙을 준수하는 코드입니다.
[닷넷 프로그래밍] encrypt 예제
ps. 소싯적에 외국 형님 글을 번역한 겁니다. 출처가 생각나질 않아요.
관련 글
▷ Crypto 암호화 알고리즘 로그인 폼, WinCE MFC 다이얼로그
▷ BouncyCastle 자바 암호화 알고리즘, 3DES 등 예제 [Java강좌]
▷ 3DES 암호화 프로그램 소스, C#-자바(java)-안드로이드
ⓒ written by vicddory