Asp.Net Core 2.0プロジェクト実戦(7)MD 5暗号化、AES&DES対称復号化

38844 ワード

Asp.Net Core 2.0プロジェクト実戦(1)NMVCオープンソースダウンロード
Asp.Net Core 2.0プロジェクト実戦(2)NCVC一つはNet Core 2に基づく.0構築されたロール権限管理開発フレームワーク
Asp.Net Core 2.0プロジェクト実戦(3)NCVCロール権限管理フロントエンドUIプレビューおよびダウンロード
Asp.Net Core 2.0プロジェクト実戦(4)ADO.NETオペレーションデータベースパッケージ、EF Coreオペレーションおよびインスタンス
Asp.Net Core 2.0プロジェクト実戦(5)Memcached踏み込み、EnyimMemcachedCoreに基づいてMemcachedHelperヘルプクラスを整理する.
Asp.Net Core 2.0プロジェクト実戦(6)Redis構成、パッケージヘルプクラスRedisHelperおよび使用例
Asp.Net Core 2.0プロジェクト実戦(7)MD 5暗号化、AES&DES対称復号化
Asp.Net Core 2.0プロジェクト実戦(8)Core下キャッシュ操作、シーケンス化操作、JSON操作等Helper集合クラス
Asp.Net Core 2.0プロジェクト実戦(9)ログ記録、NlogまたはMicrosoftに基づく.Extensions.Loggingの実装および呼び出しの例
Asp.Net Core 2.0プロジェクト実戦(10)クッキー登録認証に基づいてフロント会員、バックグラウンド管理者の同時登録を実現
Asp.Net Core 2.0プロジェクト実戦(11)OnActionExecutionグローバルフィルタに基づき、ページ操作権限フィルタ制御をボタンレベルに
本カタログ1.要約2.MD 5暗号化パッケージ3.AESの暗号化、復号化4.DES暗号化/復号化5.まとめ

1.概要


C#の中でよく使われるいくつかの暗号化と復号方式、例えばmd 5暗号化、RSA暗号化と復号化とDES暗号化など、Asp.Net Core 2.0では、以前よく使われていた暗号化解除アルゴリズムクラスをどのように調整するか、次に私が整理したMD 5暗号化、AES&DES対称復号化、Encrypt&Decrypt復号化の完全な例です.皆さんに参考と助けを提供してほしいです.
  

2.MD 5暗号化パッケージ


MD 5は一般的に暗号化されている.HashPasswordForStoringInConfigFile Net Freamwork 4.5以降はサポートされていませんが、32位または16位以下のいくつかの方法と、異なる書き方を整理し、最後の1つは古いバージョンから移行し、後続の淘汰は不要です.using System; using System.Collections.Generic; using System.Security.Cryptography; using System.Text; namespace NC.Common { /// /// md5 , :MD5Comm.Get32MD5One(xx).ToLower(); 。 /// public class MD5Comm { #region --Expired code-- ///// ///// MD5 ///// //public string Md5(string txt) //{ // //return FormsAuthentication.HashPasswordForStoringInConfigFile(txt, "MD5");// nf4.5 //} //public string Md5Pass(string pwd) //{ // return Md5(pwd + "Jiahao"); //} #endregion /// /// MD5 ( ) 32 /// /// /// /// public static string Get32MD5One(string source) { using (MD5 md5Hash = MD5.Create()) { byte[] data = md5Hash.ComputeHash(Encoding.UTF8.GetBytes(source)); StringBuilder sBuilder = new StringBuilder(); for (int i = 0; i < data.Length; i++) { sBuilder.Append(data[i].ToString("x2")); } string hash = sBuilder.ToString(); return hash.ToUpper(); } } /// /// 16 md5 /// /// /// public static string Get16MD5One(string source) { using (MD5 md5Hash = MD5.Create()) { byte[] data = md5Hash.ComputeHash(Encoding.UTF8.GetBytes(source)); // , 9 25 string sBuilder = BitConverter.ToString(data, 4, 8); //BitConverter , sBuilder = sBuilder.Replace("-", ""); return sBuilder.ToString().ToUpper(); } } //// /// /// /// 32 , 32 9 25 public static string Get32MD5Two(string source) { System.Security.Cryptography.MD5 md5 = new System.Security.Cryptography.MD5CryptoServiceProvider(); // byte[] bytResult = md5.ComputeHash(System.Text.Encoding.Default.GetBytes(source)); // ,32 string strResult = BitConverter.ToString(bytResult); //BitConverter , strResult = strResult.Replace("-", ""); return strResult.ToUpper(); } //// /// /// /// 16 , 32 9 25 public static string Get16MD5Two(string source) { System.Security.Cryptography.MD5 md5 = new System.Security.Cryptography.MD5CryptoServiceProvider(); // byte[] bytResult = md5.ComputeHash(System.Text.Encoding.Default.GetBytes(source)); // , 9 25 string strResult = BitConverter.ToString(bytResult, 4, 8); //BitConverter , strResult = strResult.Replace("-", ""); return strResult.ToUpper(); } /// /// MD5 ,32 , , 。 Get32MD5One /// public static string Get32MD5Old(string str) { byte[] b = Encoding.UTF8.GetBytes(str); b = new MD5CryptoServiceProvider().ComputeHash(b); string ret = ""; for (int i = 0; i < b.Length; i++) ret += b[i].ToString("x").PadLeft(2, '0'); return ret.ToUpper(); } } }

3.AESの暗号化、復号化


MD 5の暗号化パッケージについて説明しましたが、AESの暗号化、復号化を参考にしてみましょう.AESは32ビットスプーンに注意してください.AES暗号解読(高度な暗号化規格は、次世代の暗号化アルゴリズム規格であり、速度が速く、セキュリティレベルが高く、現在のAES規格の1つの実現はRijndaelアルゴリズムである)using System; using System.IO; using System.Text; using System.Security.Cryptography; namespace NC.Common { /// /// /// public class AES { // private static byte[] Keys = { 0x41, 0x72, 0x65, 0x79, 0x6F, 0x75, 0x6D, 0x79, 0x53, 0x6E, 0x6F, 0x77, 0x6D, 0x61, 0x6E, 0x3F }; public static string Encode(string encryptString, string encryptKey) { encryptKey = GetSubString(encryptKey,0, 32, ""); encryptKey = encryptKey.PadRight(32, ' '); RijndaelManaged rijndaelProvider = new RijndaelManaged(); rijndaelProvider.Key = Encoding.UTF8.GetBytes(encryptKey.Substring(0, 32)); rijndaelProvider.IV = Keys; ICryptoTransform rijndaelEncrypt = rijndaelProvider.CreateEncryptor(); byte[] inputData = Encoding.UTF8.GetBytes(encryptString); byte[] encryptedData = rijndaelEncrypt.TransformFinalBlock(inputData, 0, inputData.Length); return Convert.ToBase64String(encryptedData); } public static string Decode(string decryptString, string decryptKey) { try { decryptKey = GetSubString(decryptKey,0, 32, ""); decryptKey = decryptKey.PadRight(32, ' '); RijndaelManaged rijndaelProvider = new RijndaelManaged(); rijndaelProvider.Key = Encoding.UTF8.GetBytes(decryptKey); rijndaelProvider.IV = Keys; ICryptoTransform rijndaelDecrypt = rijndaelProvider.CreateDecryptor(); byte[] inputData = Convert.FromBase64String(decryptString); byte[] decryptedData = rijndaelDecrypt.TransformFinalBlock(inputData, 0, inputData.Length); return Encoding.UTF8.GetString(decryptedData); } catch { return ""; } } public static string GetSubString(string p_SrcString, int p_StartIndex, int p_Length, string p_TailString) { string myResult = p_SrcString; Byte[] bComments = Encoding.UTF8.GetBytes(p_SrcString); foreach (char c in Encoding.UTF8.GetChars(bComments)) { // ( : :\u4e00 - \u9fa5, \u0800 - \u4e00, \xAC00-\xD7A3) if ((c > '\u0800' && c < '\u4e00') || (c > '\xAC00' && c < '\xD7A3')) { //if (System.Text.RegularExpressions.Regex.IsMatch(p_SrcString, "[\u0800-\u4e00]+") || System.Text.RegularExpressions.Regex.IsMatch(p_SrcString, "[\xAC00-\xD7A3]+")) // if (p_StartIndex >= p_SrcString.Length) return ""; else return p_SrcString.Substring(p_StartIndex, ((p_Length + p_StartIndex) > p_SrcString.Length) ? (p_SrcString.Length - p_StartIndex) : p_Length); } } if (p_Length >= 0) { byte[] bsSrcString = Encoding.Default.GetBytes(p_SrcString); // if (bsSrcString.Length > p_StartIndex) { int p_EndIndex = bsSrcString.Length; // if (bsSrcString.Length > (p_StartIndex + p_Length)) { p_EndIndex = p_Length + p_StartIndex; } else { // , p_Length = bsSrcString.Length - p_StartIndex; p_TailString = ""; } int nRealLength = p_Length; int[] anResultFlag = new int[p_Length]; byte[] bsResult = null; int nFlag = 0; for (int i = p_StartIndex; i < p_EndIndex; i++) { if (bsSrcString[i] > 127) { nFlag++; if (nFlag == 3) nFlag = 1; } else nFlag = 0; anResultFlag[i] = nFlag; } if ((bsSrcString[p_EndIndex - 1] > 127) && (anResultFlag[p_Length - 1] == 1)) nRealLength = p_Length + 1; bsResult = new byte[nRealLength]; Array.Copy(bsSrcString, p_StartIndex, bsResult, 0, nRealLength); myResult = Encoding.Default.GetString(bsResult); myResult = myResult + p_TailString; } } return myResult; } } }

4.DES暗号化/復号化


MD 5暗号化、AES暗号化/復号化に加えて、DES暗号化、復号化がよく用いられるが、DESのスプーンが8ビットであることに注意し、ここではおばあちゃんMD 5暗号化と併用されている.using System; using System.Security.Cryptography; using System.Text; namespace NC.Common { /// /// DES / 。 /// public class DESEncrypt { #region -- -- /// /// /// /// /// public static string Encrypt(string Text) { return Encrypt(Text, "ncmvc"); } /// /// /// /// /// /// public static string Encrypt(string Text, string sKey) { try { DESCryptoServiceProvider des = new DESCryptoServiceProvider(); byte[] inputByteArray; inputByteArray = Encoding.Default.GetBytes(Text); string md5SKey = MD5Comm.Get32MD5One(sKey).Substring(0, 8); des.Key = ASCIIEncoding.ASCII.GetBytes(md5SKey); des.IV = ASCIIEncoding.ASCII.GetBytes(md5SKey); System.IO.MemoryStream ms = new System.IO.MemoryStream(); CryptoStream cs = new CryptoStream(ms, des.CreateEncryptor(), CryptoStreamMode.Write); cs.Write(inputByteArray, 0, inputByteArray.Length); cs.FlushFinalBlock(); StringBuilder ret = new StringBuilder(); foreach (byte b in ms.ToArray()) { ret.AppendFormat("{0:X2}", b); } return ret.ToString(); } catch { return "error"; } } #endregion #region -- -- /// /// /// /// /// public static string Decrypt(string Text) { return Decrypt(Text, "ncmvc"); } /// /// /// /// /// /// public static string Decrypt(string Text, string sKey) { try { DESCryptoServiceProvider des = new DESCryptoServiceProvider(); int len; len = Text.Length / 2; byte[] inputByteArray = new byte[len]; int x, i; for (x = 0; x < len; x++) { i = Convert.ToInt32(Text.Substring(x * 2, 2), 16); inputByteArray[x] = (byte)i; } string md5SKey = MD5Comm.Get32MD5One(sKey).Substring(0, 8); des.Key = ASCIIEncoding.ASCII.GetBytes(md5SKey); des.IV = ASCIIEncoding.ASCII.GetBytes(md5SKey); System.IO.MemoryStream ms = new System.IO.MemoryStream(); CryptoStream cs = new CryptoStream(ms, des.CreateDecryptor(), CryptoStreamMode.Write); cs.Write(inputByteArray, 0, inputByteArray.Length); cs.FlushFinalBlock(); return Encoding.Default.GetString(ms.ToArray()); } catch { return "error"; } } #endregion } }

5.まとめ


  Asp.Net Core 2.0の下で密封を解いてクラスを分けてみんなに分かち合って、参考に供します!文章の中に不合理な点があればお知らせください.批判の指摘を歓迎します.以前はプロジェクトでよく使われていたいくつかの暗号化方式はNet Core 2にある.0の下で再整理を経て、良い継続、不合理な方法で廃棄します.関連事例の使用方法については、「Asp.Net Core 2.0プロジェクト実戦」シリーズに引き続き注目してください.