using Alchemy.Core.Extensions; using System.Security.Cryptography; using System.Security.Cryptography.X509Certificates; using System.Text; namespace Alchemy.Core.Services { public class CryptoService { /// /// 将一条十六进制字符串转换为ASCII /// /// 一条十六进制字符串 /// 返回一条ASCII码 public static string HexStringToASCII(string hexstring) { byte[] bt = HexStringToBinary(hexstring); string lin = ""; for (int i = 0; i < bt.Length; i++) { lin = lin + bt[i] + " "; } string[] ss = lin.Trim().Split(new char[] { ' ' }); char[] c = new char[ss.Length]; int a; for (int i = 0; i < c.Length; i++) { a = Convert.ToInt32(ss[i]); c[i] = Convert.ToChar(a); } string b = new string(c); return b; } /**/ /// /// 16进制字符串转换为二进制数组 /// /// 字符串每个字节之间都应该有空格,大多数的串口通讯资料上面的16进制都是字节之间都是用空格来分割的。 /// 返回一个二进制字符串 public static byte[] HexStringToBinary(string hexstring) { string[] tmpary = hexstring.Trim().Split(' '); byte[] buff = new byte[tmpary.Length]; for (int i = 0; i < buff.Length; i++) { buff[i] = Convert.ToByte(tmpary[i], 16); } return buff; } /// /// AES 解密 /// /// /// /// public static string DecodeAes(string strEncoded, string strKey) { string strResult = string.Empty; byte[] encryptedBytes = Convert.FromBase64String(strEncoded); byte[] keyBytes = Encoding.UTF8.GetBytes(strKey); using (Aes aes = Aes.Create()) { aes.Key = keyBytes; aes.IV = new byte[aes.BlockSize / 8]; using (MemoryStream memStream = new MemoryStream()) { using (CryptoStream cryptoStream = new CryptoStream(memStream, aes.CreateDecryptor(), CryptoStreamMode.Write)) { cryptoStream.Write(encryptedBytes, 0, encryptedBytes.Length); cryptoStream.FlushFinalBlock(); byte[] decryptedBytes = memStream.ToArray(); strResult = Encoding.UTF8.GetString(decryptedBytes); } } } return strResult; } /// /// 唯一识别ID加密算法 /// /// /// /// public static string EncodeUniqId(int numID, string strString) { string strUserIDHashed = EncodeMD5(numID.ToString()); string strUserNameHashed = EncodeMD5(strString); string strDatetimeHashed = EncodeMD5(DateTimeService.Now()); string value = EncodeMD5(EncodeBase64(strUserIDHashed + strUserNameHashed + strDatetimeHashed)); return value; } /// /// 用户密码加密算法,使用基础加密算法 /// /// 输入未加密的密码 /// public static string EncodeUserPwd(string strPwd) { //string value = EncodeMD5(EncodeBase64(EncodeMD5(strPwd))); return EncodeMD5(strPwd); } /// /// 基础加密算法,先MD5再Base64再MD5 /// /// 输入未加密的数据 /// public static string EncodeBasicCrypto(string strData) { string value = EncodeMD5(EncodeBase64(EncodeMD5(strData))); return value; } /// /// 不安全加密算法,3次Base64 /// /// /// public static string EncodeUnsafeCrypto(string strData) { string value = EncodeBase64(EncodeBase64(EncodeBase64(strData))); return value; } public static string DecodeUnsafeCrypto(string strData) { string value = DecodeBase64(DecodeBase64(DecodeBase64(strData))); return value; } /// /// MD5加密,输出32位小写 /// /// 输入字符串 /// public static string EncodeMD5(string strData) { MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider(); byte[] bytValue, bytHash; bytValue = Encoding.UTF8.GetBytes(strData); bytHash = md5.ComputeHash(bytValue); md5.Clear(); string sTemp = ""; for (int i = 0; i < bytHash.Length; i++) { sTemp += bytHash[i].ToString("X").PadLeft(2, '0'); } return sTemp.ToLower(); } /// /// Base64加密 /// /// 输入字符串 /// public static string EncodeBase64(string strData) { byte[] arrData = Encoding.UTF8.GetBytes(strData); string strBase64 = Convert.ToBase64String(arrData); return strBase64; } /// /// Base64解密 /// /// 输入字符串 /// public static string DecodeBase64(string strData) { string strRaw = string.Empty; try { byte[] bytes = Convert.FromBase64String(strData); strRaw = Encoding.UTF8.GetString(bytes); } catch (Exception ex) { //throw new Exception(ex.Message); strRaw = strData; } return strRaw; } /// /// HMACSHA256加密算法 /// /// /// /// public static string EncodeHMACSHA256forWx(string strSecret) { return EncodeHMACSHA256("", strSecret); } /// /// /// /// /// /// public static string EncodeHMACSHA256(string strData, string strSecret) { // 1. 将密钥字符串转换为UTF-8字节数组(不进行Base64解码) byte[] keyBytes = Encoding.UTF8.GetBytes(strSecret); // 2. 处理空字符串:使用空字节数组 byte[] dataBytes = string.IsNullOrEmpty(strData) ? new byte[0] : Encoding.UTF8.GetBytes(strData); // 3. 计算HMAC-SHA256 using var hmac = new HMACSHA256(keyBytes); byte[] hashBytes = hmac.ComputeHash(dataBytes); // 4. 转换为小写十六进制字符串 return Convert.ToHexString(hashBytes).ToLowerInvariant(); } /// /// 生成短链接 /// /// /// /// public static string EncodeShortUrl(string strKey, int len = 6) { string value = string.Empty; List listFilter = new List(); listFilter.Add("o"); listFilter.Add("0"); listFilter.Add("O"); listFilter.Add("I"); listFilter.Add("l"); listFilter.Add("i"); listFilter.Add("1"); for (int i = 0; i < len; i++) { string strChar = EncodeMD5(strKey + Guid.NewGuid().ToString()).ToUpper().Substring(i, 1); while (!listFilter.Contains(strChar)) { strChar = EncodeMD5(strKey + Guid.NewGuid().ToString()).ToUpper().Substring(i, 1); } value += strChar; } return value; } /// /// 生成外部订单号 /// /// /// public static string EncodeOutTradeNo(string strPrefix) { return strPrefix + EncodeUniqId(9999, Guid.NewGuid().ToString()).ToUpper(); } /// /// RSA加密 /// /// /// /// public static string EncodeRSA(string text, byte[] publicKey) { using (var x509 = new X509Certificate2(publicKey)) { using (var rsa = (RSACryptoServiceProvider)x509.PublicKey.Key) { var buff = rsa.Encrypt(Encoding.UTF8.GetBytes(text), true); return Convert.ToBase64String(buff); } } } /// /// 计算文件的 MD5 值 /// /// 要计算 MD5 值的文件名和路径 /// MD5 值16进制字符串 //public static string EncodeMd5FileHash(string fileName) //{ // return HashFile(fileName, "md5"); //} /// /// 计算文件的哈希值 /// /// 要计算哈希值的文件名和路径 /// 算法:sha1,md5 /// 哈希值16进制字符串 //private static string HashFile(string fileName, string algName) //{ // if (!File.Exists(fileName)) // return string.Empty; // FileStream fs = new FileStream(fileName, FileMode.Open, FileAccess.Read); // byte[] hashBytes = HashData(fs, algName); // fs.Close(); // return ConvertService.ByteArrayToHexString(hashBytes); //} /// /// 计算哈希值 /// /// 要计算哈希值的 Stream /// 算法:sha1,md5 /// 哈希值字节数组 private static byte[] HashData(Stream stream, string algName) { HashAlgorithm algorithm; if (algName.IsNull()) { throw new ArgumentNullException("algName 不能为 null"); } if (string.Compare(algName, "sha1", true) == 0) { algorithm = SHA1.Create(); } else { if (string.Compare(algName, "md5", true) != 0) { throw new Exception("algName 只能使用 sha1 或 md5"); } algorithm = MD5.Create(); } return algorithm.ComputeHash(stream); } } }