備註算法
哈希函數將任意長度的二進制字符串映射爲固定長度的小型二進制字符串。加密哈希函數有這樣一個屬性:在計算不大可能找到散列爲相同的值的兩個不一樣的輸入;也就是說,兩組數據的哈希值僅在對應的數據也匹配時纔會匹配。數據的少許更改會在哈希值中產生不可預知的大量更改。數組
MD5 算法的哈希值大小爲 128 位。ide
MD5 類的 ComputeHash 方法將哈希做爲 16 字節的數組返回。請注意,某些 MD5 實現會生成 32 字符的十六進制格式哈希。若要與此類實現進行互操做,請將 ComputeHash 方法的返回值格式化爲十六進制值。函數
示例oop
下面的代碼示例計算字符串的 MD5 哈希值,並將該哈希做爲 32 字符的十六進制格式字符串返回。此代碼示例中建立的哈希字符串與能建立 32 字符的十六進制格式哈希字符串的任何 MD5 哈希函數(在任何平臺上)兼容。ui
複製this
using System;加密
using System.Security.Cryptography;excel
using System.Text;code
class Example
{
// Hash an input string and return the hash as
// a 32 character hexadecimal string.
static string getMd5Hash(string input)
{
// Create a new instance of the MD5CryptoServiceProvider object.
MD5 md5Hasher = MD5.Create();
// 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();
}
// Verify a hash against a string.
static bool verifyMd5Hash(string input, string hash)
{
// Hash the input.
string hashOfInput = getMd5Hash(input);
// Create a StringComparer an comare the hashes.
StringComparer comparer = StringComparer.OrdinalIgnoreCase;
if (0 == comparer.Compare(hashOfInput, hash))
{
return true;
}
else
{
return false;
}
}
static void Main()
{
string source = "Hello World!";
string hash = getMd5Hash(source);
Console.WriteLine("The MD5 hash of " + source + " is: " + hash + ".");
Console.WriteLine("Verifying the hash...");
if (verifyMd5Hash(source, hash))
{
Console.WriteLine("The hashes are the same.");
}
else
{
Console.WriteLine("The hashes are not same.");
}
}
}
// This code example produces the following output:
//
// The MD5 hash of Hello World! is: ed076287532e86365e841e92bfc50d8c.
// Verifying the hash...
// The hashes are the same.
代碼:
1)獲取文件MD5字符串:
// filename:文件的物理路徑(如:D:\dwb\excel\AA.xls)
string ByteArrayToHexString(string filename) {
FileStream fs = new FileStream(filename, FileMode.Open);
MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider();
md5.Initialize();
byte[] bytes = md5.ComputeHash(fs);
md5.Clear();
fs.Close();
StringBuilder sb = new StringBuilder();
foreach (byte b in bytes)
sb.Append(b.ToString("x2"));
return sb.ToString();
}
2)加密配置文件:
string sSecretKey;// 密鑰
先生成加密解密須要的密鑰 sSecretKey = GenerateKey();
/// <summary>
/// 根據KEY生成密鑰
/// </summary>
/// <param name="key">KEY字符串</param>
/// <returns></returns>
string GenerateKey(string key)
{
byte[] keys = new byte[8];
int j = 0;
for (int i = 0; i < keys.Length; i++)
{
keys[i] = Convert.ToByte(System.Text.Encoding.Unicode.GetBytes(key.Substring(j, 1))[0] - 5);
j += 2;
}
byte[] keys1 = new byte[8];
for (int i = 0; i < keys.Length; i++)
{
keys1[i] = keys[keys.Length - i - 1];
}
return ASCIIEncoding.ASCII.GetString(keys1);
}
/// <summary>
/// 加密文件
/// </summary>
/// <param name="sInputFilename">須要加密的文件(包括路徑)</param>
/// <param name="sOutputFilename">加密後的文件(包括路徑)</param>
/// <param name="sKey">密鑰</param>
void EncryptFile(string sInputFilename, string sOutputFilename, string sKey)
{
FileStream fsInput = new FileStream(sInputFilename, FileMode.Open, FileAccess.Read);
FileStream fsEncrypted = new FileStream(sOutputFilename, FileMode.Create, FileAccess.Write);
DESCryptoServiceProvider DES = new DESCryptoServiceProvider();
DES.Key = ASCIIEncoding.ASCII.GetBytes(sKey);
DES.IV = ASCIIEncoding.ASCII.GetBytes(sKey);
ICryptoTransform desencrypt = DES.CreateEncryptor();
CryptoStream cryptostream = new CryptoStream(fsEncrypted, desencrypt, CryptoStreamMode.Write);
byte[] bytearrayinput = new byte[fsInput.Length];
fsInput.Read(bytearrayinput, 0, bytearrayinput.Length);
cryptostream.Write(bytearrayinput, 0, bytearrayinput.Length);
cryptostream.Close();
fsInput.Close();
fsEncrypted.Close();
}
3)解密配置文件:
/// <summary>
/// 解密文件
/// </summary>
/// <param name="sInputFilename">須要解密的文件(包括路徑)</param>
/// <param name="sOutputFilename">解密後的文件(包括路徑)</param>
/// <param name="sKey">密鑰</param>
void DecryptFile(string sInputFilename, string sOutputFilename, string sKey)
{
DESCryptoServiceProvider DES = new DESCryptoServiceProvider();
//A 64 bit key and IV is required for this provider.
//Set secret key For DES algorithm.
DES.Key = ASCIIEncoding.ASCII.GetBytes(sKey);
//Set initialization vector.
DES.IV = ASCIIEncoding.ASCII.GetBytes(sKey);
FileStream fsread = new FileStream(sInputFilename, FileMode.Open, FileAccess.Read);
ICryptoTransform desdecrypt = DES.CreateDecryptor();
CryptoStream cryptostreamDecr = new CryptoStream(fsread, desdecrypt, CryptoStreamMode.Read);
StreamWriter fsDecrypted = new StreamWriter(sOutputFilename);
fsDecrypted.Write(new StreamReader(cryptostreamDecr).ReadToEnd());
fsDecrypted.Flush();
fsDecrypted.Close();
fsread.Close();
}