You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
249 lines
7.8 KiB
249 lines
7.8 KiB
using System;
|
|
using System.Collections.Generic;
|
|
using System.Text;
|
|
using System.Security.Cryptography;
|
|
using System.IO;
|
|
using System.Xml;
|
|
|
|
namespace OT.Web.Ap_Code
|
|
{
|
|
/// <summary>
|
|
/// 安全處理通用類
|
|
/// </summary>
|
|
public class SecurityUtil
|
|
{
|
|
#region Des
|
|
|
|
//加密範例
|
|
public static string DESEncrypt(string data, string strKey, string strIV)
|
|
{
|
|
|
|
//將key轉成utf8編碼 byte array
|
|
byte[] tmpkey = System.Text.Encoding.UTF8.GetBytes(strKey);
|
|
|
|
//將iv轉成utf8編碼 byte ayyay
|
|
byte[] tmpIV = System.Text.Encoding.UTF8.GetBytes(strIV);
|
|
|
|
MD5CryptoServiceProvider mD5Provider = new MD5CryptoServiceProvider();
|
|
byte[] key = mD5Provider.ComputeHash(tmpkey);
|
|
byte[] iv = mD5Provider.ComputeHash(tmpIV);
|
|
|
|
|
|
//將data轉成utf8編碼 byte ayyay
|
|
byte[] byteData = Encoding.UTF8.GetBytes(data);
|
|
|
|
|
|
//加密
|
|
RijndaelManaged aesProvider = new RijndaelManaged();
|
|
ICryptoTransform aesEncrypt = aesProvider.CreateEncryptor(key, iv);
|
|
byte[] result = aesEncrypt.TransformFinalBlock(byteData, 0, byteData.Length);
|
|
|
|
|
|
//轉成base64字串
|
|
return Convert.ToBase64String(result);
|
|
}
|
|
|
|
//解密範例
|
|
|
|
public static string DESDecrypt(string data, string strKey, string strIV)
|
|
{
|
|
|
|
//將key轉成utf8編碼 byte array
|
|
byte[] tmpkey = System.Text.Encoding.UTF8.GetBytes(strKey);
|
|
|
|
//將iv轉成utf8編碼 byte array
|
|
byte[] tmpIV = System.Text.Encoding.UTF8.GetBytes(strIV);
|
|
|
|
MD5CryptoServiceProvider mD5Provider = new MD5CryptoServiceProvider();
|
|
byte[] key = mD5Provider.ComputeHash(tmpkey);
|
|
byte[] iv = mD5Provider.ComputeHash(tmpIV);
|
|
|
|
|
|
//將base64字串轉成byte array
|
|
byte[] encryptData = Convert.FromBase64String(data);
|
|
|
|
|
|
//解密
|
|
RijndaelManaged aesProvider = new RijndaelManaged();
|
|
ICryptoTransform aesDecrypt = aesProvider.CreateDecryptor(key, iv);
|
|
byte[] result = aesDecrypt.TransformFinalBlock(encryptData, 0, encryptData.Length);
|
|
|
|
|
|
//將解密後的內容還原成utf8編碼的字串
|
|
|
|
return Encoding.UTF8.GetString(result);
|
|
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region md5
|
|
/// <summary>
|
|
/// 字符串MD5加密
|
|
/// </summary>
|
|
/// <param name="strData">明文</param>
|
|
/// <returns>密文</returns>
|
|
public static string MD5(string strData, string strLen)
|
|
{
|
|
if (strLen == "16")
|
|
{
|
|
MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider();
|
|
string text16 = BitConverter.ToString(md5.ComputeHash(UTF8Encoding.Default.GetBytes(strData)), 4, 8);
|
|
text16 = text16.Replace("-", "");
|
|
return text16;
|
|
}
|
|
|
|
byte[] bytes = Encoding.Default.GetBytes(strData);
|
|
bytes = new MD5CryptoServiceProvider().ComputeHash(bytes);
|
|
string text = "";
|
|
for (int i = 0; i < bytes.Length; i++)
|
|
{
|
|
text = text + bytes[i].ToString("x").PadLeft(2, '0');
|
|
}
|
|
return text;
|
|
}
|
|
#endregion
|
|
|
|
#region Shr256
|
|
|
|
public static string SHA256(string str)
|
|
{
|
|
byte[] bytes = Encoding.UTF8.GetBytes(str);
|
|
SHA256Managed managed = new SHA256Managed();
|
|
return Convert.ToBase64String(managed.ComputeHash(bytes));
|
|
}
|
|
#endregion
|
|
|
|
#region Aes
|
|
|
|
/// <summary>
|
|
/// AES 加密
|
|
/// </summary>
|
|
/// <param name="Data">明碼字符串</param>
|
|
/// <param name="Key">密匙</param>
|
|
/// <param name="IV">初始化向量</param>
|
|
/// <returns>加密字符串</returns>
|
|
public static string AESEncrypt(string Data, string strKey, string strIV)
|
|
{
|
|
try
|
|
{
|
|
byte[] _data = Encoding.UTF8.GetBytes(Data);
|
|
byte[] Key = Encoding.UTF8.GetBytes(strKey);
|
|
byte[] tmpIV = Encoding.UTF8.GetBytes(strIV);
|
|
Rijndael RijndaelAlg = Rijndael.Create();
|
|
MemoryStream memory = new MemoryStream();
|
|
CryptoStream cStream = new CryptoStream(memory,
|
|
RijndaelAlg.CreateEncryptor(Key, tmpIV),
|
|
CryptoStreamMode.Write);
|
|
try
|
|
{
|
|
cStream.Write(_data, 0, _data.Length);
|
|
cStream.FlushFinalBlock();
|
|
return Convert.ToBase64String(memory.ToArray());
|
|
}
|
|
catch (Exception e)
|
|
{
|
|
throw e;
|
|
}
|
|
finally
|
|
{
|
|
memory.Close();
|
|
cStream.Close();
|
|
}
|
|
}
|
|
catch (CryptographicException e)
|
|
{
|
|
throw e;
|
|
}
|
|
catch (UnauthorizedAccessException e)
|
|
{
|
|
throw e;
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// AES 解密
|
|
/// </summary>
|
|
/// <param name="Data">密文</param>
|
|
/// <param name="Key">密匙</param>
|
|
/// <param name="IV">初始化向量</param>
|
|
/// <returns>明文</returns>
|
|
public static string AESDecrypt(string Data, string strKey, string strIV)
|
|
{
|
|
try
|
|
{
|
|
byte[] _data = Encoding.UTF8.GetBytes(Data);
|
|
byte[] Key = Encoding.UTF8.GetBytes(strKey);
|
|
byte[] tmpIV = Encoding.UTF8.GetBytes(strIV);
|
|
Rijndael RijndaelAlg = Rijndael.Create();
|
|
MemoryStream memory = new MemoryStream(_data);
|
|
CryptoStream cStream = new CryptoStream(memory,
|
|
RijndaelAlg.CreateDecryptor(Key, tmpIV),
|
|
CryptoStreamMode.Read);
|
|
string val = null;
|
|
try
|
|
{
|
|
// 明文存储区
|
|
using (MemoryStream originalMemory = new MemoryStream())
|
|
{
|
|
Byte[] Buffer = new Byte[1024];
|
|
Int32 readBytes = 0;
|
|
while ((readBytes = cStream.Read(Buffer, 0, Buffer.Length)) > 0)
|
|
{
|
|
originalMemory.Write(Buffer, 0, readBytes);
|
|
}
|
|
|
|
val = Encoding.UTF8.GetString(originalMemory.ToArray());
|
|
}
|
|
}
|
|
catch (Exception e)
|
|
{
|
|
throw e;
|
|
}
|
|
finally
|
|
{
|
|
cStream.Close();
|
|
}
|
|
|
|
return val;
|
|
}
|
|
catch (CryptographicException e)
|
|
{
|
|
throw e;
|
|
}
|
|
catch (UnauthorizedAccessException e)
|
|
{
|
|
throw e;
|
|
}
|
|
}
|
|
#endregion
|
|
|
|
|
|
|
|
|
|
|
|
#region 亂數取值
|
|
|
|
//Validate Code
|
|
public static string GetRandomString(int Stringleng )
|
|
{
|
|
|
|
int k =0;
|
|
string[] RandomSourceCodeList ={ "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M",
|
|
"N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z",
|
|
"0", "1", "2", "3", "4", "5", "6", "7", "8", "9" };
|
|
|
|
string strRd = string.Empty;
|
|
Random rd = new Random(unchecked((int)DateTime.Now.Ticks));
|
|
|
|
for ( k = 0; k < Stringleng; k++) // 亂數產生驗證文字
|
|
{
|
|
strRd += RandomSourceCodeList[rd.Next(35)];
|
|
}
|
|
|
|
return strRd;
|
|
}
|
|
|
|
#endregion
|
|
}
|
|
}
|