Home  >  Article  >  Backend Development  >  .NET MD5 encryption and decryption code analysis

.NET MD5 encryption and decryption code analysis

高洛峰
高洛峰Original
2017-02-10 17:27:552300browse

This article mainly analyzes the .NET MD5 encryption and decryption code in detail, which has certain reference value. Interested friends can refer to

MD5 Introduction:

It allows large-capacity information to be "compressed" into a confidential format (that is, converting a byte string of any length into a large integer of a certain length) before signing the private key with digital signature software. Whether it is MD2, MD4 or MD5, they all need to obtain a random length of information and generate a 128-bit message digest. Although the structures of these algorithms are more or less similar, the design of MD2 is completely different from MD4 and MD5. That is because MD2 is designed and optimized for 8-bit machines, while MD4 and MD5 are designed for 32-bit computers. The descriptions and C language source code of these three algorithms are described in detail in Internet RFCs 1321, which is the most authoritative document submitted to the IETF by Ronald L. Rivest in August 1992.

Code:

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

Another MD5 encryption method:

MD5 encryption simple That is to say, a piece of plain text is used to calculate the cipher text through a certain operation method. For example: the plaintext is: abcdefg Through a series of operations, the ciphertext 7ac66c0f148de9519b8bd264312c4d64

is obtained. It has two characteristics: 1. No collision, 2. Irreversible.

No collision means:

7ac66c0f148de9519b8bd264312c4d64 This ciphertext can only be obtained from the abcdefg plaintext, except for other plaintexts After encryption, its value will never be equal to 7ac66c0f148de9519b8bd264312c4d64, which means that no two plaintexts will get the same ciphertext after encryption.

Irreversible means:

The plaintext is encrypted to obtain the ciphertext, but the plaintext cannot be obtained through the ciphertext. That is to say, when we know that the plain text adcdefg can be encrypted, we can get 7ac66c0f148de9519b8bd264312c4d64, but if we know that a certain text is encrypted, we can get 7ac66c0f148de9519b8bd264312c4d64, but we cannot calculate 7ac66c0f148de9519b8bd264312c4 Who encrypted this text d64?

For example, the password set by the user is abcdefg, and when storing, we store the value 7ac66c0f148de9519b8bd264312c4d64 obtained after abcdefg is encrypted. Then when the user logs in again, he will enter the password abcdefg. How do we compare whether the two are equal?

We cannot convert the encrypted value to the pre-encrypted value, so our usual approach is to re-encrypt the password entered when the user logs in again and compare it with the value stored in the database. If they are equal, The password entered is correct.

Need to quoteusing System.Web.Security;

FormsAuthentication.HashPasswordForStoringInConfigFile(str, "MD5").ToLower();

The above is the entire content of this article. I hope it will be helpful to everyone's learning. I also hope that everyone will support the PHP Chinese website.

For more articles related to .NET MD5 encryption and decryption code analysis, please pay attention to the PHP Chinese website!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn