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

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
}
}