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値の取得
ストリームパスによるMD 5値の取得
テストにより、ファイルストリームからMD 5値が得られ、ファイルの接尾辞名が変更されたのは区別がないことが分かった.
文字列MD 5の値
文字列MD 5の値の比較
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;
}
}