반응형

http://choiwonwoo.egloos.com/669096

옜날 C#할때 모 책에서 본거 같은데 흠...올라와잇길래 펌

C#으로 작성된 소스이며, VS.NET에서는 기본적으로 암호화 함수를 지원하고 있습니다. 아래 코드는 이 암호화함수들을 사용하는 셈플이지요.

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

namespace Utility
{
/// <summary>
/// Crypt에 대한 요약 설명입니다.
/// </summary>
public class Crypt
{
// 암호화 키
private const string desKey="......";

public Crypt()
{
  //
  // TODO: 여기에 생성자 논리를 추가합니다.
  //
}

//------------------------------------------------------------------------
#region MD5 Hash

public static string MD5HashCrypt(string val)
{
  byte[] data = Convert.FromBase64String(val);
  // This is one implementation of the abstract class MD5.
  MD5 md5 = new MD5CryptoServiceProvider();
  byte[] result = md5.ComputeHash(data);

  return Convert.ToBase64String(result);
}

#endregion //MD5 Hash

//------------------------------------------------------------------------
#region DES암복호화

// Public Function
public static string DESEncrypt(string inStr)
{  
  return DesEncrypt(inStr,desKey);
}

//문자열 암호화
private static string DesEncrypt(string str,string key)
{
  //키 유효성 검사
  byte[] btKey = ConvertStringToByteArrayA(key);

  //키가 8Byte가 아니면 예외발생
  if(btKey.Length!=8)
  {
   throw (new Exception("Invalid key. Key length must be 8 byte."));
  }

  //소스 문자열
  byte[] btSrc = ConvertStringToByteArray(str);
  DESCryptoServiceProvider des = new DESCryptoServiceProvider();
          
  des.Key = btKey;
  des.IV = btKey;

  ICryptoTransform desencrypt = des.CreateEncryptor();

  MemoryStream ms = new MemoryStream();

  CryptoStream cs = new CryptoStream(ms, desencrypt,
   CryptoStreamMode.Write);

  cs.Write(btSrc, 0, btSrc.Length);
  cs.FlushFinalBlock();


  byte[] btEncData = ms.ToArray();

  return (ConvertByteArrayToStringB(btEncData));        
}//end of func DesEncrypt

// Public Function
public static string DESDecrypt(string inStr) // 복호화
{
  return DesDecrypt(inStr,desKey);
}

//문자열 복호화
private static string DesDecrypt(string str,string key)
{
  //키 유효성 검사
  byte[] btKey = ConvertStringToByteArrayA(key);

  //키가 8Byte가 아니면 예외발생
  if(btKey.Length!=8)
  {
   throw (new Exception("Invalid key. Key length must be 8 byte."));
  }


  byte[] btEncData = ConvertStringToByteArrayB(str);
  DESCryptoServiceProvider des = new DESCryptoServiceProvider();
          
  des.Key = btKey;
  des.IV = btKey;

  ICryptoTransform desdecrypt = des.CreateDecryptor();

  MemoryStream ms = new MemoryStream();

  CryptoStream cs = new CryptoStream(ms, desdecrypt,
   CryptoStreamMode.Write);

  cs.Write(btEncData, 0, btEncData.Length);

  cs.FlushFinalBlock();

  byte[] btSrc = ms.ToArray();


  return (ConvertByteArrayToString(btSrc));
  
}//end of func DesDecrypt

//문자열->유니코드 바이트 배열
private static Byte[] ConvertStringToByteArray(String s)
{
  return (new UnicodeEncoding()).GetBytes(s);
}

//유니코드 바이트 배열->문자열
private static string ConvertByteArrayToString(byte[] b)
{
  return (new UnicodeEncoding()).GetString(b, 0, b.Length);
}

//문자열->안시 바이트 배열
private static Byte[] ConvertStringToByteArrayA(String s)
{
  return (new ASCIIEncoding()).GetBytes(s);
}

//안시 바이트 배열->문자열
private static string ConvertByteArrayToStringA(byte[] b)
{
  return (new ASCIIEncoding()).GetString(b, 0, b.Length);
}

//문자열->Base64 바이트 배열
private static Byte[] ConvertStringToByteArrayB(String s)
{
  return Convert.FromBase64String(s);
}

//Base64 바이트 배열->문자열
private static string ConvertByteArrayToStringB(byte[] b)
{
  return Convert.ToBase64String(b);
}

#endregion //DES암복호화

//------------------------------------------------------------------------
#region RSA암복호화
//RSA 암호화
public static string RSAEncrypt(string sValue,string sPubKey)
{
  //공개키 생성
  byte [] keybuf = Convert.FromBase64String(sPubKey);
  sPubKey =  (new UTF8Encoding()).GetString(keybuf);
  System.Security.Cryptography.RSACryptoServiceProvider oEnc = new RSACryptoServiceProvider(); //암호화


  oEnc.FromXmlString(sPubKey);

  //암호화할 문자열을 UFT8인코딩
  byte [] inbuf = (new UTF8Encoding()).GetBytes(sValue);
  //암호화
  byte [] encbuf = oEnc.Encrypt(inbuf, false);
  
  //암호화된 문자열 Base64인코딩
  return Convert.ToBase64String(encbuf);
}
//RSA 복호화
public static string RSADecrypt(string sValue,string sPrvKey)
{
  //개인키 생성
  byte [] inbuf = Convert.FromBase64String(sPrvKey);
  sPrvKey =  (new UTF8Encoding()).GetString(inbuf);

  //RSA객체생성
  System.Security.Cryptography.RSACryptoServiceProvider oDec = new RSACryptoServiceProvider(); //복호화
  //개인키로 활성화
  oDec.FromXmlString(sPrvKey);

  //sValue문자열을 바이트배열로 변환
  byte [] srcbuf = Convert.FromBase64String(sValue);

  //바이트배열 복호화
  byte [] decbuf = oDec.Decrypt(srcbuf, false);

  //복호화 바이트배열을 문자열로 변환
  string sDec = (new UTF8Encoding()).GetString(decbuf,0,decbuf.Length);
  return sDec;
}

#endregion

}
}

반응형

'.NET > VS.NET' 카테고리의 다른 글

MVC5 Database.Open 사용법  (0) 2019.07.15
IIS MVC4 활성화  (0) 2019.07.15
[VC++] Othello 소스  (0) 2010.10.21
C# Error Collections [C#관련 팁들]  (0) 2010.10.21
C# 에서 RichTextBox의 MaxLength  (0) 2010.10.21
반응형

2147483647

즉 21억

2.1기가..바이트

반면에

TextBox는 32767

32 킬로 바이트정도...
반응형

'.NET > VS.NET' 카테고리의 다른 글

MVC5 Database.Open 사용법  (0) 2019.07.15
IIS MVC4 활성화  (0) 2019.07.15
[C#] 문자열 암호화 - RSA, MD5, DES  (0) 2010.10.21
[VC++] Othello 소스  (0) 2010.10.21
C# Error Collections [C#관련 팁들]  (0) 2010.10.21

+ Recent posts