using System; using System.IO; using System.Security.Cryptography; using System.Text; using System.Data; using System.Data.SqlClient; using System.Threading; using System.Runtime.InteropServices; namespace NetLibrary.Safety { /**//// /// 私钥加密(对称加密) /// public class CryptoPrivate { private SymmetricAlgorithm mobjCryptoService; private string Key; /**//// /// 对称加密类的构造函数 /// 密钥可以通过当前公司进行编码,以其编码为Key。 /// /// 密钥 public CryptoPrivate(string key) { mobjCryptoService = new RijndaelManaged(); //mobjCryptoService. Key=key; } /// /// 获得密钥 /// /// 密钥 private byte[] GetLegalKey() { string sTemp = Key; mobjCryptoService.GenerateKey(); //生成随机密钥 byte[] bytTemp = mobjCryptoService.Key; //取得密钥 int KeyLength = bytTemp.Length; //密钥长度 if (sTemp.Length > KeyLength) //如果<<公司标志>>长度大于密钥长度,返回长度等于密钥长度一样的字符串 sTemp = sTemp.Substring(0, KeyLength); else if (sTemp.Length < KeyLength) //如果<<公司标志>>长度小于密钥长度用空格填充到密钥所需长度 sTemp = sTemp.PadRight(KeyLength, ' '); return ASCIIEncoding.ASCII.GetBytes(sTemp); //返回密钥数组 } /**//// /// 获得初始向量IV /// /// 初试向量IV private byte[] GetLegalIV() { string sTemp = "E3ghj*Ghg7!rNIfb&95GUY86GfghUb#er57HBh(u%g6HJ($jhWk7&!hg4ui%$hjk"; mobjCryptoService.GenerateIV(); byte[] bytTemp = mobjCryptoService.IV; int IVLength = bytTemp.Length; if (sTemp.Length > IVLength) sTemp = sTemp.Substring(0, IVLength); else if (sTemp.Length < IVLength) sTemp = sTemp.PadRight(IVLength, ' '); return ASCIIEncoding.ASCII.GetBytes(sTemp); } /// /// 加密方法 /// /// 待加密的串 /// 经过加密的串 public string Encrypto(string Source) { byte[] bytIn = UTF8Encoding.UTF8.GetBytes(Source); MemoryStream ms = new MemoryStream(); mobjCryptoService.Key = GetLegalKey(); mobjCryptoService.IV = GetLegalIV(); ICryptoTransform encrypto = mobjCryptoService.CreateEncryptor(); CryptoStream cs = new CryptoStream(ms, encrypto, CryptoStreamMode.Write); cs.Write(bytIn, 0, bytIn.Length); cs.FlushFinalBlock(); ms.Close(); byte[] bytOut = ms.ToArray(); return Convert.ToBase64String(bytOut); } /// /// 解密方法 /// /// 待解密的串 /// 经过解密的串 public string Decrypto(string Source) { StreamReader sr; byte[] bytIn = Convert.FromBase64String(Source); MemoryStream ms = new MemoryStream(bytIn, 0, bytIn.Length); mobjCryptoService.Key = GetLegalKey(); mobjCryptoService.IV = GetLegalIV(); ICryptoTransform encrypto = mobjCryptoService.CreateDecryptor(); CryptoStream cs = new CryptoStream(ms, encrypto, CryptoStreamMode.Read); sr = new StreamReader(cs); return sr.ReadToEnd(); } public static string Encryp(string Source) { CryptoPrivate cp = new CryptoPrivate("formmatwizard54073"); return cp.Encrypto(Source); } public static string Decryp(string Source) { CryptoPrivate cp = new CryptoPrivate("formmatwizard54073"); return cp.Decrypto(Source); } } /// /// 公钥加密(不对称加密) /// public class CryptoPublic { RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(); /// /// 返回私钥 /// public string GetPrikey() { string pubkey = rsa.ToXmlString(false); //公钥 return rsa.ToXmlString(true); //返回私钥 } /// /// 返回公钥 /// public string GetPubkey() { string pubkey = rsa.ToXmlString(false); //公钥 return rsa.ToXmlString(false); //返回公钥 } /// /// 加密方法(要加密的字符串byte不能超过117个字节) /// /// 待加密的串 /// 公钥 public string Encrypto(string Source,string pubkey) { byte[] bytIn = UTF8Encoding.UTF8.GetBytes(Source); rsa.FromXmlString(pubkey); byte[] bytOut=rsa.Encrypt(bytIn,false); //加密数据 return Convert.ToBase64String(bytOut); } /// /// 解密方法 /// /// 待解密的串 /// 私钥 public string Decrypto(string Source,string prikey) { byte[] bytIn = Convert.FromBase64String(Source); rsa.FromXmlString(prikey); byte[] d=rsa.Decrypt(bytIn,false); //解密数据 return UTF8Encoding.UTF8.GetString(d); } /// /// 数字签名 /// /// 要签名的字符串 /// 私钥 public string RsaCreateSignature(string Source,string prikey) { rsa.FromXmlString(prikey); RSAPKCS1SignatureFormatter f = new RSAPKCS1SignatureFormatter(rsa); f.SetHashAlgorithm("MD5"); byte[] bytIn = UTF8Encoding.UTF8.GetBytes(Source); MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider(); byte[] result = md5.ComputeHash(bytIn); byte[] b = f.CreateSignature(result); //针对希哈值进行签名 return Convert.ToBase64String(b); //取得签名后希哈值 } /// /// 验证签名 /// /// 要验证的字符串 /// 公钥 /// 签名后的字符串 public bool RsaVerifySignature(string Source,string Hash,string pubkey) { rsa.FromXmlString(pubkey); RSAPKCS1SignatureDeformatter f = new RSAPKCS1SignatureDeformatter(rsa); f.SetHashAlgorithm("MD5"); byte[] key = Convert.FromBase64String(Hash); MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider(); byte[] name = md5.ComputeHash(ASCIIEncoding.ASCII.GetBytes(Source)); if (f.VerifySignature(name,key)==true){return true;} return false; } public static string GetHashPassword(string password) { MD5 md5 = MD5.Create(); byte[] hash = md5.ComputeHash(Encoding.UTF8.GetBytes(password)); StringBuilder sb = new StringBuilder(); for (int i = 0; i < hash.Length; i++) { sb.Append(hash[i].ToString("X2")); } return sb.ToString(); } public static string GetHashPassword(string password,int StartIndex,int Length) { MD5 md5 = MD5.Create(); byte[] hash = md5.ComputeHash(Encoding.UTF8.GetBytes(password)); StringBuilder sb = new StringBuilder(); for (int i = 0; i < hash.Length; i++) { sb.Append(hash[i].ToString("X2")); } return sb.ToString().Substring(StartIndex,Length); } /**//// /// MD5 32位加密 /// /// /// public static string Md5For32(string str) { string cl = str; string pwd = ""; MD5 md5 = MD5.Create();//实例化一个md5对像 // 加密后是一个字节类型的数组,这里要注意编码UTF8/Unicode等的选择  byte[] s = md5.ComputeHash(Encoding.UTF8.GetBytes(cl)); // 通过使用循环,将字节类型的数组转换为字符串,此字符串是常规字符格式化所得 for (int i = 0; i < s.Length; i++) { // 将得到的字符串使用十六进制类型格式。格式后的字符是小写的字母,如果使用大写(X)则格式后的字符是大写字符 pwd = pwd + s[i].ToString("x2"); } return pwd; } } /// /// U盘加密 /// public class UCryptoPublic { [DllImport("HD_Security.dll")] private static extern int HD_VerifyPassword(StringBuilder password, int passwordlen); [DllImport("HD_Security.dll")] private static extern int HD_Initialize(StringBuilder password, int passwordlen); [DllImport("HD_Security.dll")] public static extern int HD_GetDeviceSn(StringBuilder szSn, ref int nSnLen); /// /// 验证密码'成功(9000)打开设备失败(0)认证密码不正确(2)密码长度不正确(3)' /// /// 密码 /// 密码长度 public static int VerifyPassword(StringBuilder password, int passwordlen) { return HD_VerifyPassword(password, passwordlen); } /// /// 初始化密码'成功(9000)打开设备失败(0)初始化设备失败(1)密码长度不正确(3)' /// /// 密码 /// 密码长度 public static int Initialize(StringBuilder password, int passwordlen) { return HD_Initialize(password, passwordlen); } /// /// 返回U盘序列号'成功(9000)打开设备失败(0)获得序列号失败(4)' /// /// 输出序列号 /// 输出序列号长度 public static int GetDeviceSn(out string szSn, out int nSnLen) { StringBuilder sb = new StringBuilder(60); int snlen = 0; int a = HD_GetDeviceSn(sb, ref snlen); szSn = sb.ToString(); nSnLen = snlen; return a; } } }