前言
簡介:
訊息摘要(Message Digest)又稱為數字摘要(Digital Digest)
它是一個唯一對應一個訊息或文字的固定長度的值,它由一個單向Hash加密函式對訊息進行作用而產生
使用數字摘要生成的值是不可以篡改的,為了保證檔案或者值的安全
無論輸入的訊息有多長,計算出來的訊息摘要的長度總是固定的。例如應用MD5演算法摘要的訊息有128個位元位,用SHA-1演算法摘要的訊息最終有160位元位的輸出
只要輸入的訊息不同,對其進行摘要以後產生的摘要訊息也必不相同;但相同的輸入必會產生相同的輸出
訊息摘要是單向、不可逆的
常見演算法 :
- MD5
- SHA1
- SHA256
- SHA512
正文
展示md5的訊息加解密:
static void Main(string[] args)
{
MD5 d5 = MD5.Create();
byte[] buff=Encoding.Default.GetBytes("敗落的城鎮");
byte[] md5buffer = d5.ComputeHash(buff);
string str = "";
foreach (byte b in md5buffer)
{
//轉換為16進位制
str += b.ToString("x2");
}
Console.WriteLine(str);
Console.ReadKey();
}
結果:
其他的訊息摘要也是如此。
就是加密的思路就是:
轉換為byte 陣列。
然後對byte進行數字摘要,轉換為16進位制。
對了,訊息摘要不可逆。
那麼檔案如何校驗呢?檔案考慮到一個點就是,檔案特別大的情況下,難道全部讀取出來做校驗?
不是的,那麼請看。
static void Main(string[] args)
{
FileStream fileStream = new FileStream("C:\\test\\test.txt", FileMode.Open);
byte[] bs = new byte[1024];
fileStream.Read(bs,0,bs.Length);
MD5 d5 = MD5.Create();
var result= d5.ComputeHash(bs);
var str = new StringBuilder();
foreach (var s in result)
{
str.Append(s.ToString("x2"));
}
Console.WriteLine(str);
Console.ReadKey();
}
我最多取1024個位元組來進行校驗,因為這已經夠了。
因為如果客戶端被破解,那麼實際是沒有意義的,檔案校驗是傳輸過程中避免被修改。