第四节:IO、序列化和反序列化、加密解密技术
一. IO读写
这里主要包括文件的读、写、移动、复制、删除、文件夹的创建、文件夹的删除等常规操作。
注意:这里需要特别注意,对于普通的控制台程序和Web程序,将"相对路径"转换成"绝对路径"的方法不一致。
(1). 在web程序中,可以使用HttpContext.Current.Server.MapPath进行转换,使用方法通过 ~/定位到一级目录,eg:FileOperateHelp.Write_Txt("~/TestFile/mr.txt", "mr")。
(2). 在普通的控制台程序中,HttpContext.Current为空,所以web中的转换方式在控制台中失效,需要借助 "AppDomain.CurrentDomain.BaseDirectory"来获取根目录,该目录直接定位到Debug文件夹,然后利用System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, strPath)传入路径与根目录进行结合,所以普通的控制台程序生成的所有文件均在Debug文件夹下,当然,你也可以直接写绝对路径,比如D:xxx。
下面的方法就是专门处理普通程序和web程序路径转换问题的。
1 /// <summary> 2 /// 10.将相对路径转换成绝对路径 3 /// </summary> 4 /// <param name="strPath">相对路径</param> 5 public static string PathConvert(string strPath) 6 { 7 //web程序使用 8 if (HttpContext.Current != null) 9 { 10 return HttpContext.Current.Server.MapPath(strPath); 11 } 12 else //非web程序引用 13 { 14 strPath = strPath.Replace("/", "\\"); 15 if (strPath.StartsWith("\\")) 16 { 17 strPath = strPath.TrimStart('\\'); 18 } 19 return System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, strPath); 20 } 21 }
下面分享一个FileOperateHelp类,里面包含IO的常规操作。
1 /// <summary> 2 /// 文件操作类 3 /// 特别注意: 4 /// 1.在非web程序中,HttpContext.Current.Server.MapPath失效不好用,需要使用System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, strPath); 5 /// 获取本目录,然后写到根目录里。AppDomain.CurrentDomain.BaseDirectory将获取到Debug文件夹,无法使用相对路径 6 /// 2.在web程序里,可以使用HttpContext.Current.Server.MapPath进行转换,使用方法通过 ~/定位到一级目录,eg:FileOperateHelp.Write_Txt("~/TestFile/mr.txt", "mr"); 7 /// </summary> 8 public static class FileOperateHelp 9 { 10 11 #region 01.写文件(.txt-覆盖) 12 /// <summary> 13 /// 写文件(覆盖源文件内容) 14 /// 文件不存在的话自动创建 15 /// </summary> 16 /// <param name="FileName">文件路径(web里相对路径,控制台在根目录下写)</param> 17 /// <param name="Content">文件内容</param> 18 public static string Write_Txt(string FileName, string Content) 19 { 20 try 21 { 22 Encoding code = Encoding.GetEncoding("gb2312"); 23 string htmlfilename = FileOperateHelp.PathConvert(FileName); 24 //string htmlfilename = HttpContext.Current.Server.MapPath(FileName + ".txt"); //保存文件的路径 25 string str = Content; 26 StreamWriter sw = null; 27 { 28 try 29 { 30 sw = new StreamWriter(htmlfilename, false, code); 31 sw.Write(str); 32 sw.Flush(); 33 } 34 catch { } 35 } 36 sw.Close(); 37 sw.Dispose(); 38 return "ok"; 39 } 40 catch (Exception ex) 41 { 42 43 return ex.Message; 44 } 45 46 } 47 #endregion 48 49 #region 02.读文件(.txt) 50 /// <summary> 51 /// 读文件 52 /// </summary> 53 /// <param name="filename">文件路径(web里相对路径,控制台在根目录下写)</param> 54 /// <returns></returns> 55 public static string Read_Txt(string filename) 56 { 57 58 try 59 { 60 Encoding code = Encoding.GetEncoding("gb2312"); 61 string temp = FileOperateHelp.PathConvert(filename); 62 // string temp = HttpContext.Current.Server.MapPath(filename + ".txt"); 63 string str = ""; 64 if (File.Exists(temp)) 65 { 66 StreamReader sr = null; 67 try 68 { 69 sr = new StreamReader(temp, code); 70 str = sr.ReadToEnd(); // 读取文件 71 } 72 catch { } 73 sr.Close(); 74 sr.Dispose(); 75 } 76 else 77 { 78 str = ""; 79 } 80 return str; 81 } 82 catch (Exception ex) 83 { 84 85 return ex.Message; 86 } 87 } 88 #endregion 89 90 #region 03.写文件(.txt-添加) 91 /// <summary> 92 /// 写文件 93 /// </summary> 94 /// <param name="FileName">文件路径(web里相对路径,控制台在根目录下写)</param> 95 /// <param name="Strings">文件内容</param> 96 public static string WriteFile(string FileName, string Strings) 97 { 98 try 99 { 100 string Path = FileOperateHelp.PathConvert(FileName); 101 102 if (!System.IO.File.Exists(Path)) 103 { 104 System.IO.FileStream f = System.IO.File.Create(Path); 105 f.Close(); 106 f.Dispose(); 107 } 108 System.IO.StreamWriter f2 = new System.IO.StreamWriter(Path, true, System.Text.Encoding.UTF8); 109 f2.WriteLine(Strings); 110 f2.Close(); 111 f2.Dispose(); 112 return "ok"; 113 } 114 catch (Exception ex) 115 { 116 117 return ex.Message; 118 } 119 } 120 #endregion 121 122 #region 04.读文件(.txt) 123 /// <summary> 124 /// 读文件 125 /// </summary> 126 /// <param name="FileName">文件路径(web里相对路径,控制台在根目录下写)</param> 127 /// <returns></returns> 128 public static string ReadFile(string FileName) 129 { 130 try 131 { 132 string Path = FileOperateHelp.PathConvert(FileName); 133 string s = ""; 134 if (!System.IO.File.Exists(Path)) 135 s = "不存在相应的目录"; 136 else 137 { 138 StreamReader f2 = new StreamReader(Path, System.Text.Encoding.GetEncoding("gb2312")); 139 s = f2.ReadToEnd(); 140 f2.Close(); 141 f2.Dispose(); 142 } 143 return s; 144 } 145 catch (Exception ex) 146 { 147 return ex.Message; 148 } 149 } 150 #endregion 151 152 #region 05.删除文件 153 /// <summary> 154 /// 删除文件 155 /// </summary> 156 /// <param name="Path">文件路径(web里相对路径,控制台在根目录下写)</param> 157 public static string FileDel(string Path) 158 { 159 try 160 { 161 string temp = FileOperateHelp.PathConvert(Path); 162 File.Delete(temp); 163 return "ok"; 164 } 165 catch (Exception ex) 166 { 167 return ex.Message; 168 } 169 } 170 #endregion 171 172 #region 06.移动文件 173 /// <summary> 174 /// 移动文件 175 /// </summary> 176 /// <param name="OrignFile">原始路径(web里相对路径,控制台在根目录下写)</param> 177 /// <param name="NewFile">新路径,需要写上路径下的文件名,不能单写路径(web里相对路径,控制台在根目录下写)</param> 178 public static string FileMove(string OrignFile, string NewFile) 179 { 180 try 181 { 182 OrignFile = FileOperateHelp.PathConvert(OrignFile); 183 NewFile = FileOperateHelp.PathConvert(NewFile); 184 File.Move(OrignFile, NewFile); 185 return "ok"; 186 } 187 catch (Exception ex) 188 { 189 return ex.Message; 190 } 191 } 192 #endregion 193 194 #region 07.复制文件 195 /// <summary> 196 /// 复制文件 197 /// </summary> 198 /// <param name="OrignFile">原始文件(web里相对路径,控制台在根目录下写)</param> 199 /// <param name="NewFile">新文件路径(web里相对路径,控制台在根目录下写)</param> 200 public static string FileCopy(string OrignFile, string NewFile) 201 { 202 try 203 { 204 OrignFile = FileOperateHelp.PathConvert(OrignFile); 205 NewFile = FileOperateHelp.PathConvert(NewFile); 206 File.Copy(OrignFile, NewFile, true); 207 return "ok"; 208 } 209 catch (Exception ex) 210 { 211 return ex.Message; 212 } 213 } 214 #endregion 215 216 #region 08.创建文件夹 217 /// <summary> 218 /// 创建文件夹 219 /// </summary> 220 /// <param name="Path">相对路径(web里相对路径,控制台在根目录下写)</param> 221 public static string FolderCreate(string Path) 222 { 223 try 224 { 225 Path = FileOperateHelp.PathConvert(Path); 226 // 判断目标目录是否存在如果不存在则新建之 227 if (!Directory.Exists(Path)) 228 { 229 Directory.CreateDirectory(Path); 230 } 231 return "ok"; 232 } 233 catch (Exception ex) 234 { 235 return ex.Message; 236 } 237 } 238 #endregion 239 240 #region 09.递归删除文件夹目录及文件 241 /// <summary> 242 /// 递归删除文件夹目录及文件 243 /// </summary> 244 /// <param name="dir">相对路径(web里相对路径,控制台在根目录下写) 截止到哪删除到哪,eg:/a/ 连a也删除</param> 245 /// <returns></returns> 246 public static string DeleteFolder(string dir) 247 { 248 249 try 250 { 251 string adir = FileOperateHelp.PathConvert(dir); 252 if (Directory.Exists(adir)) //如果存在这个文件夹删除之 253 { 254 foreach (string d in Directory.GetFileSystemEntries(adir)) 255 { 256 if (File.Exists(d)) 257 File.Delete(d); //直接删除其中的文件 258 else 259 DeleteFolder(d); //递归删除子文件夹 260 } 261 Directory.Delete(adir, true); //删除已空文件夹 262 } 263 return "ok"; 264 } 265 catch (Exception ex) 266 { 267 return ex.Message; 268 } 269 } 270 271 #endregion 272 273 #region 10.将相对路径转换成绝对路径 274 /// <summary> 275 /// 10.将相对路径转换成绝对路径 276 /// </summary> 277 /// <param name="strPath">相对路径</param> 278 public static string PathConvert(string strPath) 279 { 280 //web程序使用 281 if (HttpContext.Current != null) 282 { 283 return HttpContext.Current.Server.MapPath(strPath); 284 } 285 else //非web程序引用 286 { 287 strPath = strPath.Replace("/", "\\"); 288 if (strPath.StartsWith("\\")) 289 { 290 strPath = strPath.TrimStart('\\'); 291 } 292 return System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, strPath); 293 } 294 } 295 #endregion 296 297 298 299 }
1. 在控制台中进行调用。
1 //1.写文件测试(覆盖写入) 2 FileOperateHelp.Write_Txt("TestFile/mr.txt", "mr123"); 3 FileOperateHelp.Write_Txt("TestFile/mr2.txt", "mr123"); 4 //2.读文件测试 5 string msg1 = FileOperateHelp.Read_Txt("TestFile/mr.txt"); 6 7 //3.写文件测试(追加写入) 8 FileOperateHelp.WriteFile("TestFile/mr.txt", "123456"); 9 //4.读文件测试 10 string msg2 = FileOperateHelp.ReadFile("TestFile/mr.txt"); 11 12 //5.删除文件测试 13 FileOperateHelp.FileDel("TestFile/mr2.txt"); 14 15 //6.移动文件测试 16 FileOperateHelp.FileMove("TestFile/mr.txt", "TestFile/TEST/mr移动.txt"); 17 18 //7.复制文件测试 19 FileOperateHelp.FileCopy("TestFile/mr3.txt", "TestFile/TEST/mr3Copy.txt"); 20 21 //8.创建文件夹 22 FileOperateHelp.FolderCreate("TestFile/TEST2"); 23 24 //9.递归删除文件夹(删除a文件夹) 25 FileOperateHelp.DeleteFolder("TestFile/TestDel/a/");
2. 在Web程序中进行调用
1 public void Index() 2 { 3 //1.写文件测试(覆盖写入) 4 FileOperateHelp.Write_Txt("~/TestFile/mr.txt", "mr123"); 5 FileOperateHelp.Write_Txt("~/TestFile/mr2.txt", "mr123"); 6 //2.读文件测试 7 string msg1 = FileOperateHelp.Read_Txt("~/TestFile/mr.txt"); 8 9 //3.写文件测试(追加写入) 10 FileOperateHelp.WriteFile("~/TestFile/mr.txt", "123456"); 11 //4.读文件测试 12 string msg2 = FileOperateHelp.ReadFile("~/TestFile/mr.txt"); 13 14 //5.删除文件测试 15 FileOperateHelp.FileDel("~/TestFile/mr2.txt"); 16 17 //6.移动文件测试 18 FileOperateHelp.FileMove("~/TestFile/mr.txt", "~/TestFile/TEST/mr移动.txt"); 19 20 //7.复制文件测试 21 FileOperateHelp.FileCopy("~/TestFile/mr3.txt", "~/TestFile/TEST/mr3Copy.txt"); 22 23 //8.创建文件夹 24 FileOperateHelp.FolderCreate("~/TestFile/TEST2"); 25 26 //9.递归删除文件夹(删除a文件夹) 27 FileOperateHelp.DeleteFolder("~/TestFile/TestDel/a/"); 28 29 }
二. 序列化和反序列化
1. 在.Net中,序列化和反序列化主要有两种 :
方案一:利用JavaScriptSerializer对象实现,需要添加System.Web.Extensions程序集的引用。
方案二:利用程序集Newtonsoft.Json.dll来实现。
注意:如果要把某个类序列化,需要在该类上面加一个 [Serializable]属性。
下面分享一个JsonHelp类,该类主要提供两种序列化和反序列化的方法,代码如下:
1 public class JsonHelp 2 { 3 #region 01-将JSON转换成JSON字符串 4 /// <summary> 5 /// 将JSON转换成JSON字符串 6 /// </summary> 7 /// <typeparam name="T"></typeparam> 8 /// <param name="obj"></param> 9 /// <returns></returns> 10 public static string ObjectToString<T>(T obj) 11 { 12 JavaScriptSerializer jss = new JavaScriptSerializer(); 13 return jss.Serialize(obj); 14 } 15 #endregion 16 17 #region 02-将字符串转换成JSON对象 18 /// <summary> 19 /// 将字符串转换成JSON对象 20 /// </summary> 21 /// <typeparam name="T"></typeparam> 22 /// <param name="content"></param> 23 /// <returns></returns> 24 public static T StringToObject<T>(string content) 25 { 26 JavaScriptSerializer jss = new JavaScriptSerializer(); 27 return jss.Deserialize<T>(content); 28 } 29 #endregion 30 31 #region 03-将JSON转换成JSON字符串 32 /// <summary> 33 ///将JSON转换成JSON字符串 34 /// </summary> 35 /// <typeparam name="T"></typeparam> 36 /// <param name="obj"></param> 37 /// <returns></returns> 38 public static string ToJsonString<T>(T obj) 39 { 40 return JsonConvert.SerializeObject(obj); 41 } 42 #endregion 43 44 #region 04-将字符串转换成JSON对象 45 /// <summary> 46 /// 将字符串转换成JSON对象 47 /// </summary> 48 /// <typeparam name="T"></typeparam> 49 /// <param name="content"></param> 50 /// <returns></returns> 51 public static T ToObject<T>(string content) 52 { 53 return JsonConvert.DeserializeObject<T>(content); 54 } 55 #endregion 56 }
2. 代码调用:
1 //1. 将JSON对象转换成JSON字符串 2 Console.WriteLine("-------------------------------------1. 将JSON转换成JSON字符串------------------------------------------"); 3 var myObj = new 4 { 5 id = "1", 6 name = "ypf", 7 myList = studentList, 8 myList2 = studentList.Where(u => u.Age > 27).Select(u => new 9 { 10 t1 = u.Age, 11 t2 = u.ClassId 12 }).ToList() 13 14 }; 15 //1.1 方式一 16 string myString1 = JsonHelp.ObjectToString(myObj); 17 //1.2 方式二 18 string myString2 = JsonHelp.ToJsonString(myObj); 19 string myString3 = JsonHelp.ToJsonString(studentList); 20 Console.WriteLine(myString1); 21 Console.WriteLine(myString2); 22 //2. 将JSON字符串转换成JSON对象(必须显式的声明对象) 23 List<Student> myList = JsonHelp.StringToObject<List<Student>>(myString3); 24 Console.WriteLine(myList);
三. 加密和解密
这里介绍三种加密方式,分别是:
(1). MD5不可逆加密:加密后可以是16位,也可以是32位,任何语言的MD5加密后的结果都相同。
(2). DES可逆对称加密:
优点:对称加密算法的优点是速度快。
缺点:密钥管理不方便,要求共享密钥。
特点:不同写法对应的加密值不同。
(3). RSA可逆非对称加密:
特点:可逆非对称加密,需要两个Key,公钥和私钥,每次产生的公钥和私钥不一致,加密的结果就不一致
好处:非对称加密算法的优点是密钥管理很方便,缺点是速度慢。
特性(重点!!!):需要通过代码来生成一对公钥(加密key)和私钥(解密key),公钥私钥只与是否公开有关。
A. 如果公开公钥(加密key):只有我接受加密信息才有用,因为只有我有私钥(解密key),能解密。
B. 如果公开私钥(解密key):用于签名,表示加密数据一定是我发的,因为只有公钥(加密key)。
1. 下面分享两种MD5实现的算法
/// <summary> /// MD5加密,和动网上的16/32位MD5加密结果相同, /// 使用的UTF8编码 /// </summary> /// <param name="strSource">待加密字串</param> /// <param name="length">16或32值之一,其它则采用.net默认MD5加密算法</param> /// <returns>加密后的字串</returns> public static string Encrypt(string source, int length = 32)//默认参数 { HashAlgorithm provider = CryptoConfig.CreateFromName("MD5") as HashAlgorithm; if (string.IsNullOrEmpty(source)) return string.Empty; byte[] bytes = Encoding.UTF8.GetBytes(source);// Encoding.ASCII.GetBytes(source); byte[] hashValue = provider.ComputeHash(bytes); StringBuilder sb = new StringBuilder(); switch (length) { case 16://16位密文是32位密文的9到24位字符 for (int i = 4; i < 12; i++) sb.Append(hashValue[i].ToString("x2")); break; case 32: for (int i = 0; i < 16; i++) { sb.Append(hashValue[i].ToString("x2")); } break; default: for (int i = 0; i < hashValue.Length; i++) { sb.Append(hashValue[i].ToString("x2")); } break; } return sb.ToString(); } /// <summary> /// MD5加密 /// </summary> /// <param name="str">要加密的字符串</param> /// <returns>加密后的字符串</returns> public static string Md5(string str) { var md5 = MD5.Create(); // 计算字符串的散列值 var bytes = md5.ComputeHash(Encoding.UTF8.GetBytes(str)); var sbd = new StringBuilder(); foreach (var item in bytes) { sbd.Append(item.ToString("x2")); } return sbd.ToString(); }
2. 下面分享两种DES实现的算法
1 public class DesEncrypt 2 { 3 //8位长度 4 private static string KEY = "ypf12345"; 5 private static byte[] rgbKey = ASCIIEncoding.ASCII.GetBytes(KEY.Substring(0, 8)); 6 private static byte[] rgbIV = ASCIIEncoding.ASCII.GetBytes(KEY.Insert(0, "w").Substring(0, 8)); 7 8 #region 01-DES加密 9 /// <summary> 10 /// DES 加密 11 /// </summary> 12 /// <param name="strValue">需要加密的字符串</param> 13 /// <returns></returns> 14 public static string Encrypt(string strValue) 15 { 16 DESCryptoServiceProvider dsp = new DESCryptoServiceProvider(); 17 using (MemoryStream memStream = new MemoryStream()) 18 { 19 CryptoStream crypStream = new CryptoStream(memStream, dsp.CreateEncryptor(rgbKey, rgbIV), CryptoStreamMode.Write); 20 StreamWriter sWriter = new StreamWriter(crypStream); 21 sWriter.Write(strValue); 22 sWriter.Flush(); 23 crypStream.FlushFinalBlock(); 24 memStream.Flush(); 25 return Convert.ToBase64String(memStream.GetBuffer(), 0, (int)memStream.Length); 26 } 27 } 28 #endregion 29 30 #region 02-DES解密 31 /// <summary> 32 /// DES解密 33 /// </summary> 34 /// <param name="EncValue">加密后的结果</param> 35 /// <returns></returns> 36 public static string Decrypt(string EncValue) 37 { 38 DESCryptoServiceProvider dsp = new DESCryptoServiceProvider(); 39 byte[] buffer = Convert.FromBase64String(EncValue); 40 41 using (MemoryStream memStream = new MemoryStream()) 42 { 43 CryptoStream crypStream = new CryptoStream(memStream, dsp.CreateDecryptor(rgbKey, rgbIV), CryptoStreamMode.Write); 44 crypStream.Write(buffer, 0, buffer.Length); 45 crypStream.FlushFinalBlock(); 46 return ASCIIEncoding.UTF8.GetString(memStream.ToArray()); 47 } 48 } 49 #endregion 50 }
1 #region 3.DES加密一个字符串(可逆,非固定) 2 /// <summary> 3 /// 加密一个字符串(可逆,非固定) 4 /// </summary> 5 /// <param name="str">要加密的字符串</param> 6 /// <param name="key">加密密钥</param> 7 /// <returns>加密后的字符串</returns> 8 public static string EncryptStr(string str, string key = "iceStone") 9 { 10 var des = DES.Create(); 11 // var timestamp = DateTime.Now.ToString("HHmmssfff"); 12 var inputBytes = Encoding.UTF8.GetBytes(MixUp(str)); 13 var keyBytes = Encoding.UTF8.GetBytes(key); 14 SHA1 ha = new SHA1Managed(); 15 var hb = ha.ComputeHash(keyBytes); 16 var sKey = new byte[8]; 17 var sIv = new byte[8]; 18 for (var i = 0; i < 8; i++) 19 sKey[i] = hb[i]; 20 for (var i = 8; i < 16; i++) 21 sIv[i - 8] = hb[i]; 22 des.Key = sKey; 23 des.IV = sIv; 24 using (var ms = new MemoryStream()) 25 { 26 using (var cs = new CryptoStream(ms, des.CreateEncryptor(), CryptoStreamMode.Write)) 27 { 28 cs.Write(inputBytes, 0, inputBytes.Length); 29 cs.FlushFinalBlock(); 30 var ret = new StringBuilder(); 31 foreach (var b in ms.ToArray()) 32 { 33 ret.AppendFormat("{0:X2}", b); 34 } 35 36 return ret.ToString(); 37 } 38 } 39 } 40 #endregion 41 42 #region 4.DES解密一个字符串 43 /// <summary> 44 /// 解密一个字符串 45 /// <param name="str">要解密的字符串</param> 46 /// <param name="key">加密密钥</param> 47 /// <returns>解密后的字符串</returns> 48 public static string DecryptStr(string str, string key = "iceStone") 49 { 50 var des = DES.Create(); 51 var inputBytes = new byte[str.Length / 2]; 52 for (var x = 0; x < str.Length / 2; x++) 53 { 54 inputBytes[x] = (byte)System.Convert.ToInt32(str.Substring(x * 2, 2), 16); 55 } 56 var keyByteArray = Encoding.UTF8.GetBytes(key); 57 var ha = new SHA1Managed(); 58 var hb = ha.ComputeHash(keyByteArray); 59 var sKey = new byte[8]; 60 var sIv = new byte[8]; 61 for (var i = 0; i < 8; i++) 62 sKey[i] = hb[i]; 63 for (var i = 8; i < 16; i++) 64 sIv[i - 8] = hb[i]; 65 des.Key = sKey; 66 des.IV = sIv; 67 using (var ms = new MemoryStream()) 68 { 69 using (var cs = new CryptoStream(ms, des.CreateDecryptor(), CryptoStreamMode.Write)) 70 { 71 cs.Write(inputBytes, 0, inputBytes.Length); 72 cs.FlushFinalBlock(); 73 return ClearUp(Encoding.UTF8.GetString(ms.ToArray())); 74 } 75 } 76 } 77 #endregion
3. 下面分享RSA的代码
1 public class RsaEncrypt 2 { 3 4 #region 01-生成公钥和私钥 5 /// <summary> 6 /// 生成公钥和私钥 7 /// </summary> 8 /// <returns></returns> 9 public static KeyValuePair<string, string> GetKeyPair() 10 { 11 RSACryptoServiceProvider RSA = new RSACryptoServiceProvider(); 12 string publicKey = RSA.ToXmlString(false); 13 string privateKey = RSA.ToXmlString(true); 14 return new KeyValuePair<string, string>(publicKey, privateKey); 15 } 16 #endregion 17 18 #region 02-加密(传入内容和公钥) 19 /// <summary> 20 /// 加密:内容+公钥,事先需要生成公钥和私钥 21 /// </summary> 22 /// <param name="content">加密内容</param> 23 /// <param name="publicKey">公钥</param> 24 /// <returns></returns> 25 public static string Encrypt(string content, string publicKey) 26 { 27 RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(); 28 rsa.FromXmlString(publicKey); 29 UnicodeEncoding ByteConverter = new UnicodeEncoding(); 30 byte[] DataToEncrypt = ByteConverter.GetBytes(content); 31 byte[] resultBytes = rsa.Encrypt(DataToEncrypt, false); 32 return Convert.ToBase64String(resultBytes); 33 } 34 #endregion 35 36 #region 03-加密(并返回公钥和私钥) 37 /// <summary> 38 /// 加密(并返回公钥和私钥),在该方法中生成了公钥和私钥,并返回 39 /// </summary> 40 /// <param name="content">加密内容</param> 41 /// <param name="publicKey">返还公钥</param> 42 /// <param name="privateKey">返回密钥</param> 43 /// <returns>加密后结果</returns> 44 public static string Encrypt(string content, out string publicKey, out string privateKey) 45 { 46 RSACryptoServiceProvider rsaProvider = new RSACryptoServiceProvider(); 47 publicKey = rsaProvider.ToXmlString(false); 48 privateKey = rsaProvider.ToXmlString(true); 49 UnicodeEncoding ByteConverter = new UnicodeEncoding(); 50 byte[] DataToEncrypt = ByteConverter.GetBytes(content); 51 byte[] resultBytes = rsaProvider.Encrypt(DataToEncrypt, false); 52 return Convert.ToBase64String(resultBytes); 53 } 54 #endregion 55 56 #region 04-解密(内容+私钥) 57 /// <summary> 58 /// 解密-内容+私钥 59 /// </summary> 60 /// <param name="content"></param> 61 /// <param name="privateKey"></param> 62 /// <returns></returns> 63 public static string Decrypt(string content, string privateKey) 64 { 65 byte[] dataToDecrypt = Convert.FromBase64String(content); 66 RSACryptoServiceProvider RSA = new RSACryptoServiceProvider(); 67 RSA.FromXmlString(privateKey); 68 byte[] resultBytes = RSA.Decrypt(dataToDecrypt, false); 69 UnicodeEncoding ByteConverter = new UnicodeEncoding(); 70 return ByteConverter.GetString(resultBytes); 71 } 72 #endregion 73 }
4. 分享加密算法的调用代码
1 { 2 Console.WriteLine("-------------------------------------三.3种加密方式------------------------------------------"); 3 { 4 Console.WriteLine("----------------------1.MD5加密(加密后结果可以是32位,也可以是16位,主流都采用32位)-----------------------------"); 5 //1.MD5加密(加密后结果可以是32位,也可以是16位,主流都采用32位) 6 //1.1 写法一 7 string msg1 = "mr1"; 8 string result1 = MD5Encrypt.Encrypt(msg1); 9 string result2 = MD5Encrypt.Encrypt(msg1, 16); 10 Console.WriteLine(result1); 11 Console.WriteLine(result2); 12 //1.2 写法二 .Net 高度封装的MD5方法 13 string result3 = SecurityHelp.Md5(msg1); 14 Console.WriteLine(result3); 15 } 16 { 17 Console.WriteLine("----------------------2.对称可逆加密算法DES-----------------------------"); 18 //2.对称加密算法DES 19 string msg1 = "mr1"; 20 //2.1 写法一:密钥写在DesEncrypt类中了,密钥为ypf12345 21 string result1 = DesEncrypt.Encrypt(msg1); 22 string result2 = DesEncrypt.Decrypt(result1); 23 Console.WriteLine(result1); 24 Console.WriteLine(result2); 25 //2.2 写法二 26 string result3 = SecurityHelp.EncryptStr(msg1, "ypf12345"); 27 string result4 = SecurityHelp.DecryptStr(result3, "ypf12345"); 28 Console.WriteLine(result3); 29 Console.WriteLine(result4); 30 } 31 { 32 Console.WriteLine("----------------------3.非对称可逆加密算法RSA-----------------------------"); 33 //方式一:先生成公钥和私钥,然后加密和解密 34 //KeyValuePair是一个键值对, myKey.Key 代表的公钥;myKey.Value 代表的私钥 35 KeyValuePair<string, string> myKey = RsaEncrypt.GetKeyPair(); 36 string msg1 = "mr1"; 37 //加密 38 string result1 = RsaEncrypt.Encrypt(msg1, myKey.Key); 39 //解密 40 string result2 = RsaEncrypt.Decrypt(result1, myKey.Value); 41 Console.WriteLine(result1); 42 Console.WriteLine(result2); 43 //方式二:直接加密,并通过out参数的形式返回公钥和私钥 44 string publicKey = ""; 45 string privateKey = ""; 46 //加密 47 string result3 = RsaEncrypt.Encrypt(msg1, out publicKey, out privateKey); 48 //解密 49 string result4 = RsaEncrypt.Decrypt(result3, privateKey); 50 Console.WriteLine(result3); 51 Console.WriteLine(result4); 52 } 53 54 }
运行结果:
!
- 作 者 : Yaopengfei(姚鹏飞)
- 博客地址 : http://www.cnblogs.com/yaopengfei/
- 声 明1 : 本人才疏学浅,用郭德纲的话说“我是一个小学生”,如有错误,欢迎讨论,请勿谩骂^_^。
- 声 明2 : 原创博客请在转载时保留原文链接或在文章开头加上本人博客地址,否则保留追究法律责任的权利。