const string desKey는 DES암호화에 필요한 키데이터이고 이 키 값은 임의로 정의해서 쓰시면 됩니다. 이 키값은 암호화와 복호화에 쓰이게 되므로 유출될 시에 문제가 발생할 수 있겠죠.

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

001using System;
002using System.Security;
003using System.Security.Cryptography;
004using System.Text;
005using System.IO;
006 
007namespace Utility
008{
009/// <summary>
010/// Crypt에 대한 요약 설명입니다.
011/// </summary>
012public class Crypt
013{
014// 암호화 키
015private const string desKey="......";
016 
017public Crypt()
018{
019  //
020  // TODO: 여기에 생성자 논리를 추가합니다.
021  //
022}
023 
024//------------------------------------------------------------------------
025#region MD5 Hash
026 
027public static string MD5HashCrypt(string val)
028{
029  byte[] data = Convert.FromBase64String(val);
030  // This is one implementation of the abstract class MD5.
031  MD5 md5 = new MD5CryptoServiceProvider();
032  byte[] result = md5.ComputeHash(data);
033 
034  return Convert.ToBase64String(result);
035}
036 
037#endregion //MD5 Hash
038 
039//------------------------------------------------------------------------
040#region DES암복호화
041 
042// Public Function
043public static string DESEncrypt(string inStr)
044{  
045  return DesEncrypt(inStr,desKey);
046}
047 
048//문자열 암호화
049private static string DesEncrypt(string str,string key)
050{
051  //키 유효성 검사
052  byte[] btKey = ConvertStringToByteArrayA(key);
053 
054  //키가 8Byte가 아니면 예외발생
055  if(btKey.Length!=8)
056  {
057   throw (new Exception("Invalid key. Key length must be 8 byte."));
058  }
059 
060  //소스 문자열
061  byte[] btSrc = ConvertStringToByteArray(str);
062  DESCryptoServiceProvider des = new DESCryptoServiceProvider();
063            
064  des.Key = btKey;
065  des.IV = btKey;
066 
067  ICryptoTransform desencrypt = des.CreateEncryptor();
068 
069  MemoryStream ms = new MemoryStream();
070 
071  CryptoStream cs = new CryptoStream(ms, desencrypt,
072   CryptoStreamMode.Write);
073 
074  cs.Write(btSrc, 0, btSrc.Length);
075  cs.FlushFinalBlock();
076 
077 
078  byte[] btEncData = ms.ToArray();
079 
080  return (ConvertByteArrayToStringB(btEncData));       
081}//end of func DesEncrypt
082 
083// Public Function
084public static string DESDecrypt(string inStr) // 복호화
085{
086  return DesDecrypt(inStr,desKey);
087}
088 
089//문자열 복호화
090private static string DesDecrypt(string str,string key)
091{
092  //키 유효성 검사
093  byte[] btKey = ConvertStringToByteArrayA(key);
094 
095  //키가 8Byte가 아니면 예외발생
096  if(btKey.Length!=8)
097  {
098   throw (new Exception("Invalid key. Key length must be 8 byte."));
099  }
100 
101 
102  byte[] btEncData = ConvertStringToByteArrayB(str);
103  DESCryptoServiceProvider des = new DESCryptoServiceProvider();
104            
105  des.Key = btKey;
106  des.IV = btKey;
107 
108  ICryptoTransform desdecrypt = des.CreateDecryptor();
109 
110  MemoryStream ms = new MemoryStream();
111 
112  CryptoStream cs = new CryptoStream(ms, desdecrypt,
113   CryptoStreamMode.Write);
114 
115  cs.Write(btEncData, 0, btEncData.Length);
116 
117  cs.FlushFinalBlock();
118 
119  byte[] btSrc = ms.ToArray();
120 
121 
122  return (ConvertByteArrayToString(btSrc));
123   
124}//end of func DesDecrypt
125 
126//문자열->유니코드 바이트 배열
127private static Byte[] ConvertStringToByteArray(String s)
128{
129  return (new UnicodeEncoding()).GetBytes(s);
130}
131 
132//유니코드 바이트 배열->문자열
133private static string ConvertByteArrayToString(byte[] b)
134{
135  return (new UnicodeEncoding()).GetString(b, 0, b.Length);
136}
137 
138//문자열->안시 바이트 배열
139private static Byte[] ConvertStringToByteArrayA(String s)
140{
141  return (new ASCIIEncoding()).GetBytes(s);
142}
143 
144//안시 바이트 배열->문자열
145private static string ConvertByteArrayToStringA(byte[] b)
146{
147  return (new ASCIIEncoding()).GetString(b, 0, b.Length);
148}
149 
150//문자열->Base64 바이트 배열
151private static Byte[] ConvertStringToByteArrayB(String s)
152{
153  return Convert.FromBase64String(s);
154}
155 
156//Base64 바이트 배열->문자열
157private static string ConvertByteArrayToStringB(byte[] b)
158{
159  return Convert.ToBase64String(b);
160}
161 
162#endregion //DES암복호화
163 
164//------------------------------------------------------------------------
165#region RSA암복호화
166//RSA 암호화
167public static string RSAEncrypt(string sValue,string sPubKey)
168{
169  //공개키 생성
170  byte [] keybuf = Convert.FromBase64String(sPubKey);
171  sPubKey =  (new UTF8Encoding()).GetString(keybuf);
172  System.Security.Cryptography.RSACryptoServiceProvider oEnc = new RSACryptoServiceProvider(); //암호화
173 
174 
175  oEnc.FromXmlString(sPubKey);
176 
177  //암호화할 문자열을 UFT8인코딩
178  byte [] inbuf = (new UTF8Encoding()).GetBytes(sValue);
179  //암호화
180  byte [] encbuf = oEnc.Encrypt(inbuf, false);
181   
182  //암호화된 문자열 Base64인코딩
183  return Convert.ToBase64String(encbuf);
184}
185//RSA 복호화
186public static string RSADecrypt(string sValue,string sPrvKey)
187{
188  //개인키 생성
189  byte [] inbuf = Convert.FromBase64String(sPrvKey);
190  sPrvKey =  (new UTF8Encoding()).GetString(inbuf);
191 
192  //RSA객체생성
193  System.Security.Cryptography.RSACryptoServiceProvider oDec = new RSACryptoServiceProvider(); //복호화
194  //개인키로 활성화
195  oDec.FromXmlString(sPrvKey);
196 
197  //sValue문자열을 바이트배열로 변환
198  byte [] srcbuf = Convert.FromBase64String(sValue);
199 
200  //바이트배열 복호화
201  byte [] decbuf = oDec.Decrypt(srcbuf, false);
202 
203  //복호화 바이트배열을 문자열로 변환
204  string sDec = (new UTF8Encoding()).GetString(decbuf,0,decbuf.Length);
205  return sDec;
206}
207 
208#endregion
209 
210}
211}

출처 : http://choiwonwoo.egloos.com/669096

Posted by 아르다