서버와 클라이언트간의 데이터 전송을 하다보면 여러가지 일이 생긴다.
그중 보안적인 문제가 있는데 이를 위해 암호화를 시도!!
그 과정에서 만든 소스를 올려본다.
using System;
using System.IO;
using System.Security.Cryptography;
namespace DataCrypt
{
public class Crypt
{
//Rijndael 암호화
private RijndaelManaged rmCrypt;
private byte[] KEY;
private byte[] IV;
public Crypt()
{
rmCrypt = new RijndaelManaged();
}
/// <summary>
/// 암호화 키
/// </summary>
public byte[] Key
{
get { return KEY; }
}
/// <summary>
/// 암호화 벡터 값
/// </summary>
public byte[] Iv
{
get { return IV; }
}
/// <summary>
/// 버퍼 데이터를 암호화
/// </summary>
/// <param name="buffer">암호화할 데이터</param>
/// <returns></returns>
public byte[] Encrypt(byte[] buffer)
{
rmCrypt.GenerateKey();
rmCrypt.GenerateIV();
KEY = rmCrypt.Key;
IV = rmCrypt.IV;
return EncryptBytes(buffer);
}
/// <summary>
/// 버퍼 데이터를 복호화
/// </summary>
/// <param name="buffer">복호화 할 데이터</param>
/// <param name="key">암호화 키</param>
/// <param name="iv">암호화 벡터 값</param>
/// <returns></returns>
public byte[] Decrypt(byte[] buffer, byte[] key, byte[] iv)
{
rmCrypt.Key = key;
rmCrypt.IV = iv;
return DecryptBytes(buffer);
}
/// <summary>
/// 암호화 함수
/// </summary>
/// <param name="data">암호화 할 데이터</param>
/// <returns></returns>
private byte[] EncryptBytes(byte[] data)
{
if (data == null || data.Length == 0)
{
return data;
}
if (rmCrypt == null)
{
throw new ArgumentNullException("rmCrypt");
}
using (MemoryStream stream = new MemoryStream())
using (ICryptoTransform encryptor = rmCrypt.CreateEncryptor())
using (CryptoStream cryptStream = new CryptoStream(stream, encryptor, CryptoStreamMode.Write))
{
cryptStream.Write(data, 0, data.Length);
cryptStream.FlushFinalBlock();
return stream.ToArray();
}
}
/// <summary>
/// 복호화 함수
/// </summary>
/// <param name="data">복호화 할 데이터</param>
/// <returns></returns>
private byte[] DecryptBytes(byte[] data)
{
if (data == null || data.Length == 0)
{
return data;
}
if (rmCrypt == null)
{
throw new ArgumentNullException("rmCrypt");
}
using (MemoryStream stream = new MemoryStream())
using (ICryptoTransform decryptor = rmCrypt.CreateDecryptor())
using (CryptoStream cryptStream = new CryptoStream(stream, decryptor, CryptoStreamMode.Write))
{
cryptStream.Write(data, 0, data.Length);
cryptStream.FlushFinalBlock();
return stream.ToArray();
}
}
}
}
사용법은 간단하게
Crypt crypt = new Crypt();
byte[] buffer = crypt.Encrypt(tmpBuffer);
식으로 하면 암호화 된 데이터가 넘어온다..
복호화의 경우는 key와 iv가 필요하다.
byte[] buffer = crypt.Decrypt(tmpBuffer, key, iv);