using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Security.Cryptography;
using System.Text;
using System.Threading.Tasks;
namespace Syc.Basic.Web.WMS.Tools
{
public static class SecurityUtil
{
private static readonly byte[] IvBytes = { 0x32, 0xEF, 0x82, 0xAC, 0x63, 0xFA, 0x47, 0xEF };
#region 通用加密算法
///
/// 哈希加密算法
///
/// 所有加密哈希算法实现均必须从中派生的基类
/// 待加密的字符串
/// 字符编码
///
private static string HashEncrypt(HashAlgorithm hashAlgorithm, string input, Encoding encoding)
{
var data = hashAlgorithm.ComputeHash(encoding.GetBytes(input.ToCharArray()));
return BitConverter.ToString(data).Replace("-", "");
}
///
/// 验证哈希值
///
/// 所有加密哈希算法实现均必须从中派生的基类
/// 未加密的字符串
/// 经过加密的哈希值
/// 字符编码
///
private static bool VerifyHashValue(HashAlgorithm hashAlgorithm, string unhashedText, string hashedText,
Encoding encoding)
{
return string.Equals(HashEncrypt(hashAlgorithm, unhashedText, encoding), hashedText,
StringComparison.OrdinalIgnoreCase);
}
#endregion 通用加密算法
#region 哈希加密算法
#region MD5 算法
///
/// MD5 加密
///
/// 待加密的字符串
/// 字符编码
///
public static string MD5Encrypt(this string input, Encoding encoding, int bit = 32)
{
var str = HashEncrypt(MD5.Create(), input, encoding);
if (bit == 16)
return str.Substring(9, 16);
return str;
}
///
/// MD5对比
///
/// 未加密的字符串
/// 未密的字符串
/// 字符编码
///
public static bool VerifyMD5Value(this string input, string targetString, Encoding encoding, int bit)
{
return string.Equals(MD5Encrypt(input, encoding, bit).ToLower(), MD5Encrypt(targetString, encoding, bit).ToLower());
}
///
/// 获取文件的MD5摘要
///
///
///
public static string AbstractFile(string fileName)
{
using (FileStream file = new FileStream(fileName, FileMode.Open))
{
return AbstractFile(file);
}
}
///
/// 根据stream获取文件摘要
///
///
///
public static string AbstractFile(Stream stream)
{
MD5 md5 = new MD5CryptoServiceProvider();
byte[] retVal = md5.ComputeHash(stream);
StringBuilder sb = new StringBuilder();
for (int i = 0; i < retVal.Length; i++)
{
sb.Append(retVal[i].ToString("x2"));
}
return sb.ToString();
}
#endregion MD5 算法
#region SHA1 算法
///
/// SHA1 加密
///
/// 要加密的字符串
/// 字符编码
///
public static string SHA1Encrypt(string input, Encoding encoding)
{
return HashEncrypt(SHA1.Create(), input, encoding);
}
///
/// 验证 SHA1 值
///
/// 未加密的字符串
/// 字符编码
///
public static bool VerifySHA1Value(string input, Encoding encoding)
{
return VerifyHashValue(SHA1.Create(), input, SHA1Encrypt(input, encoding), encoding);
}
#endregion SHA1 算法
#region SHA256 算法
///
/// SHA256 加密
///
/// 要加密的字符串
/// 字符编码
///
public static string SHA256Encrypt(string input, Encoding encoding)
{
return HashEncrypt(SHA256.Create(), input, encoding);
}
///
/// 验证 SHA256 值
///
/// 未加密的字符串
/// 字符编码
///
public static bool VerifySHA256Value(string input, Encoding encoding)
{
return VerifyHashValue(SHA256.Create(), input, SHA256Encrypt(input, encoding), encoding);
}
#endregion SHA256 算法
#region SHA384 算法
///
/// SHA384 加密
///
/// 要加密的字符串
/// 字符编码
///
public static string SHA384Encrypt(string input, Encoding encoding)
{
return HashEncrypt(SHA384.Create(), input, encoding);
}
///
/// 验证 SHA384 值
///
/// 未加密的字符串
/// 字符编码
///
public static bool VerifySHA384Value(string input, Encoding encoding)
{
return VerifyHashValue(SHA256.Create(), input, SHA384Encrypt(input, encoding), encoding);
}
#endregion SHA384 算法
#region SHA512 算法
///
/// SHA512 加密
///
/// 要加密的字符串
/// 字符编码
///
public static string SHA512Encrypt(string input, Encoding encoding)
{
return HashEncrypt(SHA512.Create(), input, encoding);
}
///
/// 验证 SHA512 值
///
/// 未加密的字符串
/// 字符编码
///
public static bool VerifySHA512Value(string input, Encoding encoding)
{
return VerifyHashValue(SHA512.Create(), input, SHA512Encrypt(input, encoding), encoding);
}
#endregion SHA512 算法
#region HMAC-MD5 加密
///
/// HMAC-MD5 加密
///
/// 要加密的字符串
/// 密钥
/// 字符编码
///
public static string HMACSMD5Encrypt(string input, string key, Encoding encoding)
{
return HashEncrypt(new HMACMD5(encoding.GetBytes(key)), input, encoding);
}
#endregion HMAC-MD5 加密
#region HMAC-SHA1 加密
///
/// HMAC-SHA1 加密
///
/// 要加密的字符串
/// 密钥
/// 字符编码
///
public static string HMACS_HA1Encrypt(string key, string input, Encoding encoding)
{
return HashEncrypt(new HMACSHA1(encoding.GetBytes(key.ToCharArray())), input, encoding);
}
#endregion HMAC-SHA1 加密
#region HMAC-SHA256 加密
///
/// HMAC-SHA256 加密
///
/// 要加密的字符串
/// 密钥
/// 字符编码
///
public static string HMAC_SHA256Encrypt(string key, string input, Encoding encoding)
{
return HashEncrypt(new HMACSHA256(encoding.GetBytes(key)), input, encoding);
}
#endregion HMAC-SHA256 加密
#region HMAC-SHA384 加密
///
/// HMAC-SHA384 加密
///
/// 要加密的字符串
/// 密钥
/// 字符编码
///
public static string HMACS_HA384Encrypt(string key, string input, Encoding encoding)
{
return HashEncrypt(new HMACSHA384(encoding.GetBytes(key)), input, encoding);
}
#endregion HMAC-SHA384 加密
#region HMAC-SHA512 加密
///
/// HMAC-SHA512 加密
///
/// 要加密的字符串
/// 密钥
/// 字符编码
///
public static string HMACS_HA512Encrypt(string key, string input, Encoding encoding)
{
return HashEncrypt(new HMACSHA512(encoding.GetBytes(key)), input, encoding);
}
#endregion HMAC-SHA512 加密
#endregion 哈希加密算法
#region 对称加密算法
#region Des 加解密
///
/// DES 加密
///
/// 待加密的字符串
/// 密钥(8位)
///
public static string DESEncrypt(string input, string key)
{
try
{
var keyBytes = Encoding.UTF8.GetBytes(key);
//var ivBytes = Encoding.UTF8.GetBytes(iv);
var des = DES.Create();
des.Mode = CipherMode.ECB; //兼容其他语言的 Des 加密算法
des.Padding = PaddingMode.Zeros; //自动补 0
using (var ms = new MemoryStream())
{
var data = Encoding.UTF8.GetBytes(input);
using (var cs = new CryptoStream(ms, des.CreateEncryptor(keyBytes, IvBytes), CryptoStreamMode.Write)
)
{
cs.Write(data, 0, data.Length);
cs.FlushFinalBlock();
}
return Convert.ToBase64String(ms.ToArray());
}
}
catch
{
return input;
}
}
///
/// DES 解密
///
/// 待解密的字符串
/// 密钥(8位)
///
public static string DESDecrypt(string input, string key)
{
try
{
var keyBytes = Encoding.UTF8.GetBytes(key);
//var ivBytes = Encoding.UTF8.GetBytes(iv);
var des = DES.Create();
des.Mode = CipherMode.ECB; //兼容其他语言的Des加密算法
des.Padding = PaddingMode.Zeros; //自动补0
using (var ms = new MemoryStream())
{
var data = Convert.FromBase64String(input);
using (var cs = new CryptoStream(ms, des.CreateDecryptor(keyBytes, IvBytes), CryptoStreamMode.Write)
)
{
cs.Write(data, 0, data.Length);
cs.FlushFinalBlock();
}
return Encoding.UTF8.GetString(ms.ToArray());
}
}
catch
{
return input;
}
}
#endregion Des 加解密
#endregion 对称加密算法
#region 非对称加密算法
///
/// 生成 RSA 公钥和私钥
///
/// 公钥
/// 私钥
public static void GenerateRSAKeys(out string publicKey, out string privateKey)
{
using (var rsa = new RSACryptoServiceProvider())
{
publicKey = rsa.ToXmlString(false);
privateKey = rsa.ToXmlString(true);
}
}
///
/// RSA 加密
///
/// 公钥
/// 待加密的内容
/// 经过加密的字符串
public static string RSAEncrypt(string publickey, string content)
{
var rsa = new RSACryptoServiceProvider();
rsa.FromXmlString(publickey);
var cipherbytes = rsa.Encrypt(Encoding.UTF8.GetBytes(content), false);
return Convert.ToBase64String(cipherbytes);
}
///
/// RSA 解密
///
/// 私钥
/// 待解密的内容
/// 解密后的字符串
public static string RSADecrypt(string privatekey, string content)
{
var rsa = new RSACryptoServiceProvider();
rsa.FromXmlString(privatekey);
var cipherbytes = rsa.Decrypt(Convert.FromBase64String(content), false);
return Encoding.UTF8.GetString(cipherbytes);
}
#endregion 非对称加密算法
#region base64 编码/解码
///
/// 编码
///
///
///
///
public static string EncodeBase64(this string code, Encoding encoding)
{
string encode = "";
byte[] bytes = encoding.GetBytes(code);
try
{
encode = Convert.ToBase64String(bytes);
}
catch
{
encode = code;
}
return encode;
}
///
/// 解码
///
///
///
///
public static string DecodeBase64(this string code, Encoding encoding)
{
string decode = "";
byte[] bytes = Convert.FromBase64String(code);
try
{
decode = encoding.GetString(bytes);
}
catch
{
decode = code;
}
return decode;
}
#endregion
}
}