SHA256的總結與Go實現

SHA256在線驗證連接:SHA256 online hash function 
html

My Golang github源碼 :https://github.com/kumataahh/Golang-toolbox/blob/master/crypto/sha256_source.gogit

 SHA256的加密過程歸爲四個點github

  • 常量的初始化
  • 信息預處理
  • 使用到的邏輯運算
  • 計算信息摘要

初始化常量

用做後面對須要加密的信息的處理。golang

8個哈希初值:天然數中前8個質數(2,3,5,7,11,13,17,19)的平方根的小數部分取前32bit而來算法

64個哈希常量:對天然數中前64個質數(2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97…)的立方根的小數部分取前32bit而來。函數

// golang 
// 8個哈希初值和64個哈希常量

const (
    chunk     = 64
    init0     = 0x6A09E667
    init1     = 0xBB67AE85
    init2     = 0x3C6EF372
    init3     = 0xA54FF53A
    init4     = 0x510E527F
    init5     = 0x9B05688C
    init6     = 0x1F83D9AB
    init7     = 0x5BE0CD19 
)

var _K = []uint32{
    0x428a2f98,
    0x71374491,
    0xb5c0fbcf,
    0xe9b5dba5,
    0x3956c25b,
    0x59f111f1,
    0x923f82a4,
    0xab1c5ed5,
    0xd807aa98,
    0x12835b01,
    0x243185be,
    0x550c7dc3,
    0x72be5d74,
    0x80deb1fe,
    0x9bdc06a7,
    0xc19bf174,
    0xe49b69c1,
    0xefbe4786,
    0x0fc19dc6,
    0x240ca1cc,
    0x2de92c6f,
    0x4a7484aa,
    0x5cb0a9dc,
    0x76f988da,
    0x983e5152,
    0xa831c66d,
    0xb00327c8,
    0xbf597fc7,
    0xc6e00bf3,
    0xd5a79147,
    0x06ca6351,
    0x14292967,
    0x27b70a85,
    0x2e1b2138,
    0x4d2c6dfc,
    0x53380d13,
    0x650a7354,
    0x766a0abb,
    0x81c2c92e,
    0x92722c85,
    0xa2bfe8a1,
    0xa81a664b,
    0xc24b8b70,
    0xc76c51a3,
    0xd192e819,
    0xd6990624,
    0xf40e3585,
    0x106aa070,
    0x19a4c116,
    0x1e376c08,
    0x2748774c,
    0x34b0bcb5,
    0x391c0cb3,
    0x4ed8aa4a,
    0x5b9cca4f,
    0x682e6ff3,
    0x748f82ee,
    0x78a5636f,
    0x84c87814,
    0x8cc70208,
    0x90befffa,
    0xa4506ceb,
    0xbef9a3f7,
    0xc67178f2,
}

信息預處理

在想要Hash的消息後面補充須要的信息,使整個消息知足指定的結構。ui

兩個步驟:附加填充比特附加長度加密

// step 1 附加填充bit
// simple need hash data  : "abc"
// a,b,c對應的ASCII碼分別是97,98,99
// ascii code :01100001 01100010 01100011
//  一串補位操做後,數據爲(hex)長度爲448
61626380 00000000 00000000 00000000
00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000
00000000 00000000

// step 2 附加長度值,用一個64bit數據表示消息長度
// 補長後
61626380 00000000 00000000 00000000
00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000018

邏輯運算

SHA256散列函數中涉及的操做所有是邏輯的位運算,一系列位運算,包含以下函數:spa

 

計算信息摘要

step1:消息分解成512-bit大小的塊.net

能分n快就完成n次迭代,n次迭代的結果就是最終的哈希值,即256bit的數字摘要。

step2:8個哈希初值的迭代運算

step3:構造64個字(word)

對於每一塊,將塊分解爲16個32-bit的big-endian的字,記爲w[0], …, w[15]

前16個字直接由消息的第i個塊分解獲得

其他的字由以下迭代公式獲得:

step4:64次加密循環

ABCDEFGH這8個字(word)在按照必定的規則進行更新

  • 深藍色方塊是事先定義好的非線性邏輯函數
  • 紅色田字方塊表明 mod $ 2^{32} $ addition,即將兩個數字加在一塊兒,若是結果大於$ 2^{32} ,你必須除以 ,你必須除以,你必須除以 2^{32} $並找到餘數。
  • ABCDEFGH一開始的初始值分別爲$ H_{i-1}(0),H_{i-1}(1),…,H_{i-1}(7) $
  • Kt是第t個密鑰,對應咱們上文提到的64個常量
  • Wt是本區塊產生第t個word。原消息被切成固定長度512-bit的區塊,對每個區塊,產生64個word,經過重複運行循環n次對ABCDEFGH這八個字循環加密。
  • 最後一次循環所產生的八個字合起來便是第i個塊對應到的散列字符串$ H_{i} $

 

 

筆記參考:SHA256算法原理詳解

相關文章
相關標籤/搜索