private const string Key = "自定义秘钥";
/// <summary>
/// DES+Base64加密
/// <para>采用ECB、PKCS7</para>
/// </summary>
/// <param name="encryptString">加密字符串</param>
/// <param name="key">秘钥</param>
/// <returns></returns>
public static string Encrypt(string encryptString, string key = null)
{
return Encrypt(encryptString, key, false, true);
}
/// <summary>
/// DES+Base64解密
/// <para>采用ECB、PKCS7</para>
/// </summary>
/// <param name="decryptString">解密字符串</param>
/// <param name="key">秘钥</param>
/// <returns></returns>
public static string Decrypt(string decryptString, string key = null)
{
return Decrypt(decryptString, key, false);
}
/// <summary>
/// DES+16进制加密
/// <para>采用ECB、PKCS7</para>
/// </summary>
/// <param name="encryptString">加密字符串</param>
/// <param name="key">秘钥</param>
/// <param name="lowerCase">是否小写</param>
/// <returns></returns>
public static string Encrypt4Hex(string encryptString, string key = null, bool lowerCase = false)
{
return Encrypt(encryptString, key, true, lowerCase);
}
/// <summary>
/// DES+16进制解密
/// <para>采用ECB、PKCS7</para>
/// </summary>
/// <param name="decryptString">解密字符串</param>
/// <param name="key">秘钥</param>
/// <returns></returns>
public static string Decrypt4Hex(string decryptString, string key = null)
{
return Decrypt(decryptString, key, true);
}
/// <summary>
/// DES加密
/// </summary>
/// <param name="encryptString"></param>
/// <param name="key"></param>
/// <param name="hex"></param>
/// <param name="lowerCase"></param>
/// <returns></returns>
private static string Encrypt(string encryptString, string key, bool hex, bool lowerCase = false)
{
if (encryptString.IsNull())
return null;
if (key.IsNull())
key = Key;
if (key.Length < 8)
throw new ArgumentException("秘钥长度为8位", nameof(key));
var keyBytes = Encoding.UTF8.GetBytes(key[..8]);
var inputByteArray = Encoding.UTF8.GetBytes(encryptString);
var des = DES.Create();
des.Mode = CipherMode.ECB;
des.Key = keyBytes;
des.Padding = PaddingMode.PKCS7;
using var stream = new MemoryStream();
var cStream = new CryptoStream(stream, des.CreateEncryptor(), CryptoStreamMode.Write);
cStream.Write(inputByteArray, 0, inputByteArray.Length);
cStream.FlushFinalBlock();
var bytes = stream.ToArray();
return hex ? bytes.ToHex(lowerCase) : bytes.ToBase64();
}
/// <summary>
/// DES解密
/// </summary>
/// <param name="decryptString"></param>
/// <param name="key"></param>
/// <param name="hex"></param>
/// <returns></returns>
private static string Decrypt(string decryptString, string key, bool hex)
{
if (decryptString.IsNull())
return null;
if (key.IsNull())
key = Key;
if (key.Length < 8)
throw new ArgumentException("秘钥长度为8位", nameof(key));
var keyBytes = Encoding.UTF8.GetBytes(key[..8]);
var inputByteArray = hex ? decryptString.HexToBytes() : Convert.FromBase64String(decryptString);
var des = DES.Create();
des.Mode = CipherMode.ECB;
des.Key = keyBytes;
des.Padding = PaddingMode.PKCS7;
using var mStream = new MemoryStream();
var cStream = new CryptoStream(mStream, des.CreateDecryptor(), CryptoStreamMode.Write);
cStream.Write(inputByteArray, 0, inputByteArray.Length);
cStream.FlushFinalBlock();
return Encoding.UTF8.GetString(mStream.ToArray());
}
/// <summary>
/// 16位MD5加密
/// </summary>
/// <param name="password"></param>
/// <param name="lowerCase"></param>
/// <returns></returns>
public static string Encrypt16(string password, bool lowerCase = false)
{
if (password.IsNull())
return null;
using var md5 = MD5.Create();
return md5.ComputeHash(Encoding.UTF8.GetBytes(password)).ToHex(lowerCase);
}
/// <summary>
/// 32位MD5加密
/// </summary>
/// <param name="password"></param>
/// <param name="lowerCase"></param>
/// <returns></returns>
public static string Encrypt32(string password = "", bool lowerCase = false)
{
if (password.IsNull())
return null;
using var md5 = MD5.Create();
string pwd = string.Empty;
byte[] s = md5.ComputeHash(Encoding.UTF8.GetBytes(password));
var format = lowerCase ? "x2" : "X2";
foreach (var item in s)
{
pwd = string.Concat(pwd, item.ToString(format));
}
return pwd;
}
/// <summary>
/// 64位MD5加密
/// </summary>
/// <param name="password"></param>
/// <returns></returns>
public static string Encrypt64(string password)
{
if (password.IsNull())
return null;
using var md5 = MD5.Create();
byte[] s = md5.ComputeHash(Encoding.UTF8.GetBytes(password));
return s.ToBase64();
}
public static string GetHash(Stream stream)
{
StringBuilder sb = new();
using var md5 = MD5.Create();
byte[] hashBytes = md5.ComputeHash(stream);
foreach (byte bt in hashBytes)
{
sb.Append(bt.ToString("x2"));
}
return sb.ToString();
}