티스토리 뷰

반응형

C#으로 만들어진 프로그램 중에서 CryptoStream을 통해 암호화된 문자열을

복호화해야되는 경우가 간혹 있다. 

 

그럴때 아래코드를 통해 빠르게 해결해보도록 하자.

( 자세한 설명은 하지 않겠다. )

 

 

여기서 중요한점은 Mode와 Padding은 문제마다 다르니 꼭 확인하고 수정해야한다!!!

추가로 Key도 문제마다 다르니 꼭 확인하고 수정해야한다. 그러나 무조건 8글자인건 동일!!

 


byte[] 와 String에대한 처리에도 익숙해지자.

 

String → byte[]

ASCIIEncoding.ASCII.GetBytes("ABCD");

Encoding.UTF8.GetBytes("ABCD");

 

byte[] → String

Encoding.UTF8.GetString(byte[]);


코드

 

using System; 
using System.Security.Cryptography; 
using System.IO; 
using System.Net; 
using System.Text; 

namespace ch4njun_cs 
{ 
    class Program 
    { 
        static void Main(string[] args) 
        { 
            string OriStr = "Hello World"; 
            string EncStr = Encrypt(OriStr); 
            string DecStr = Decrypt(EncStr); 

            Console.WriteLine("원본 데이터=========================="); 
            Console.WriteLine(OriStr); 

            Console.WriteLine("암호화 데이터========================="); 
            Console.WriteLine(EncStr); 

            Console.WriteLine("복호화 데이터========================="); 
            Console.WriteLine(DecStr); 
        } 

        //암호화 키.  8글자로 이루어짐. 
        static byte[] Skey = ASCIIEncoding.ASCII.GetBytes("BluSH4G*"); 

        static string Encrypt(string p_data) 
        { 
            // 암호화 알고리즘중 RC2 암호화를 하려면 RC를 
            // DES알고리즘을 사용하려면 DESCryptoServiceProvider 객체를 선언한다. 
            //RC2 rc2 = new RC2CryptoServiceProvider(); 
            DESCryptoServiceProvider rc2 = new DESCryptoServiceProvider(); 

            rc2.Mode = CipherMode.ECB; 
            rc2.Padding = PaddingMode.PKCS7; 

            // 대칭키 배치 
            rc2.Key = Skey; 
            rc2.IV = Skey; 

            // 암호화는 스트림(바이트 배열)을 
            // 대칭키에 의존하여 암호화 하기때문에 먼저 메모리 스트림을 생성한다. 
            MemoryStream ms = new MemoryStream(); 

            //만들어진 메모리 스트림을 이용해서 암호화 스트림 생성 
            CryptoStream cryStream = 
                              new CryptoStream(ms, rc2.CreateEncryptor(), CryptoStreamMode.Write); 

            // 데이터를 바이트 배열로 변경 
            byte[] data = Encoding.UTF8.GetBytes(p_data.ToCharArray()); 

            // 암호화 스트림에 데이터 씀 
            cryStream.Write(data, 0, data.Length); 
            cryStream.FlushFinalBlock(); 

            // 암호화 완료 (string으로 컨버팅해서 반환) 
            return Convert.ToBase64String(ms.ToArray()); 
        } 

        static string Decrypt(string p_data) 
        { 

            // 암호화 알고리즘중 RC2 암호화를 하려면 RC를 
            // DES알고리즘을 사용하려면 DESCryptoServiceProvider 객체를 선언한다. 
            //RC2 rc2 = new RC2CryptoServiceProvider(); 
            DESCryptoServiceProvider rc2 = new DESCryptoServiceProvider(); 

            rc2.Mode = CipherMode.ECB; 
            rc2.Padding = PaddingMode.PKCS7; 

            // 대칭키 배치 
            rc2.Key = Skey; 
            rc2.IV = Skey; 

            // 암호화는 스트림(바이트 배열)을 
            // 대칭키에 의존하여 암호화 하기때문에 먼저 메모리 스트림을 생성한다. 
            MemoryStream ms = new MemoryStream(); 

            //만들어진 메모리 스트림을 이용해서 암호화 스트림 생성 
            CryptoStream cryStream = 
                              new CryptoStream(ms, rc2.CreateDecryptor(), CryptoStreamMode.Write); 

            //데이터를 바이트배열로 변경한다. 
            byte[] data = Convert.FromBase64String(p_data); 

            //변경된 바이트배열을 암호화 한다. 
            cryStream.Write(data, 0, data.Length); 
            cryStream.FlushFinalBlock(); 

            //암호화 한 데이터를 스트링으로 변환해서 리턴 
            return Encoding.UTF8.GetString(ms.GetBuffer()); 
        } 
    } 
}
반응형

'Reversing > Routine' 카테고리의 다른 글

[Routine] EXE파일 없이 dll내부의 키값 찾기  (0) 2019.06.27
[Routine] Windows Message Loop  (0) 2019.06.05
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/07   »
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
글 보관함