티스토리 뷰
반응형
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 |