この記事は主に .NET MD5 の暗号化と復号化コードを詳細に分析します。興味のある方は参考にしてください。
大容量の情報にデジタル署名を使用します。ソフトウェアが秘密キーに署名する前に、秘密キーは機密形式に「圧縮」されます (つまり、任意の長さのバイト文字列が特定の長さの大きな整数に変換されます)。 MD2、MD4、MD5 のいずれであっても、ランダムな長さの情報を取得し、128 ビットのメッセージ ダイジェストを生成する必要があります。これらのアルゴリズムの構造は多かれ少なかれ似ていますが、MD2 の設計は MD4 および MD5 とはまったく異なります。これは、MD4 と MD5 が 32 ビット コンピュータ用に設計されているのに対し、MD2 は 8 ビット マシン用に設計および最適化されているためです。これら 3 つのアルゴリズムの説明と C 言語ソース コードは、インターネット RFC 1321 に詳しく説明されています。これは、1992 年 8 月に Ronald L. Rivest によって IETF に提出された最も権威のある文書です。
コード:string JiaMi = Md5Encrypt(LoginPwd); string JieMi = Md5Decrypt(JiaMi); #region MD5加密 /// <summary> /// MD5加密 /// </summary> /// <param name="strSource">需要加密的字符串</param> /// <returns>MD5加密后的字符串</returns> public static string Md5Encrypt(string strSource) { //把字符串放到byte数组中 byte[] bytIn = System.Text.Encoding.Default.GetBytes(strSource); //建立加密对象的密钥和偏移量 byte[] iv = { 102, 16, 93, 156, 78, 4, 218, 32 };//定义偏移量 byte[] key = { 55, 103, 246, 79, 36, 99, 167, 3 };//定义密钥 //实例DES加密类 DESCryptoServiceProvider mobjCryptoService = new DESCryptoServiceProvider(); mobjCryptoService.Key = iv; mobjCryptoService.IV = key; ICryptoTransform encrypto = mobjCryptoService.CreateEncryptor(); //实例MemoryStream流加密密文件 System.IO.MemoryStream ms = new System.IO.MemoryStream(); CryptoStream cs = new CryptoStream(ms, encrypto, CryptoStreamMode.Write); cs.Write(bytIn, 0, bytIn.Length); cs.FlushFinalBlock(); return System.Convert.ToBase64String(ms.ToArray()); } #endregion #region MD5解密 /// <summary> /// MD5解密 /// </summary> /// <param name="Source">需要解密的字符串</param> /// <returns>MD5解密后的字符串</returns> public static string Md5Decrypt(string Source) { //将解密字符串转换成字节数组 byte[] bytIn = System.Convert.FromBase64String(Source); //给出解密的密钥和偏移量,密钥和偏移量必须与加密时的密钥和偏移量相同 byte[] iv = { 102, 16, 93, 156, 78, 4, 218, 32 };//定义偏移量 byte[] key = { 55, 103, 246, 79, 36, 99, 167, 3 };//定义密钥 DESCryptoServiceProvider mobjCryptoService = new DESCryptoServiceProvider(); mobjCryptoService.Key = iv; mobjCryptoService.IV = key; //实例流进行解密 System.IO.MemoryStream ms = new System.IO.MemoryStream(bytIn, 0, bytIn.Length); ICryptoTransform encrypto = mobjCryptoService.CreateDecryptor(); CryptoStream cs = new CryptoStream(ms, encrypto, CryptoStreamMode.Read); StreamReader strd = new StreamReader(cs, Encoding.Default); return strd.ReadToEnd(); } #endregion
MD5暗号化方法:
MD5暗号化は、単に平文の一部を使用して、特定の計算方法を通じて暗号文を見つけることを意味します。例: 平文は次のとおりです: abcdefg 一連の操作により、暗号文 7ac66c0f148de9519b8bd264312c4d64
が得られます。これには 2 つの特徴があります: 1. 衝突なし、2. 不可逆。 衝突なしとは:7ac66c0f148de9519b8bd264312c4d64 この暗号文は、この平文の abcdefg からのみ取得できます。また、暗号化後の他の平文の値は 7ac66c0f148de9519b8bd に等しくなりません。 264312c4 d64、つまり、ありませんこれら 2 つ 平文を暗号化すると、同じ暗号文が得られます。
不可逆とは、平文を暗号化して暗号文を取得するが、暗号文を介して平文を取得することはできない。つまり、平文の adcdefg が暗号化できることがわかっている場合は 7ac66c0f148de9519b8bd264312c4d64 を取得できますが、特定のテキストが暗号化されていることがわかっている場合は 7ac66c0f148de9519b8bd264312c4d64 を取得できますが、7ac66c0f148de95 は計算できません。 19b8bd264312c4 このテキスト d64 を暗号化したのは誰ですか?
たとえば、ユーザーが設定したパスワードは abcdefg で、abcdefg が暗号化された後に取得された値 7ac66c0f148de9519b8bd264312c4d64 を保存します。その後、ユーザーが再度ログインするときにパスワード abcdefg を入力するかどうかを比較するにはどうすればよいですか。二つは等しいですか? 暗号化された値を暗号化前の値に変換することはできないため、通常のアプローチは、ユーザーが再度ログインするときに入力したパスワードを再暗号化し、データベースに保存されている値と比較することです。入力されたパスワードが正しいことを意味します。 引用する必要がありますusing System.Web.Security;
FormsAuthentication.HashPasswordForStoringInConfigFile(str, "MD5").ToLower();
上記がこの記事の全内容であると幸いです。皆様の学習にお役に立てれば幸いです。また、PHP 中国語 Web サイトをサポートしていただければ幸いです。
.NET MD5 暗号化および復号化コード分析に関連するその他の記事については、PHP 中国語 Web サイトに注目してください。