C# 문자열 암호화 - RSA, MD5, DES
C#/Tip :
2009. 10. 5. 10:01
const string desKey는 DES암호화에 필요한 키데이터이고 이 키 값은 임의로 정의해서 쓰시면 됩니다. 이 키값은 암호화와 복호화에 쓰이게 되므로 유출될 시에 문제가 발생할 수 있겠죠.
C#으로 작성된 소스이며, VS.NET에서는 기본적으로 암호화 함수를 지원하고 있습니다. 아래 코드는 이 암호화함수들을 사용하는 셈플이지요.
using System; using System.Security; using System.Security.Cryptography; using System.Text; using System.IO; namespace Utility { ////// Crypt에 대한 요약 설명입니다. /// 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 } }
'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 |