C#MD 5サマリアルゴリズム、ハッシュアルゴリズム

7875 ワード

MD 5は、情報伝送が完全に一貫していることを保証するために、Message-Digest Algorithm 5(情報要約アルゴリズム5)である.コンピュータで広く使用されているコンパクトアルゴリズムの1つである(要約アルゴリズム、ハッシュアルゴリズム)
MD 5アルゴリズムには以下の特徴があります.
1、圧縮性:任意の長さのデータ、算出されたMD 5値の長さは固定されている.
2、計算しやすい:元のデータからMD 5の値を計算するのは簡単です.
3、修正抵抗性:元のデータに対していかなる変更を行っても、1バイトだけ修正しても、得られたMD 5値には大きな違いがある.
4、弱い衝突抵抗:元のデータとそのMD 5の値が知られており、同じMD 5の値を持つデータ(つまりデータの偽造)を見つけるのは非常に難しい.
5、強い衝突抵抗:2つの異なるデータを見つけて、同じMD 5値を持つのは非常に難しい.
 
ファイルパスによるファイルMD 5値の取得
public static string GetMD5HashFromFile(string fileName)

        {

            try

            {

                FileStream file = new FileStream(fileName, FileMode.Open);

                System.Security.Cryptography.MD5 md5 = new System.Security.Cryptography.MD5CryptoServiceProvider();

                byte[] retVal = md5.ComputeHash(file);

                file.Close();



                StringBuilder sb = new StringBuilder();

                for (int i = 0; i < retVal.Length; i++)

                {

                    sb.Append(retVal[i].ToString("x2"));

                }

                return sb.ToString();

            }

            catch (Exception ex)

            {

                throw new Exception("GetMD5HashFromFile() fail,error:" + ex.Message);

            }

        }

ストリームパスによるMD 5値の取得
public static string GetMd5Hash(Stream input)

        {

            MD5CryptoServiceProvider md5Hasher = new MD5CryptoServiceProvider();

            byte[] data = md5Hasher.ComputeHash(input);

            input.Seek(0, SeekOrigin.Begin);

            StringBuilder sBuilder = new StringBuilder();

            for (int i = 0; i < data.Length; i++)

            {

                sBuilder.Append(data[i].ToString("x2"));

            }

            return sBuilder.ToString();

        }

テストにより、ファイルストリームからMD 5値が得られ、ファイルの接尾辞名が変更されたのは区別がないことが分かった.
文字列MD 5の値
public static string GetMd5Hash(string input)

        {

            // Create a new instance of the MD5CryptoServiceProvider object.

            MD5CryptoServiceProvider md5Hasher = new MD5CryptoServiceProvider();



            // Convert the input string to a byte array and compute the hash.

            byte[] data = md5Hasher.ComputeHash(Encoding.Default.GetBytes(input));



            // Create a new Stringbuilder to collect the bytes

            // and create a string.

            StringBuilder sBuilder = new StringBuilder();



            // Loop through each byte of the hashed data 

            // and format each one as a hexadecimal string.

            for (int i = 0; i < data.Length; i++)

            {

                sBuilder.Append(data[i].ToString("x2"));

            }



            // Return the hexadecimal string.

            return sBuilder.ToString();

        }

文字列MD 5の値の比較
       // Verify a hash against a string. md5       

       public static bool VerifyMd5Hash(string input, string hash)

        {

            // Hash the input.

            string hashOfInput = getMd5Hash(input);



            // Create a StringComparer an compare the hashes.

            StringComparer comparer = StringComparer.OrdinalIgnoreCase;



            if (0 == comparer.Compare(hashOfInput, hash))

            {

                return true;

            }

            else

            {

                return false;

            }

        }