(個人KM文件製作備用)工作需求_MD5細節原理功能單元實作
一般在公司都會有一套自己的加密方案,按照公司
在介紹MD5之前
我們再回鍋炒一遍
先釐清幾個名詞的定義及觀念
加解密的演算法 ---> 是公開的
需要很高深的數學理論目前有的還在發展當中
不要有一個迷思!!!!
整個密碼學不是靠 演算法來 穩固安全的!!!!!
主要是用 加密的 "密碼" 需要很多年的驗證 不要被誤解
加解密 不要自己 研發!!!!!
Information Security:
明文(plaintext) : 加密之前的文字 (出貨時的商品真正面目)
↓
[加密過程] (裝進箱子用鑰匙上鎖)
↓
密文(ciphertext) : 加密之後的文字 (已經被裝箱包起來包進盒子後的包裹)
鑰匙/金鑰(Key) ---> 公鑰(Public Key) 及 私鑰(Secret Key)
加密系統型態共可細分為三種:
1.對稱式(金鑰)加密(Symmetric Cryptography)
---> 不管加密還是解密都使用同一把鑰匙(共通金鑰)
有共同金鑰(Common Key)
相對伴隨而來的還有共同金鑰密碼(Common Key Cryptography)
又有人依據其特點稱之為對稱金鑰密碼(Symmetric Key Cryptography)
或 秘密金鑰密碼(Secret Key Cryptography),古代慣用此類型加密機制。
因為加密解密都共用同一把 :
(不同人數之間推算要幾把Key)
2個人之間用-----> 1 把Key
3個人之間用-----> 3 把Key
4個人之間用-----> 6 把Key
........
N個人之間用-----> C n取2 Key
2.非對稱式(金鑰)加密(Asymmetric Cryptography)
--->加密(encryption key) 和 解密(decryption key) 使用不同把鑰匙
3.雜湊函數 (Hash Function)
可將任意長度的輸入輸出至固定長度結果
--->常見的有 MD5 、 SHA1
單向不可逆(One-Way)-->你不能透過摘要反推出原來訊息
不具鑰匙
明文 : M
雜湊函數 : H
雜湊值(hash value)/摘要(digest) : h = H(M) ----> Digital Fingerprint
生活上概念: 不同長度文章(課文)會對應特定摘要
文章若有被竄改過則也會對應出現不同的摘要
換言之,若在傳送文章時附上摘要(hash value)即可透過檢查hash value而得知此篇文章是否有被竄改過喔。(從某些層面上看也可代表資料完整性的提供)
=============================================================
5個Rule (滿足1~4:弱雜湊 , 1~5:強雜湊)
1.對任意長度訊息輸入,生出固定長度雜湊值output(代表訊息完整性)。
2.可H(M) , 並且能透過Harfware或software實踐。
3.One-Way
4.對訊息M1 , 在計算上無法找出另一個訊息M2 不等於 M1 , 使 H(M1) = H(M2)。
5.若 H(M1) = H(M2) , 則M1 = M2 , 若 H(M1) 不等於 H(M2) , 則M1不等於M2。
=============================================================
當 H(m) = H(m') 且 m 不等於 m' 則發生collision
(兩個訊息 ,摘要是相同的 但是文章內容卻不同時則碰撞)
Weak Collision resistance:
給定一個m , 無法找到一個m' 不等於 m
使 H(m) = H(m')。
StrongCollision resistance:
無法找到 m 及 m' , 使得 m' 不等於 m 且 H(m) 不等於 H(m')
MD5演算法:為一種Hash算法(摘要算法)
全稱為 Message Digest Algorithm 5
(訊息摘要演算法第五版)
會對輸入資訊生成唯一的128bit Hash(散列值) /32個字元
一般在一些高階程式語言(C# , VB.NET ,.....etc)都有內建的function可以調用實作
Ronald Rivest (RSA學者) 設計
MD5特點:
1.輸入兩個不同明文不會得到相同的輸出值
2.根據輸出值,不可獲取原始明文(過程不可逆)
MD5的應用:
1.MD5由於已經公開且免費,在安全性評估上也具有還算不差的安全性
因此時常被廣泛拿來使用。
2.主要運用在 數位簽章(Digital Signature)、文件完整性驗證 及 密碼(對岸:口令)加密
MD5運作原理
區段演算(Message--->原文訊息) : 512 bits
雜湊值長度 : 128 bits
初始向量(IV / Initial Vector) : 128 bits
MD5演算法實作細節流程
2 Inputs : 512bita plaintext 及 128 bits 上衣區塊 之初始向量(IV / Initial Vector)
輸入data block 分為 四個 暫存器 : A ,B ,C ,D
共做四回合 (每一回合計算16次 ,合計64次) ====>32 *16 (512)將512bit資料像絞肉攪拌四次
加入 sin(x) 非線性函數參數值
MD5 壓縮函數
a = b+((a+g(b,c,d)+X[k]+T[i])<<<s)
後續有點超出人腦負荷 恩恩~~~
主要一個分享到此結束
C#實作
測試跑出來結果
Apple ---> 轉出一組 16進制的 hash value
Code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 | using System; using System.Collections.Generic; using System.Linq; using System.Security.Cryptography; using System.Text; using System.Threading.Tasks; namespace MD5EncodingHelper { class Program { static void Main(string[] args) { //MD5加密(安全性、完整性) string strIn = "Apple"; Console.WriteLine("加密前:" + strIn); Console.WriteLine("加密後:" + GetMD5(strIn)); Console.ReadKey(); } public static string GetMD5(string str) { //建立MD5物件 MD5 md5 = MD5.Create(); //開始加密 //Step1.將字串轉Byte陣列 byte[] buffer = Encoding.GetEncoding("GBK").GetBytes(str); //Step2.回傳一個加密後的結果(byte陣列) byte[] MD5Buffer = md5.ComputeHash(buffer); //Step3.因為最後function回傳值型態為string , 需再轉回string //byte[] ----> string //法1.將byte陣列每個元素按照指定編碼格式解析成指定字串(會有亂碼) //return Encoding.GetEncoding("GBK").GetString(MD5Buffer); //法2.直接將陣列.ToString() [將byte陣列中每一個元素ToString()] string strResult = ""; for (int i = 0; i < MD5Buffer.Length; i++) { strResult += MD5Buffer[i].ToString("x2"); //十進轉十六進 //x:0xA , x2:0x0A --->輸出改兩位 } return strResult; } } } |
驗證網站:
https://www.ez2o.com/App/Coder/MD5
http://md5calculator.chromefans.org/?langid=zh-tw
留言
張貼留言