/// <summary>
/// 日志类
/// </summary>
public class Log
{
/// <summary>
/// 日志等级,0.不输出日志;1.只输出错误信息; 2.输出错误和正常信息; 3.输出错误信息、正常信息和调试信息
/// </summary>
public static int logLevel = 3;
/// <summary>
/// 在网站根目录下创建日志目录
/// </summary>
public static string path = Path.GetDirectoryName(AppDomain.CurrentDomain.BaseDirectory) + Path.DirectorySeparatorChar + "logs";
/// <summary>
/// 向日志文件写入调试信息
/// </summary>
/// <param name="className">类名</param>
/// <param name="content">写入内容</param>
public static void Debug(string className, string content)
{
if (logLevel >= 3)
{
WriteLog("DEBUG", className, content);
}
}
/// <summary>
/// 向日志文件写入运行时信息
/// </summary>
/// <param name="className">类名</param>
/// <param name="content">写入内容</param>
public static void Info(string className, string content)
{
if (logLevel >= 2)
{
WriteLog("INFO", className, content);
}
}
/// <summary>
/// 向日志文件写入出错信息
/// </summary>
/// <param name="className">类名</param>
/// <param name="content">写入内容</param>
public static void Error(string className, string content)
{
if (logLevel >= 1)
{
WriteLog("ERROR", className, content);
}
}
/// <summary>
/// 实际的写日志操作
/// </summary>
/// <param name="type">日志记录类型</param>
/// <param name="className">类名</param>
/// <param name="content">写入内容</param>
protected static void WriteLog(string type, string className, string content)
{
if (!Directory.Exists(path))//如果日志目录不存在就创建
{
Directory.CreateDirectory(path);
}
string time = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff");//获取当前系统时间
string filename = path + "/" + DateTime.Now.ToString("yyyy-MM-dd") + ".log";//用日期对日志文件命名
//创建或打开日志文件,向日志文件末尾追加记录
using (StreamWriter mySw = File.AppendText(filename))
{
//向日志文件写入内容
string write_content = time + " " + type + " " + className + ": " + content;
mySw.WriteLine(write_content);
}
}
}
/// <summary>
/// RSA密钥格式转换
/// </summary>
public class RSAKeyConvert
{
#region 私钥
/// <summary>
/// RSA私钥格式转换,java->.net
/// </summary>
/// <param name="privateKey">java生成的RSA私钥</param>
/// <returns></returns>
public static string RSAPrivateKeyJava2DotNet(string privateKey)
{
RsaPrivateCrtKeyParameters privateKeyParam = (RsaPrivateCrtKeyParameters)PrivateKeyFactory.CreateKey(Convert.FromBase64String(privateKey));
return string.Format("<RSAKeyValue><Modulus>{0}</Modulus><Exponent>{1}</Exponent><P>{2}</P><Q>{3}</Q><DP>{4}</DP><DQ>{5}</DQ><InverseQ>{6}</InverseQ><D>{7}</D></RSAKeyValue>",
Convert.ToBase64String(privateKeyParam.Modulus.ToByteArrayUnsigned()),
Convert.ToBase64String(privateKeyParam.PublicExponent.ToByteArrayUnsigned()),
Convert.ToBase64String(privateKeyParam.P.ToByteArrayUnsigned()),
Convert.ToBase64String(privateKeyParam.Q.ToByteArrayUnsigned()),
Convert.ToBase64String(privateKeyParam.DP.ToByteArrayUnsigned()),
Convert.ToBase64String(privateKeyParam.DQ.ToByteArrayUnsigned()),
Convert.ToBase64String(privateKeyParam.QInv.ToByteArrayUnsigned()),
Convert.ToBase64String(privateKeyParam.Exponent.ToByteArrayUnsigned()));
}
/// <summary>
/// RSA私钥格式转换,.net->java
/// </summary>
/// <param name="privateKey">.net生成的私钥</param>
/// <returns></returns>
public static string RSAPrivateKeyDotNet2Java(string privateKey)
{
XmlDocument doc = new XmlDocument();
doc.LoadXml(privateKey);
BigInteger m = new BigInteger(1, Convert.FromBase64String(doc.DocumentElement.GetElementsByTagName("Modulus")[0].InnerText));
BigInteger exp = new BigInteger(1, Convert.FromBase64String(doc.DocumentElement.GetElementsByTagName("Exponent")[0].InnerText));
BigInteger d = new BigInteger(1, Convert.FromBase64String(doc.DocumentElement.GetElementsByTagName("D")[0].InnerText));
BigInteger p = new BigInteger(1, Convert.FromBase64String(doc.DocumentElement.GetElementsByTagName("P")[0].InnerText));
BigInteger q = new BigInteger(1, Convert.FromBase64String(doc.DocumentElement.GetElementsByTagName("Q")[0].InnerText));
BigInteger dp = new BigInteger(1, Convert.FromBase64String(doc.DocumentElement.GetElementsByTagName("DP")[0].InnerText));
BigInteger dq = new BigInteger(1, Convert.FromBase64String(doc.DocumentElement.GetElementsByTagName("DQ")[0].InnerText));
BigInteger qinv = new BigInteger(1, Convert.FromBase64String(doc.DocumentElement.GetElementsByTagName("InverseQ")[0].InnerText));
RsaPrivateCrtKeyParameters privateKeyParam = new RsaPrivateCrtKeyParameters(m, exp, d, p, q, dp, dq, qinv);
PrivateKeyInfo privateKeyInfo = PrivateKeyInfoFactory.CreatePrivateKeyInfo(privateKeyParam);
byte[] serializedPrivateBytes = privateKeyInfo.ToAsn1Object().GetEncoded();
return Convert.ToBase64String(serializedPrivateBytes);
}
/// <summary>
/// PEM私钥转换成XML私钥
/// </summary>
/// <param name="privateKey">生成的RSA私钥 pem格式密钥</param>
/// <returns></returns>
public static string PrivateKeyPemToXml(string privateKey)
{
string rsaKey = string.Empty;
using (StringReader sReader = new StringReader(privateKey))
{
var pemReader = new Org.BouncyCastle.OpenSsl.PemReader(sReader);
object pemObject = pemReader.ReadObject();
RsaPrivateCrtKeyParameters key = (RsaPrivateCrtKeyParameters)((AsymmetricCipherKeyPair)pemObject).Private;
RSAParameters rsaPara = new RSAParameters
{
Modulus = key.Modulus.ToByteArrayUnsigned(),
Exponent = key.PublicExponent.ToByteArrayUnsigned(),
D = key.Exponent.ToByteArrayUnsigned(),
P = key.P.ToByteArrayUnsigned(),
Q = key.Q.ToByteArrayUnsigned(),
DP = key.DP.ToByteArrayUnsigned(),
DQ = key.DQ.ToByteArrayUnsigned(),
InverseQ = key.QInv.ToByteArrayUnsigned(),
};
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
rsa.ImportParameters(rsaPara);
using (StringWriter sw = new StringWriter())
{
sw.Write(rsa.ToXmlString(true));
rsaKey = sw.ToString();
}
}
return rsaKey;
}
/// <summary>
/// XML私钥转成PEM私钥
/// </summary>
/// <param name="xmlPrivateKey"></param>
/// <returns></returns>
public static string PrivateKeyXmlToPem(string xmlPrivateKey)
{
RSAParameters rsaParam;
using (RSACryptoServiceProvider rsa = new RSACryptoServiceProvider())
{
rsa.FromXmlString(xmlPrivateKey);
rsaParam = rsa.ExportParameters(true);
}
var param = new RsaPrivateCrtKeyParameters(
new BigInteger(1, rsaParam.Modulus), new BigInteger(1, rsaParam.Exponent), new BigInteger(1, rsaParam.D),
new BigInteger(1, rsaParam.P), new BigInteger(1, rsaParam.Q), new BigInteger(1, rsaParam.DP), new BigInteger(1, rsaParam.DQ),
new BigInteger(1, rsaParam.InverseQ));
string pemPrivateKeyStr = null;
using (var ms = new MemoryStream())
{
using (var sw = new StreamWriter(ms))
{
var pemWriter = new Org.BouncyCastle.OpenSsl.PemWriter(sw);
pemWriter.WriteObject(param);
sw.Flush();
byte[] buffer = new byte[ms.Length];
ms.Position = 0;
ms.Read(buffer, 0, (int)ms.Length);
pemPrivateKeyStr = Encoding.UTF8.GetString(buffer);
}
}
return pemPrivateKeyStr;
}
#endregion 私钥
#region 公钥
/// <summary>
/// RSA公钥格式转换,java->.net
/// </summary>
/// <param name="publicKey">java生成的公钥</param>
/// <returns></returns>
public static string RSAPublicKeyJava2DotNet(string publicKey)
{
RsaKeyParameters publicKeyParam = (RsaKeyParameters)PublicKeyFactory.CreateKey(Convert.FromBase64String(publicKey));
return string.Format("<RSAKeyValue><Modulus>{0}</Modulus><Exponent>{1}</Exponent></RSAKeyValue>",
Convert.ToBase64String(publicKeyParam.Modulus.ToByteArrayUnsigned()),
Convert.ToBase64String(publicKeyParam.Exponent.ToByteArrayUnsigned()));
}
/// <summary>
/// RSA公钥格式转换,.net->java
/// </summary>
/// <param name="publicKey">.net生成的公钥</param>
/// <returns></returns>
public static string RSAPublicKeyDotNet2Java(string publicKey)
{
XmlDocument doc = new XmlDocument();
doc.LoadXml(publicKey);
BigInteger m = new BigInteger(1, Convert.FromBase64String(doc.DocumentElement.GetElementsByTagName("Modulus")[0].InnerText));
BigInteger p = new BigInteger(1, Convert.FromBase64String(doc.DocumentElement.GetElementsByTagName("Exponent")[0].InnerText));
RsaKeyParameters pub = new RsaKeyParameters(false, m, p);
SubjectPublicKeyInfo publicKeyInfo = SubjectPublicKeyInfoFactory.CreateSubjectPublicKeyInfo(pub);
byte[] serializedPublicBytes = publicKeyInfo.ToAsn1Object().GetDerEncoded();
return Convert.ToBase64String(serializedPublicBytes);
}
/// <summary>
/// PEM公钥转换成XML公钥
/// </summary>
/// <param name="publicKey">生成的RSA公钥 pem格式密钥</param>
/// <returns></returns>
public static string PublicKeyPemToXml(string publicKey)
{
string rsaKey = string.Empty;
using (StringReader sReader = new StringReader(publicKey))
{
var pemReader = new Org.BouncyCastle.OpenSsl.PemReader(sReader);
object pemObject = pemReader.ReadObject();
RsaKeyParameters key = (RsaKeyParameters)pemObject;
RSAParameters rsaPara = new RSAParameters
{
Modulus = key.Modulus.ToByteArrayUnsigned(),
Exponent = key.Exponent.ToByteArrayUnsigned(),
};
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
rsa.ImportParameters(rsaPara);
using (StringWriter sw = new StringWriter())
{
sw.Write(rsa.ToXmlString(true));
rsaKey = sw.ToString();
}
}
return rsaKey;
}
/// <summary>
/// XML公钥转成Pem公钥
/// </summary>
/// <param name="xmlPublicKey"></param>
/// <returns></returns>
public static string PublicKeyXmlToPem(string xmlPublicKey)
{
RSAParameters rsaParam;
using (RSACryptoServiceProvider rsa = new RSACryptoServiceProvider())
{
rsa.FromXmlString(xmlPublicKey);
rsaParam = rsa.ExportParameters(false);
}
RsaKeyParameters param = new RsaKeyParameters(false, new BigInteger(1, rsaParam.Modulus), new BigInteger(1, rsaParam.Exponent));
string pemPublicKeyStr = null;
using (var ms = new MemoryStream())
{
using (var sw = new StreamWriter(ms))
{
var pemWriter = new Org.BouncyCastle.OpenSsl.PemWriter(sw);
pemWriter.WriteObject(param);
sw.Flush();
byte[] buffer = new byte[ms.Length];
ms.Position = 0;
ms.Read(buffer, 0, (int)ms.Length);
pemPublicKeyStr = Encoding.UTF8.GetString(buffer);
}
}
return pemPublicKeyStr;
}
#endregion 公钥
}
/// <summary>
/// 解密
/// </summary>
/// <param name="privateKey">私钥 “-----BEGIN RSA PRIVATE KEY-----”开头 “-----END RSA PRIVATE KEY-----”结尾</param>
/// <param name="text">使用publickey_ver指定版本的公钥进行非对称加密后base64加密的内容</param>
/// <returns></returns>
public string Decrypt(string privateKey, string text)
{
var rsa = new RSACryptoServiceProvider();
var bytes = Convert.FromBase64String(text);
rsa.FromXmlString(RSAKeyConvert.PrivateKeyPemToXml(privateKey));
var result = rsa.Decrypt(bytes, false);
return Encoding.UTF8.GetString(result);
}
/// <summary>
/// 缓存工具类
/// </summary>
public class CacheHelper
{
/// <summary>
/// 获取数据缓存
/// </summary>
/// <param name="CacheKey">对象的键值</param>
public static object GetCache(string CacheKey)
{
Cache objCache = HttpRuntime.Cache;
return objCache[CacheKey];
}
/// <summary>
/// 设置数据缓存
/// </summary>
/// <param name="CacheKey">对象的键值</param>
/// <param name="obj">缓存的对象</param>
public static void SetCache(string CacheKey, object obj)
{
Cache objCache = HttpRuntime.Cache;
objCache.Insert(CacheKey, obj);
}
/// <summary>
/// 设置数据缓存
/// </summary>
/// <param name="CacheKey">对象的键值</param>
/// <param name="obj">缓存的对象</param>
/// <param name="Timeout"></param>
public static void SetCache(string CacheKey, object obj, TimeSpan Timeout)
{
Cache objCache = HttpRuntime.Cache;
objCache.Insert(CacheKey, obj, null, DateTime.MaxValue, Timeout, CacheItemPriority.NotRemovable, null);
}
/// <summary>
/// 设置数据缓存
/// </summary>
/// <param name="CacheKey">对象的键值</param>
/// <param name="obj">缓存的对象</param>
/// <param name="expire"></param>
public static void SetCache(string CacheKey, object obj, int expire)
{
Cache objCache = HttpRuntime.Cache;
//表示永不过期
if (expire == 0)
{
objCache.Insert(CacheKey, obj, null, DateTime.MaxValue, TimeSpan.Zero, CacheItemPriority.High, null);
}
else
{
objCache.Insert(CacheKey, obj, null, DateTime.Now.AddSeconds(expire), Cache.NoSlidingExpiration, CacheItemPriority.High, null);
}
}
/// <summary>
/// 设置数据缓存
/// </summary>
/// <param name="CacheKey">对象的键值</param>
/// <param name="obj">缓存的对象</param>
/// <param name="absoluteExpiration"></param>
/// <param name="slidingExpiration"></param>
public static void SetCache(string CacheKey, object obj, DateTime absoluteExpiration, TimeSpan slidingExpiration)
{
Cache objCache = HttpRuntime.Cache;
objCache.Insert(CacheKey, obj, null, absoluteExpiration, slidingExpiration);
}
/// <summary>
/// 移除指定数据缓存
/// </summary>
/// <param name="CacheKey">对象的键值</param>
public static void RemoveCache(string CacheKey)
{
Cache _cache = HttpRuntime.Cache;
_cache.Remove(CacheKey);
}
/// <summary>
/// 移除全部缓存
/// </summary>
public static void RemoveAllCache()
{
Cache _cache = HttpRuntime.Cache;
IDictionaryEnumerator CacheEnum = _cache.GetEnumerator();
while (CacheEnum.MoveNext())
{
_cache.Remove(CacheEnum.Key.ToString());
}
}
/// <summary>
/// 获取所有缓存
/// </summary>
/// <returns></returns>
public static List<DictionaryEntry> GetAllCache()
{
List<DictionaryEntry> list = new List<DictionaryEntry>();
Cache _cache = HttpRuntime.Cache;
IDictionaryEnumerator CacheEnum = _cache.GetEnumerator();
while (CacheEnum.MoveNext())
{
list.Add((DictionaryEntry)CacheEnum.Current);
//cacheItem = Server.HtmlEncode(CacheEnum.Current.ToString());
//Response.Write(cacheItem);
}
return list;
}
}
/// <summary>
/// 时间类
/// </summary>
public static class TimeHelper
{
/// <summary>
///
/// </summary>
private static readonly DateTime UnixEpoch = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);
/// <summary>
/// 将时间转为10位和13位时间戳
/// </summary>
/// <param name="dt">时间</param>
/// <param name="bflag">为真时获取10位时间戳,为假时获取13位时间戳.bool bflag = true</param>
/// <returns></returns>
public static long GetDateTimeToUnixTime(DateTime dt, bool bflag = true)
{
var utcTime = dt.ToUniversalTime();
var elapsedTime = utcTime - UnixEpoch;
if (bflag)
{
return (long)elapsedTime.TotalSeconds;
}
else
{
return (long)elapsedTime.TotalMilliseconds;
}
}
/// <summary>
/// 将10位和13位时间戳转为时间
/// </summary>
/// <param name="unixTime">10位或13位时间戳</param>
/// <returns></returns>
public static DateTime GetUnixTimeToDateTime(string unixTime)
{
DateTime utcTime;
long lTime = long.Parse(unixTime);
if (unixTime.Length == 10)//判断是10位
{
utcTime = UnixEpoch.AddSeconds(lTime);
}
else if (unixTime.Length == 13)//判断是13位
{
utcTime = UnixEpoch.AddMilliseconds(lTime);
}
else
{
utcTime = UnixEpoch;
}
return utcTime.ToLocalTime(); ;
}
}