달력

52024  이전 다음

  • 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

서버와 클라이언트간의 데이터 전송을 하다보면 여러가지 일이 생긴다.

그중 보안적인 문제가 있는데 이를 위해 암호화를 시도!!

그 과정에서 만든 소스를 올려본다.


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);




Posted by SadDev
|