티스토리 뷰
매번 코드를 추가하는게 귀찮아서 dll파일로 만들어서 Github에 올려둔다.
Github : github.com/vip00112/Cryptor
[전체 코드]
1. Hash (MD5, SHA256/384/512)
using System;
using System.Text;
namespace Cryptor
{
public class Hash
{
public enum HashType { MD5, SHA256, SHA384, SHA512 }
/// <summary>
/// MD5 암호화
/// </summary>
/// <param name="text">암호화 할 평문</param>
/// <param name="encoding">System.Text.Encoding</param>
/// <returns>지정된 인코딩으로 암호화한 문자열</returns>
public static string EncryptMD5(string text, Encoding encoding)
{
var md5 = System.Security.Cryptography.MD5.Create();
byte[] data = md5.ComputeHash(encoding.GetBytes(text));
var sb = new StringBuilder();
foreach (byte b in data)
{
sb.Append(b.ToString("x2"));
}
return sb.ToString();
}
/// <summary>
/// SHA256 암호화
/// </summary>
/// <param name="text">암호화 할 평문</param>
/// <param name="encoding">System.Text.Encoding</param>
/// <returns>지정된 인코딩으로 암호화한 문자열</returns>
public static string EncryptSHA256(string text, Encoding encoding)
{
var sha = new System.Security.Cryptography.SHA256Managed();
byte[] data = sha.ComputeHash(encoding.GetBytes(text));
var sb = new StringBuilder();
foreach (byte b in data)
{
sb.Append(b.ToString("x2"));
}
return sb.ToString();
}
/// <summary>
/// SHA384 암호화
/// </summary>
/// <param name="text">암호화 할 평문</param>
/// <param name="encoding">System.Text.Encoding</param>
/// <returns>지정된 인코딩으로 암호화한 문자열</returns>
public static string EncryptSHA384(string text, Encoding encoding)
{
var sha = new System.Security.Cryptography.SHA384Managed();
byte[] data = sha.ComputeHash(encoding.GetBytes(text));
var sb = new StringBuilder();
foreach (byte b in data)
{
sb.Append(b.ToString("x2"));
}
return sb.ToString();
}
/// <summary>
/// SHA512 암호화
/// </summary>
/// <param name="text">암호화 할 평문</param>
/// <param name="encoding">System.Text.Encoding</param>
/// <returns>지정된 인코딩으로 암호화한 문자열</returns>
public static string EncryptSHA512(string text, Encoding encoding)
{
var sha = new System.Security.Cryptography.SHA512Managed();
byte[] data = sha.ComputeHash(encoding.GetBytes(text));
var sb = new StringBuilder();
foreach (byte b in data)
{
sb.Append(b.ToString("x2"));
}
return sb.ToString();
}
/// <summary>
/// 평문화 Hash 암호화 문자열 비교
/// </summary>
/// <param name="text">평문</param>
/// <param name="oldHash">Hash 암호화 문자열</param>
/// <param name="type">MD5, SHA256, SHA384, SHA512</param>
/// <param name="encoding">System.Text.Encoding</param>
/// <returns>평문을 지정된 인코딩으로 암호화한 후 비교 결과 True/False</returns>
public static bool IsSameHash(string text, string oldHash, HashType type, Encoding encoding)
{
string newHash = null;
switch (type)
{
case HashType.MD5:
newHash = EncryptMD5(text, encoding);
break;
case HashType.SHA256:
newHash = EncryptSHA256(text, encoding);
break;
case HashType.SHA384:
newHash = EncryptSHA384(text, encoding);
break;
case HashType.SHA512:
newHash = EncryptSHA512(text, encoding);
break;
default:
return false;
}
var comparer = StringComparer.OrdinalIgnoreCase;
return comparer.Compare(newHash, oldHash) == 0;
}
}
}
2. AES
using System;
using System.Security.Cryptography;
using System.Text;
using System.IO;
namespace Cryptor
{
public class AES
{
/// <summary>
/// AES256 암호화
/// </summary>
/// <param name="text">평문</param>
/// <param name="key">암호화할 키 값</param>
/// <param name="encoding">System.Text.Encoding</param>
/// <returns>지정된 인코딩으로 암호화한 문자열</returns>
public static string Encrypt(string text, string key, Encoding encoding)
{
try
{
byte[] textData = encoding.GetBytes(text);
byte[] salt = Encoding.ASCII.GetBytes(key.Length.ToString());
var secretKey = new PasswordDeriveBytes(key, salt);
var aes = new RijndaelManaged();
ICryptoTransform encryptor = aes.CreateEncryptor(secretKey.GetBytes(32), secretKey.GetBytes(16));
using (var ms = new MemoryStream())
using (var cs = new CryptoStream(ms, encryptor, CryptoStreamMode.Write))
{
cs.Write(textData, 0, textData.Length);
cs.FlushFinalBlock();
return Convert.ToBase64String(ms.ToArray());
}
}
catch (Exception e)
{
return "Encrypt error : " + e.Message;
}
}
/// <summary>
/// AES256 복호화
/// </summary>
/// <param name="encryptText">암호화된 문자열</param>
/// <param name="key">복호화할 키 값</param>
/// <param name="encoding">System.Text.Encoding</param>
/// <returns>지정된 인코딩으로 복호화한 문자열</returns>
public static string Decrypt(string encryptText, string key, Encoding encoding)
{
try
{
byte[] encryptData = Convert.FromBase64String(encryptText);
byte[] salt = Encoding.ASCII.GetBytes(key.Length.ToString());
var secretKey = new PasswordDeriveBytes(key, salt);
var aes = new RijndaelManaged();
ICryptoTransform decryptor = aes.CreateDecryptor(secretKey.GetBytes(32), secretKey.GetBytes(16));
using (var ms = new MemoryStream())
using (var cs = new CryptoStream(ms, decryptor, CryptoStreamMode.Write))
{
byte[] result = new byte[encryptData.Length];
int decryptedCount = cs.Read(result, 0, result.Length);
return encoding.GetString(result, 0, decryptedCount);
}
}
catch (Exception e)
{
return "Decrypt error : " + e.Message;
}
}
}
}
[사용 방법]
1. Hash 암호화 및 비교
// MD5
string text = "Plan text for hash test.";
string hash = Hash.EncryptMD5(text, Encoding.Unicode);
bool isSame = Hash.IsSameHash(text, hash, Hash.HashType.MD5, Encoding.Unicode);
Console.WriteLine(isSame); // Output : true
// SHA256
string text = "Plan text for hash test.";
string hash = Hash.EncryptSHA256(text, Encoding.Unicode);
bool isSame = Hash.IsSameHash(text, hash, Hash.HashType.SHA256, Encoding.Unicode);
Console.WriteLine(isSame); // Output : true
// SHA256
string text = "Plan text for hash test.";
string hash = Hash.EncryptSHA384(text, Encoding.Unicode);
bool isSame = Hash.IsSameHash(text, hash, Hash.HashType.SHA384, Encoding.Unicode);
Console.WriteLine(isSame); // Output : true
// SHA256
string text = "Plan text for hash test.";
string hash = Hash.EncryptSHA512(text, Encoding.Unicode);
bool isSame = Hash.IsSameHash(text, hash, Hash.HashType.SHA512, Encoding.Unicode);
Console.WriteLine(isSame); // Output : true
2. AES 암/복호화
// AES
string text = "Plan text for aes test.";
string key = "Key for aes test.";
string encrypted = AES.Encrypt(text, key, Encoding.Unicode);
Console.WriteLine(encrypted);
string decrypted = AES.Decrypt(encrypted, key, Encoding.Unicode);
Console.WriteLine(decrypted);
bool isSame = text == decrypted;
Console.WriteLine(isSame); // Output : true
'C#' 카테고리의 다른 글
C#: A* (AStar) 길찾기 알고리즘 (2018.04.08 업데이트) (16) | 2017.04.17 |
---|---|
C#: PNG파일을 이용한 LayerdForm(투명 폼) 생성 DLL (0) | 2016.12.17 |
C#: ListView Colum 정렬 DLL (5) | 2016.10.06 |
C#: out과 ref의 인자 전달방식 차이점 (0) | 2016.10.06 |
C#: dll을 포함한 단일 exe배포 방법 (4) | 2016.10.06 |
댓글
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday