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);
}
}
}