using System; using System.IO; using System.Security.Cryptography; using System.Text; namespace Admin.Core.Common.Helpers { /// /// Des加解密 /// public class DesEncrypt { private const string Key = "desenc1!"; /// /// DES+Base64加密 /// 采用ECB、PKCS7 /// /// 加密字符串 /// 秘钥 /// public static string Encrypt(string encryptString, string key = null) { return Encrypt(encryptString, key, false, true); } /// /// DES+Base64解密 /// 采用ECB、PKCS7 /// /// 解密字符串 /// 秘钥 /// public static string Decrypt(string decryptString, string key = null) { return Decrypt(decryptString, key, false); } /// /// DES+16进制加密 /// 采用ECB、PKCS7 /// /// 加密字符串 /// 秘钥 /// 是否小写 /// public static string Encrypt4Hex(string encryptString, string key = null, bool lowerCase = false) { return Encrypt(encryptString, key, true, lowerCase); } /// /// DES+16进制解密 /// 采用ECB、PKCS7 /// /// 解密字符串 /// 秘钥 /// public static string Decrypt4Hex(string decryptString, string key = null) { return Decrypt(decryptString, key, true); } /// /// DES加密 /// /// /// /// /// /// 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.Substring(0, 8)); var inputByteArray = Encoding.UTF8.GetBytes(encryptString); var provider = new DESCryptoServiceProvider { Mode = CipherMode.ECB, Key = keyBytes, Padding = PaddingMode.PKCS7 }; using (var stream = new MemoryStream()) { var cStream = new CryptoStream(stream, provider.CreateEncryptor(), CryptoStreamMode.Write); cStream.Write(inputByteArray, 0, inputByteArray.Length); cStream.FlushFinalBlock(); var bytes = stream.ToArray(); return hex ? bytes.ToHex(lowerCase) : bytes.ToBase64(); } } /// /// DES解密 /// /// /// /// /// 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.Substring(0, 8)); var inputByteArray = hex ? decryptString.HexToBytes() : Convert.FromBase64String(decryptString); var provider = new DESCryptoServiceProvider { Mode = CipherMode.ECB, Key = keyBytes, Padding = PaddingMode.PKCS7 }; using (var mStream = new MemoryStream()) { var cStream = new CryptoStream(mStream, provider.CreateDecryptor(), CryptoStreamMode.Write); cStream.Write(inputByteArray, 0, inputByteArray.Length); cStream.FlushFinalBlock(); return Encoding.UTF8.GetString(mStream.ToArray()); } } } }