using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ShiQuan.Security
{
/// <summary>
/// Base64编码可用于在HTTP环境下传递较长的标识信息。
/// </summary>
public static class Base64Security
{
/// <summary>
/// base64加密
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
public static string EncryptBase64(this string input)
{
byte[] inputBytes = Encoding.UTF8.GetBytes(input);
return Convert.ToBase64String(inputBytes);
}
/// <summary>
/// base64解密
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
public static string DecryptBase64(this string input)
{
byte[] inputBytes = Convert.FromBase64String(input);
return Encoding.UTF8.GetString(inputBytes);
}
}
}
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Security.Cryptography;
using System.Text;
using System.Threading.Tasks;
using System.Web.Security;
namespace ShiQuan.Security
{
/// <summary>
/// DES全称为Data Encryption Standard,即数据加密标准,是一种使用密钥加密的块算法。
/// </summary>
public static class DESSecurity
{
#region Des 加密、解密
//DES加密秘钥,要求为8位
private static readonly string key = "ShiQuan$";
/// <summary>
/// DES数据加密
/// </summary>
/// <param name="targetValue">目标值</param>
/// <returns>加密值</returns>
public static string EncryptDES(this string input)
{
return Encrypt(input, key);
}
/// <summary>
/// DES数据加密
/// </summary>
/// <param name="input">目标值</param>
/// <param name="key">密钥</param>
/// <returns>加密值</returns>
public static string EncryptDES(this string input, string key)
{
return Encrypt(input, key);
}
/// <summary>
/// DES 数据加密
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
public static string Encrypt(string input)
{
return Encrypt(input, key);
}
/// <summary>
/// DES数据加密
/// </summary>
/// <param name="input">目标值</param>
/// <param name="key">密钥</param>
/// <returns>加密值</returns>
public static string Encrypt(string input, string key)
{
if (string.IsNullOrEmpty(input))
{
return string.Empty;
}
try
{
DESCryptoServiceProvider des = new DESCryptoServiceProvider();
byte[] inputByteArray = Encoding.Default.GetBytes(input);
des.Key = ASCIIEncoding.ASCII.GetBytes(MD5Security.Encrypt(key).ToUpper().Substring(0, 8));
des.IV = ASCIIEncoding.ASCII.GetBytes(MD5Security.Encrypt(key).ToUpper().Substring(0, 8));
System.IO.MemoryStream mStream = new System.IO.MemoryStream();
CryptoStream cs = new CryptoStream(mStream, des.CreateEncryptor(), CryptoStreamMode.Write);
cs.Write(inputByteArray, 0, inputByteArray.Length);
cs.FlushFinalBlock();
/*2019-06-28 侯连文 转码有问题*/
//return Encoding.UTF8.GetString(mStream.ToArray());
StringBuilder result = new StringBuilder();
foreach (byte b in mStream.ToArray())
{
result.AppendFormat("{0:X2}", b);
}
return result.ToString();
}
catch
{
return input;
}
}
#endregion
#region 解密
/// <summary>
/// DES数据解密
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
public static string DecryptDES(this string input)
{
return Decrypt(input, key);
}
/// <summary>
/// DES数据解密
/// </summary>
/// <param name="targetValue"></param>
/// <param name="key"></param>
/// <returns></returns>
public static string DecryptDES(this string input, string key)
{
return Decrypt(input, key);
}
/// <summary>
/// 解密数据
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
public static string Decrypt(string input)
{
return Decrypt(input, key);
}
/// <summary>
/// 解密数据
/// </summary>
/// <param name="input"></param>
/// <param name="sKey"></param>
/// <returns></returns>
public static string Decrypt(string input, string key)
{
DESCryptoServiceProvider des = new DESCryptoServiceProvider();
int len = input.Length / 2;
byte[] inputByteArray = new byte[len];
int x, i;
for (x = 0; x < len; x++)
{
i = Convert.ToInt32(input.Substring(x * 2, 2), 16);
inputByteArray[x] = (byte)i;
}
des.Key = ASCIIEncoding.ASCII.GetBytes(MD5Security.Encrypt(key).ToUpper().Substring(0, 8));
des.IV = ASCIIEncoding.ASCII.GetBytes(MD5Security.Encrypt(key).ToUpper().Substring(0, 8));
System.IO.MemoryStream ms = new System.IO.MemoryStream();
CryptoStream cs = new CryptoStream(ms, des.CreateDecryptor(), CryptoStreamMode.Write);
cs.Write(inputByteArray, 0, inputByteArray.Length);
cs.FlushFinalBlock();
/*2019-06-28 侯连文 中文返回乱码*/
//return Encoding.UTF8.GetString(ms.ToArray());
return Encoding.Default.GetString(ms.ToArray());
}
#endregion
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Security.Cryptography;
using System.Text;
using System.Threading.Tasks;
namespace ShiQuan.Security
{
/// <summary>
/// MD5主要是用来做数据校验的,用于确保信息传输完整一致。
/// </summary>
public static class MD5Security
{
/// <summary>
/// MD5 加密
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
public static string EncryptMD5(this string input)
{
// 加密后是一个字节类型的数组,这里要注意编码UTF8/Unicode等的选择
byte[] bytes = MD5Security.Encrypt(System.Text.Encoding.UTF8.GetBytes(input));
return System.Text.Encoding.UTF8.GetString(bytes);
}
/// <summary>
/// MD5 加密
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
public static string Encrypt(string input)
{
// 加密后是一个字节类型的数组,这里要注意编码UTF8/Unicode等的选择
byte[] bytes = MD5Security.Encrypt(System.Text.Encoding.UTF8.GetBytes(input));
return System.Text.Encoding.UTF8.GetString(bytes);
}
/// <summary>
/// MD5 加密
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
public static byte[] Encrypt(byte[] input)
{
MD5 md5 = MD5.Create();
return md5.ComputeHash(input);
}
/// <summary>
/// 32位MD5加密
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
public static string EncryptMD532(this string input)
{
// 加密后是一个字节类型的数组,这里要注意编码UTF8/Unicode等的选择
return MD5Security.Encrypt32(System.Text.Encoding.UTF8.GetBytes(input));
}
/// <summary>
/// 32位MD5加密
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
public static string Encrypt32(string input)
{
// 加密后是一个字节类型的数组,这里要注意编码UTF8/Unicode等的选择
return MD5Security.Encrypt32(System.Text.Encoding.UTF8.GetBytes(input));
}
/// <summary>
/// 32位MD5加密
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
public static string Encrypt32(byte[] input)
{
string result = "";
// 加密后是一个字节类型的数组,这里要注意编码UTF8/Unicode等的选择
byte[] s = MD5Security.Encrypt(input);
// 通过使用循环,将字节类型的数组转换为字符串,此字符串是常规字符格式化所得
for (int i = 0; i < s.Length; i++)
{
// 将得到的字符串使用十六进制类型格式。格式后的字符是小写的字母,如果使用大写(X)则格式后的字符是大写字符
result = result + s[i].ToString("X");
}
return result;
}
/// <summary>
/// 64位MD5加密
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
public static string EncryptMD564(this string input)
{
// 加密后是一个字节类型的数组,这里要注意编码UTF8/Unicode等的选择
return MD5Security.Encrypt64(System.Text.Encoding.UTF8.GetBytes(input));
}
/// <summary>
/// 64位MD5加密
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
public static string Encrypt64(string input)
{
// 加密后是一个字节类型的数组,这里要注意编码UTF8/Unicode等的选择
return MD5Security.Encrypt64(System.Text.Encoding.UTF8.GetBytes(input));
}
/// <summary>
/// 64位MD5加密
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
public static string Encrypt64(byte[] input)
{
//实例化一个md5对像
MD5 md5 = MD5.Create();
// 加密后是一个字节类型的数组,这里要注意编码UTF8/Unicode等的选择
byte[] result = md5.ComputeHash(input);
return Convert.ToBase64String(result);
}
/// <summary>
/// 验证Md5 hash
/// </summary>
/// <param name="input">原字符串</param>
/// <param name="encrypt32Str">原字符串的md5码</param>
/// <returns></returns>
public static bool VerifyMd5Hash(this string input, string encrypt32Str)
{
return input.VerifyMd532Hash(encrypt32Str);
}
/// <summary>
/// 验证Md5 hash
/// </summary>
/// <param name="input">原字符串</param>
/// <param name="encrypt32Str">原字符串的md5码</param>
/// <returns></returns>
public static bool VerifyMd532Hash(this string input, string encrypt32Str)
{
string hashOfInput = input.EncryptMD532();
StringComparer comparer = StringComparer.OrdinalIgnoreCase;
if (0 == comparer.Compare(hashOfInput, encrypt32Str))
return true;
else
return false;
}
/// <summary>
/// 验证Md5 hash
/// </summary>
/// <param name="input">原字符串</param>
/// <param name="encrypt64Str">原字符串的md5码</param>
/// <returns></returns>
public static bool VerifyMd564Hash(this string input, string encrypt64Str)
{
string hashOfInput = input.EncryptMD564();
StringComparer comparer = StringComparer.OrdinalIgnoreCase;
if (0 == comparer.Compare(hashOfInput, encrypt64Str))
return true;
else
return false;
}
}
}
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Security.Cryptography;
using System.Text;
using System.Threading.Tasks;
namespace ShiQuan.Security
{
/// <summary>
/// 非对称加密的代表算法是RSA算法。
/// </summary>
public static class RSASecurity
{
#region RSA加密、解密
private static string RSAKey = "ShiQuan$";
/// <summary>
/// 生成RSA public key private key
/// </summary>
public static void GenerateRSAKey(string privatekeyFile, string publicKeyFile)
{
GenerateRSAKey(RSAKey, privatekeyFile, publicKeyFile);
}
/// <summary>
/// 生成RSA public key private key
/// </summary>
public static void GenerateRSAKey(string keyContainerName, string privatekeyFile, string publicKeyFile)
{
CspParameters param = new CspParameters();
param.KeyContainerName = keyContainerName;//密匙容器的名称,保持加密解密一致才能解密成功
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(param);
using (StreamWriter writer = new StreamWriter(privatekeyFile))
{
writer.WriteLine(rsa.ToXmlString(true));
}
using (StreamWriter writer = new StreamWriter(publicKeyFile))
{
writer.WriteLine(rsa.ToXmlString(false));
}
}
/// <summary>
/// RSA加密
/// </summary>
public static string EncryptRSA(this string input)
{
return input.EncryptRSA(RSAKey);
}
/// <summary>
/// RSA加密
/// </summary>
public static string EncryptRSA(this string input, string keyContainerName)
{
CspParameters param = new CspParameters();
param.KeyContainerName = keyContainerName;//密匙容器的名称,保持加密解密一致才能解密成功
return input.EncryptRSA(param);
}
/// <summary>
/// RSA加密
/// </summary>
public static string EncryptRSA(this string input, CspParameters param)
{
if (string.IsNullOrEmpty(input))
{
return input;
}
try
{
using (RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(param))
{
byte[] plaindata = Encoding.Default.GetBytes(input);//将要加密的字符串转换为字节数组
byte[] encryptdata = rsa.Encrypt(plaindata, false);//将加密后的字节数据转换为新的加密字节数组
return Convert.ToBase64String(encryptdata);//将加密后的字节数组转换为字符串
}
}
catch
{
return input;
}
}
/// <summary>
/// RSA加密
/// </summary>
public static string EncryptRSA(this string input, string publicKey, bool fOAEP = false)
{
if (string.IsNullOrEmpty(input))
{
return input;
}
try
{
//publicKey = @"<RSAKeyValue><Modulus>pHfhtj8f/50PMyRq1MjcmbOSvrIIXRihzLTmrZKyo3o9ID6XEc5p4Tyjz9fbwYc8asfAF4GYJ3C/hPLvMST9M9WMKnT+sEsItG6jSVTSM0N580ORIusJRsoVBBgqczr0hNvaGmDxOvGeomqF1P/8tNQzY8L3a/szdrOSa0v6kW0=</Modulus><Exponent>AQAB</Exponent></RSAKeyValue>";
using (RSACryptoServiceProvider rsa = new RSACryptoServiceProvider())
{
rsa.FromXmlString(publicKey);
byte[] plaindata = Encoding.Default.GetBytes(input);//将要加密的字符串转换为字节数组
byte[] encryptdata = rsa.Encrypt(plaindata, fOAEP);//将加密后的字节数据转换为新的加密字节数组
return Convert.ToBase64String(encryptdata);//将加密后的字节数组转换为字符串
}
}
catch
{
return input;
}
}
/// <summary>
/// RSA解密
/// </summary>
public static string DecryptRSA(this string input)
{
return input.DecryptRSA(RSAKey);
}
/// <summary>
/// RSA解密
/// </summary>
public static string DecryptRSA(this string input, string keyContainerName)
{
if (string.IsNullOrEmpty(input))
{
return input;
}
try
{
CspParameters param = new CspParameters();
param.KeyContainerName = keyContainerName;
using (RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(param))
{
byte[] encryptdata = Convert.FromBase64String(input);
byte[] decryptdata = rsa.Decrypt(encryptdata, false);
return Encoding.Default.GetString(decryptdata);
}
}
catch
{
return input;
}
}
/// <summary>
/// RSA解密
/// </summary>
public static string DecryptRSA(this string input, string privateKey, bool fOAEP = false)
{
if (string.IsNullOrEmpty(input))
{
return input;
}
try
{
using (RSACryptoServiceProvider rsa = new RSACryptoServiceProvider())
{
rsa.FromXmlString(privateKey);
byte[] encryptdata = Convert.FromBase64String(input);
byte[] decryptdata = rsa.Decrypt(encryptdata, fOAEP);
return Encoding.Default.GetString(decryptdata);
}
}
catch
{
return input;
}
}
#endregion
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Security.Cryptography;
using System.Text;
using System.Threading.Tasks;
namespace ShiQuan.Security
{
/// <summary>
/// 安全哈希算法(Secure Hash Algorithm)主要适用于数字签名标准 (Digital Signature Standard DSS)里面定义的数字签名算法(Digital Signature Algorithm DSA)。
/// </summary>
public static class SHA1Security
{
/// <summary>
/// SHA1加密
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
public static string EncryptSHA1(this string input)
{
byte[] inputBytes = Encoding.Default.GetBytes(input);
SHA1 sha = new SHA1CryptoServiceProvider();
byte[] result = sha.ComputeHash(inputBytes);
StringBuilder sBuilder = new StringBuilder();
for (int i = 0; i < result.Length; i++)
{
sBuilder.Append(result[i].ToString("x2"));
}
return sBuilder.ToString();
}
/// <summary>
/// SHA1验证
/// </summary>
/// <param name="input"></param>
/// <param name="encrypt32Str"></param>
/// <returns></returns>
public static bool VerifySha1Hash(string input, string encrypt32Str)
{
string hashOfInput = input.EncryptSHA1();
StringComparer comparer = StringComparer.OrdinalIgnoreCase;
if (0 == comparer.Compare(hashOfInput, encrypt32Str))
return true;
else
return false;
}
}
}