using System;
using System.IO;
using System.Text;
using System.Security.Cryptography;
using System.Text.RegularExpressions;
using System.Linq;
namespace MadRunFabric.Common
{
///
/// 安装帮助类
///
public static class SecureHelper
{
private static Encoding _encoding { get => Encoding.UTF8; }
private static string BsToStr(byte[] bs) => string.Join(string.Empty, bs.Select(x => x.ToString("x2"))).Replace("-", string.Empty);
///
/// 获取MD5
///
///
///
public static string GetMD5(string str)
{
using (var md5 = new MD5CryptoServiceProvider())
{
var bs = _encoding.GetBytes(str);
bs = md5.ComputeHash(bs);
return BsToStr(bs);
}
}
///
/// 获取md5
///
///
///
public static string GetMD5(byte[] _bs)
{
using (var md5 = new MD5CryptoServiceProvider())
{
var bs = md5.ComputeHash(_bs);
return BsToStr(bs);
}
}
///
/// 读取文件MD5
///
///
///
public static string GetFileMD5(string fileName)
{
using (var file = new FileStream(fileName, FileMode.Open))
{
using (var md5 = new MD5CryptoServiceProvider())
{
var bs = md5.ComputeHash(file);
return BsToStr(bs);
}
}
}
///
/// 获取sha1
///
///
///
public static string GetSHA1(string str)
{
using (var sha1 = new SHA1CryptoServiceProvider())
{
var bs = _encoding.GetBytes(str);
bs = sha1.ComputeHash(bs);
return BsToStr(bs);
}
}
///
/// SHA256函数
///
/// /// 原始字符串
/// SHA256结果
public static string GetSHA256(string str)
{
using (var Sha256 = new SHA256CryptoServiceProvider())
{
var bs = _encoding.GetBytes(str);
bs = Sha256.ComputeHash(bs);
return BsToStr(bs);
}
}
///
/// 获取hmac md5
///
///
///
///
public static string GetHMACMD5(string str, string password)
{
using (var hmac_md5 = new HMACMD5())
{
hmac_md5.Key = _encoding.GetBytes(password);
var bs = hmac_md5.ComputeHash(_encoding.GetBytes(str));
return BsToStr(bs);
}
}
///
/// 已测试
///
///
///
///
public static string GetHMACSHA256(string str, string key)
{
using (var hmac_sha256 = new HMACSHA256(_encoding.GetBytes(key)))
{
var data = hmac_sha256.ComputeHash(_encoding.GetBytes(str));
return BitConverter.ToString(data);
}
}
///
/// 获取hmac sha1
///
///
///
///
public static string GetHMACSHA1(string str, string password)
{
using (var hmac_sha1 = new HMACSHA1())
{
hmac_sha1.Key = _encoding.GetBytes(password);
var bs = hmac_sha1.ComputeHash(_encoding.GetBytes(str));
return BsToStr(bs);
}
}
#region DES加密解密
private static readonly string txtKey = "PatrickpanP=";
private static readonly string txtIV = "LiuJineagel=";
public static string DESEncrypt(string Text, string key) => DESEncrypt(Text, key, key);
public static string DESDecrypt(string Text, string key) => DESDecrypt(Text, key, key);
///
/// 加密数据
///
public static string DESEncrypt(string Text, string txtKey, string txtIV)
{
using (var des = new DESCryptoServiceProvider())
{
byte[] inputByteArray;
inputByteArray = _encoding.GetBytes(Text);
//des.Key = ASCIIEncoding.ASCII.GetBytes(System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(sKey, "md5").Substring(0, 8));
//des.IV = ASCIIEncoding.ASCII.GetBytes(System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(sKey, "md5").Substring(0, 8));
des.Key = Convert.FromBase64String(txtKey);
des.IV = Convert.FromBase64String(txtIV);
using (var ms = new MemoryStream())
{
using (var cs = new CryptoStream(ms, des.CreateEncryptor(), CryptoStreamMode.Write))
{
cs.Write(inputByteArray, 0, inputByteArray.Length);
cs.FlushFinalBlock();
StringBuilder ret = new StringBuilder();
foreach (byte b in ms.ToArray())
{
ret.AppendFormat("{0:X2}", b);
}
return ret.ToString();
}
}
}
}
///
/// 解密数据
///
public static string DESDecrypt(string Text, string txtKey, string txtIV)
{
using (var des = new DESCryptoServiceProvider())
{
int len;
len = Text.Length / 2;
byte[] inputByteArray = new byte[len];
int x, i;
for (x = 0; x < len; x++)
{
i = Convert.ToInt32(Text.Substring(x * 2, 2), 16);
inputByteArray[x] = (byte)i;
}
//des.Key = ASCIIEncoding.ASCII.GetBytes(System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(sKey, "md5").Substring(0, 8));
//des.IV = ASCIIEncoding.ASCII.GetBytes(System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(sKey, "md5").Substring(0, 8));
des.Key = Convert.FromBase64String(txtKey);
des.IV = Convert.FromBase64String(txtIV);
using (var ms = new MemoryStream())
{
using (var cs = new CryptoStream(ms, des.CreateDecryptor(), CryptoStreamMode.Write))
{
cs.Write(inputByteArray, 0, inputByteArray.Length);
cs.FlushFinalBlock();
return _encoding.GetString(ms.ToArray());
}
}
}
}
#endregion
//AES密钥向量
private static readonly byte[] _aeskeys = new byte[] {
0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD,
0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF
};
///
/// AES加密
///
/// 加密字符串
/// 密钥
///
[Obsolete("未测试")]
public static string AESEncrypt(string encryptStr, string encryptKey)
{
if (string.IsNullOrWhiteSpace(encryptStr))
return string.Empty;
encryptKey = StringHelper.SubString(encryptKey, 32);
encryptKey = encryptKey.PadRight(32, ' ');
//分组加密算法
using (SymmetricAlgorithm des = Rijndael.Create())
{
byte[] inputByteArray = _encoding.GetBytes(encryptStr);//得到需要加密的字节数组
//设置密钥及密钥向量
des.Key = _encoding.GetBytes(encryptKey);
des.IV = _aeskeys;
byte[] cipherBytes = null;
using (MemoryStream ms = new MemoryStream())
{
using (CryptoStream cs = new CryptoStream(ms, des.CreateEncryptor(), CryptoStreamMode.Write))
{
cs.Write(inputByteArray, 0, inputByteArray.Length);
cs.FlushFinalBlock();
cipherBytes = ms.ToArray();//得到加密后的字节数组
}
}
return Convert.ToBase64String(cipherBytes);
}
}
///
/// AES解密
///
/// 解密字符串
/// 密钥
///
[Obsolete("未测试")]
public static string AESDecrypt(string decryptStr, string decryptKey)
{
if (string.IsNullOrWhiteSpace(decryptStr))
return string.Empty;
decryptKey = StringHelper.SubString(decryptKey, 32);
decryptKey = decryptKey.PadRight(32, ' ');
byte[] cipherText = Convert.FromBase64String(decryptStr);
using (SymmetricAlgorithm des = Rijndael.Create())
{
des.Key = _encoding.GetBytes(decryptKey);
des.IV = _aeskeys;
byte[] decryptBytes = new byte[cipherText.Length];
using (MemoryStream ms = new MemoryStream(cipherText))
{
using (CryptoStream cs = new CryptoStream(ms, des.CreateDecryptor(), CryptoStreamMode.Read))
{
cs.Read(decryptBytes, 0, decryptBytes.Length);
}
}
return _encoding.GetString(decryptBytes).Replace("\0", "");//将字符串后尾的'\0'去掉}
}
}
}
}