출처 뽀우의 ASP.NET reference | 뽀우
원문 http://blog.naver.com/crossbow71/60031682267

가장 일반적이고 많이 알려진 암호화/복호화 방법입니다.

간단한 예를 적었으니... 활용하시기 바랍니다.

해당하는 Passsword만 일치시켜주면 되구요.

그럼...

* 네임스페이스

using System.Security.Cryptography;

using System.Text;

using System.IO;

* 2개의 메서드

//1. 암호화

private static string EncryptString(string InputText, string Password)

{

// Rihndael class를 선언하고, 초기화 합니다

RijndaelManaged RijndaelCipher = new RijndaelManaged();

// 입력받은 문자열을 바이트 배열로 변환

byte[] PlainText = System.Text.Encoding.Unicode.GetBytes(InputText);

// 딕셔너리 공격을 대비해서 키를 더 풀기 어렵게 만들기 위해서

// Salt를 사용합니다.

byte[] Salt = Encoding.ASCII.GetBytes(Password.Length.ToString());

// PasswordDeriveBytes 클래스를 사용해서 SecretKey를 얻습니다.

PasswordDeriveBytes SecretKey = new PasswordDeriveBytes(Password, Salt);

// Create a encryptor from the existing SecretKey bytes.

// encryptor 객체를 SecretKey로부터 만듭니다.

// Secret Key에는 32바이트

// (Rijndael의 디폴트인 256bit가 바로 32바이트입니다)를 사용하고,

// Initialization Vector로 16바이트

// (역시 디폴트인 128비트가 바로 16바이트입니다)를 사용합니다

ICryptoTransform Encryptor = RijndaelCipher.CreateEncryptor(SecretKey.GetBytes(32), SecretKey.GetBytes(16));

// 메모리스트림 객체를 선언,초기화

MemoryStream memoryStream = new MemoryStream();

// CryptoStream객체를 암호화된 데이터를 쓰기 위한 용도로 선언

CryptoStream cryptoStream = new CryptoStream(memoryStream, Encryptor, CryptoStreamMode.Write);

// 암호화 프로세스가 진행됩니다.

cryptoStream.Write(PlainText, 0, PlainText.Length);

// 암호화 종료

cryptoStream.FlushFinalBlock();

// 암호화된 데이터를 바이트 배열로 담습니다.

byte[] CipherBytes = memoryStream.ToArray();

// 스트림 해제

memoryStream.Close();

cryptoStream.Close();

// 암호화된 데이터를 Base64 인코딩된 문자열로 변환합니다.

string EncryptedData = Convert.ToBase64String(CipherBytes);

// 최종 결과를 리턴

return EncryptedData;

}

//2. 복호화

private static string DecryptString(string InputText, string Password)

{

RijndaelManaged RijndaelCipher = new RijndaelManaged();

byte[] EncryptedData = Convert.FromBase64String(InputText);

byte[] Salt = Encoding.ASCII.GetBytes(Password.Length.ToString());

PasswordDeriveBytes SecretKey = new PasswordDeriveBytes(Password, Salt);

// Decryptor 객체를 만듭니다.

ICryptoTransform Decryptor = RijndaelCipher.CreateDecryptor(SecretKey.GetBytes(32), SecretKey.GetBytes(16));

MemoryStream memoryStream = new MemoryStream(EncryptedData);

// 데이터 읽기(복호화이므로) 용도로 cryptoStream객체를 선언, 초기화

CryptoStream cryptoStream = new CryptoStream(memoryStream, Decryptor, CryptoStreamMode.Read);

// 복호화된 데이터를 담을 바이트 배열을 선언합니다.

// 길이는 알 수 없지만, 일단 복호화되기 전의 데이터의 길이보다는

// 길지 않을 것이기 때문에 그 길이로 선언합니다

byte[] PlainText = new byte[EncryptedData.Length];

// 복호화 시작

int DecryptedCount = cryptoStream.Read(PlainText, 0, PlainText.Length);

memoryStream.Close();

cryptoStream.Close();

// 복호화된 데이터를 문자열로 바꿉니다.

string DecryptedData = Encoding.Unicode.GetString(PlainText, 0, DecryptedCount);

// 최종 결과 리턴

return DecryptedData;

}

* 사용예

/// <summary>

/// 암호화

/// </summary>

/// <param name="sender"></param>

/// <param name="e"></param>

private void button6_Click(object sender, System.EventArgs e)

{

textBox2.Text = EncryptString(textBox1.Text, "1234");

}

/// <summary>

/// 복호화

/// </summary>

/// <param name="sender"></param>

/// <param name="e"></param>

private void button7_Click(object sender, System.EventArgs e)

{

textBox1.Text = DecryptString(textBox2.Text, "1234");

}

그럼...

Posted by 퓨전마법사
,