C# 문자열 암호화 - RSA, MD5, DES
C#/Tip :
2009. 10. 5. 10:01
const string desKey는 DES암호화에 필요한 키데이터이고 이 키 값은 임의로 정의해서 쓰시면 됩니다. 이 키값은 암호화와 복호화에 쓰이게 되므로 유출될 시에 문제가 발생할 수 있겠죠.
C#으로 작성된 소스이며, VS.NET에서는 기본적으로 암호화 함수를 지원하고 있습니다. 아래 코드는 이 암호화함수들을 사용하는 셈플이지요.
001 | using System; |
002 | using System.Security; |
003 | using System.Security.Cryptography; |
004 | using System.Text; |
005 | using System.IO; |
006 |
007 | namespace Utility |
008 | { |
009 | /// <summary> |
010 | /// Crypt에 대한 요약 설명입니다. |
011 | /// </summary> |
012 | public class Crypt |
013 | { |
014 | // 암호화 키 |
015 | private const string desKey= "......" ; |
016 |
017 | public Crypt() |
018 | { |
019 | // |
020 | // TODO: 여기에 생성자 논리를 추가합니다. |
021 | // |
022 | } |
023 |
024 | //------------------------------------------------------------------------ |
025 | #region MD5 Hash |
026 |
027 | public 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 |
043 | public static string DESEncrypt( string inStr) |
044 | { |
045 | return DesEncrypt(inStr,desKey); |
046 | } |
047 |
048 | //문자열 암호화 |
049 | private 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 |
084 | public static string DESDecrypt( string inStr) // 복호화 |
085 | { |
086 | return DesDecrypt(inStr,desKey); |
087 | } |
088 |
089 | //문자열 복호화 |
090 | private 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 | //문자열->유니코드 바이트 배열 |
127 | private static Byte[] ConvertStringToByteArray(String s) |
128 | { |
129 | return ( new UnicodeEncoding()).GetBytes(s); |
130 | } |
131 |
132 | //유니코드 바이트 배열->문자열 |
133 | private static string ConvertByteArrayToString( byte [] b) |
134 | { |
135 | return ( new UnicodeEncoding()).GetString(b, 0, b.Length); |
136 | } |
137 |
138 | //문자열->안시 바이트 배열 |
139 | private static Byte[] ConvertStringToByteArrayA(String s) |
140 | { |
141 | return ( new ASCIIEncoding()).GetBytes(s); |
142 | } |
143 |
144 | //안시 바이트 배열->문자열 |
145 | private static string ConvertByteArrayToStringA( byte [] b) |
146 | { |
147 | return ( new ASCIIEncoding()).GetString(b, 0, b.Length); |
148 | } |
149 |
150 | //문자열->Base64 바이트 배열 |
151 | private static Byte[] ConvertStringToByteArrayB(String s) |
152 | { |
153 | return Convert.FromBase64String(s); |
154 | } |
155 |
156 | //Base64 바이트 배열->문자열 |
157 | private static string ConvertByteArrayToStringB( byte [] b) |
158 | { |
159 | return Convert.ToBase64String(b); |
160 | } |
161 |
162 | #endregion //DES암복호화 |
163 |
164 | //------------------------------------------------------------------------ |
165 | #region RSA암복호화 |
166 | //RSA 암호화 |
167 | public 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 복호화 |
186 | public 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 | } |
'C# > Tip' 카테고리의 다른 글
C# CMD창 안띄우고 명령어 주고 받기 (0) | 2009.10.24 |
---|---|
C# ToArray(type) 메서드에서 강력하게 형식화된 배열 반환 (0) | 2009.10.05 |
C# 소켓통신의 개요 (1) | 2009.10.01 |
C# RichTextBox 단어별 글자색 지정하기 (0) | 2009.09.22 |
C# 윈폼 슬라이드메뉴 만들기 (0) | 2009.09.19 |