我們來到了目前主流的Hash算法了。

SHA全名為『Secure Hash Algorithm』,字面意思就是安全雜湊演算法。

目前SHA從0~3個版本,而2跟3其實都是安全的,但不同的地方是算法差距蠻大的。

SHA3其實是因為SHA1跟2有很多的相似之處,所以 NIST 就決定開發完全不同的演算法。

如果有一天SHA2被破解,那SHA3就能替換它,並且保持完全不同的結構,使破解邏輯不會被仿製。

接下來應該會把SHA家族的1、2、3介紹完。

SHA1 與 SHA2

一樣我們搭配論文一起來分析。

Secure Hash Standard (SHS)

接下來我們所使用的圖片都是來自2015年所發布的,Secure Hash Standard (SHS) 文檔,在此標記。

先看圖一:

能看到除了SHA1之外都是一些200以上的數字,而那些就是SHA2。

在看一些詳細訊息如:

  • Message Size必需要在2^64以內。
  • Message Digest Size 會輸出的長度。
    其他的訊息說起來還好,詳細解說的時候會知道的。
  • SHA1 流程圖二


    圖二
    圖片來自 SHA-1 WiKi

    不覺得好像在哪裡看過、而且很熟悉嗎。

    沒錯,其實就是借鑑了MD5。

    大家熟悉MD5之後,我這邊就快速地講過一些關鍵的參數。

    填充(對應MD5的步驟1跟2)

    跟MD5一樣,看圖三。

    F函數(對應MD5的步驟4)

    然後那個F就是圖四:

    然後圖五就能知道F(x,y,z) = F(b,c,d)

    緩衝容器初始化(對應MD5的步驟3)

    然後初始化容器數值為圖六:

    K生成(對應MD5的前置)

    那我們簡單的看一下K生成(圖七):

    喔~整個簡單到不行……

    在回合數時填入上述的數值。

    W處理(對應MD5的步驟2切塊資料跟步驟4)

    在看一下W(圖八):

    其實也沒什麼難度就是了。

    對了它ROTL的1就是位移一次。

    做完全回合後輸出(對應MD5的步驟5)

    這邊也一樣如圖九

    輸出就是如圖十

    SHA1 總結

    然後SHA1的總覽圖十一,這邊能看到它做80次。

    SHA1我就快速的帶過,大家應該熟悉MD5之後再來寫這邊,只要改一些參數就好。

    所以因為類似,也就被破解了,目前跟MD5一樣是不安全的Hash。

    因此我們進入比較重要的SHA2。

    這邊先說一下,其實SHA2也是SHA1的變體而已。

    整體算法的流程其實很多相同的地方,除了提供更高的位元之外,在做演算時有些參數會不同。

    也造成了圖一那樣的,Block Size跟Word Size的不同。

    就因為這樣我們必需要拆解一下SHA2,並做分類。

    SHA-224 和 SHA-256 為一類。 SHA-384、SHA-512、SHA-512/224 和 SHA-512/256為另一類。

    我們就 SHA2-256 跟 SHA2-512 來代表這兩類。

    SHA2 流程(圖十二)


    圖十二
    圖片來自 SHA-2 WiKi

    這邊能看出多了4個黑盒子跟變成了8個緩衝塊。

    然後細部上面變動了兩塊緩衝區。

    整體來說還是能看出MD5深深的影子。

    但是到目前為止還沒有發生偽造跟碰撞就是了。

    SHA2-256,圖十三:

    圖十三

    SHA2-512,圖十四

    圖十四

    圖十三跟MD5、SHA1一樣。
    而圖十四來說,其實就是取1024餘數後要等於896。
    填充的方式也一樣先填一位元的'1'後填滿'0'直到符合上述條件。

    SHA2-256,圖十五:

    圖十五

    SHA2-512,圖十六

    圖十六

    應對上流程圖的那些黑箱,

    大家可能比較不熟悉的是σ跟SHR吧。

    σ是在處理W時會用到的。

    SHR其實就是向右位移,但不做循環位移,最左邊就是補'0'。

    緩衝容器初始化

    這邊就有點尷尬了,我們必需要一個一個跟你說初始化的資料:

  • SHA2-224,圖十七

    圖十七
  • SHA2-256,圖十八

    圖十八
  • SHA2-384,圖十九

    圖十九
  • SHA2-512,圖二十

    圖二十
  • 這邊應該有發現到,初始資料的長度變化。

    沒錯,512的資料是一次做128位元的。

    那我們簡單的看一下K生成(圖六):

    SHA2-256,圖二一:

    圖二一

    SHA2-512,圖二二:

    圖二二

    這邊一樣是K的對應數值,直接做成列表就OK了。

    是固定的常數。

    SHA2-256,圖二三:

    圖二三

    SHA2-512,圖二四:

    圖二四

    這邊就出現了F函數那邊的σ了。

    一樣代進去算,然後把資料作相加。

    SHA2-256,圖二五:

    圖二五

    SHA2-512,圖二六:

    圖二六

    其實流程差不多就是這樣。

    有了K,有了W,再把資料帶進去計算就OK了。

    然後就是重複次數了:

  • SHA2-256:64次。
  • SHA2-512:80次。
  • 做完全回合後輸出

    這邊就是更新初始容器:

    SHA2-256,圖二七:

    圖二七

    SHA2-512,圖二八:

    圖二八

    輸出的部分比較特殊,一樣每個都要列舉:

  • SHA2-224,圖二九

    圖二九
  • SHA2-256,圖三十

    圖三十
  • SHA2-384,圖三一

    圖三一
  • SHA2-512,圖三二

    圖三二
  • 更特殊的:

  • SHA2-512/224:直接取SHA2-512的最左邊的224位元。
  • SHA2-512/256:直接取SHA2-512的最左邊的256位元。
  • SHA2 總結

    就大家有MD5的經驗來說,這邊的幾個動作其實也都大同小異。

    而且發布的標準來說其實也十分的完整就是了,這邊有點像是導讀一樣的(不是一直都是導讀嗎?)。

    除了多了幾個向右、向左位移的黑盒子之外,在資料W上也做了一些改變。

    但整理來說流程也都差不多,並沒有真的很難的地方。

    我想大家應該能理解。

    但也是因為很類似MD5,而且應用的都是電腦硬體很擅長的部分,所以能做大檔案跟大資料的Hash。

    只是可能要切塊,並且做混入Hash,主要是因為最大的2^64的限制。

    但我想解決這個問題並不難就是了。

    接下來要講一個完全跟SHA2不同算法的SHA3。

    那接下來明天見啦~

    SHA家族

    SHA-1 WiKi

    SHA-2 WiKi

    Secure Hash Standard (SHS)