(個人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






留言

這個網誌中的熱門文章

經得起原始碼資安弱點掃描的程式設計習慣培養(五)_Missing HSTS Header

經得起原始碼資安弱點掃描的程式設計習慣培養(三)_7.Cross Site Scripting(XSS)_Stored XSS_Reflected XSS All Clients

(2021年度)駕訓學科筆試準備題庫歸納分析_法規是非題