第四节: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 } View Code1. 在控制臺中進行調用。
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 #endregion3. 下面分享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 : 原創博客請在轉載時保留原文鏈接或在文章開頭加上本人博客地址,否則保留追究法律責任的權利。
轉載于:https://www.cnblogs.com/yaopengfei/p/6986311.html
總結
以上是生活随笔為你收集整理的第四节:IO、序列化和反序列化、加密解密技术的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【码云周刊第 24 期】超实用 Ando
- 下一篇: mysql server-存储引擎