加密技術(shù)05-哈希算法-SHA系列原理

概述

安全散列算法(英語:Secure Hash Algorithm,縮寫為SHA)是一個(gè)密碼散列函數(shù)家族,是FIPS所認(rèn)證的安全散列算法。能計(jì)算出一個(gè)數(shù)字消息所對應(yīng)到的,長度固定的字符串(又稱消息摘要)的算法。且若輸入的消息不同,它們對應(yīng)到不同字符串的幾率很高。

SHA家族的算法,由美國國家安全局(NSA)所設(shè)計(jì),并由美國國家標(biāo)準(zhǔn)與技術(shù)研究院(NIST)發(fā)布,是美國的政府標(biāo)準(zhǔn),其分別是:

  • SHA-0:1993年發(fā)布,當(dāng)時(shí)稱做安全散列標(biāo)準(zhǔn)(Secure Hash Standard),發(fā)布之后很快就被NSA撤回,是SHA-1的前身。
  • SHA-1:1995年發(fā)布,SHA-1在許多安全協(xié)議中廣為使用,包括TLS、GnuPG、SSH、S/MIME和IPsec,是MD5的后繼者。但SHA-1的安全性在2010年以后已經(jīng)不被大多數(shù)的加密場景所接受。2017年荷蘭密碼學(xué)研究小組CWI和Google正式宣布攻破了SHA-1。
  • SHA-2:2001年發(fā)布,包括SHA-224、SHA-256、SHA-384、SHA-512、SHA-512/224、SHA-512/256。SHA-2目前沒有出現(xiàn)明顯的弱點(diǎn)。雖然至今尚未出現(xiàn)對SHA-2有效的攻擊,但它的算法跟SHA-1基本上仍然相似。
  • SHA-3:2015年正式發(fā)布,由于對MD5出現(xiàn)成功的破解,以及對SHA-0和SHA-1出現(xiàn)理論上破解的方法,NIST感覺需要一個(gè)與之前算法不同的,可替換的加密散列算法,也就是現(xiàn)在的SHA-3。

SHA-1

SHA-1(英語:Secure Hash Algorithm 1,中文名:安全散列算法1)是一種密碼散列函數(shù),美國國家安全局設(shè)計(jì),并由美國國家標(biāo)準(zhǔn)技術(shù)研究所(NIST)發(fā)布為聯(lián)邦資料處理標(biāo)準(zhǔn)(FIPS)。SHA-1可以生成一個(gè)被稱為消息摘要的160位(20字節(jié))散列值,散列值通常的呈現(xiàn)形式為40個(gè)十六進(jìn)制數(shù)。

2005年,密碼分析人員發(fā)現(xiàn)了對SHA-1的有效攻擊方法,這表明該算法可能不夠安全,不能繼續(xù)使用,自2010年以來,許多組織建議用SHA-2或SHA-3來替換SHA-1。Microsoft、Google以及Mozilla都宣布,它們旗下的瀏覽器將在2017年停止接受使用SHA-1算法簽名的SSL證書。

2017年2月23日,CWI Amsterdam與Google宣布了一個(gè)成功的SHA-1碰撞攻擊,發(fā)布了兩份內(nèi)容不同但SHA-1散列值相同的PDF文件作為概念證明。

2020年,針對SHA-1的選擇前綴沖突攻擊已經(jīng)實(shí)際可行。建議盡可能用SHA-2或SHA-3取代SHA-1。

算法實(shí)現(xiàn)偽代碼

//Note: All variables are unsigned 32 bits and wrap modulo 2^32 when calculating

//初始化(h0,h1,h2,h3跟 MD5 保持一致)
h0 := 0x67452301
h1 := 0xEFCDAB89
h2 := 0x98BADCFE
h3 := 0x10325476
h4 := 0xC3D2E1F0

//補(bǔ)全消息,首先必須添加一位 1,之后補(bǔ) 0,使得消息長度(bits) % 512 = 448
//然后把 message 的字節(jié)長度模上 2^64,以 64 位大端序的方式拼在尾部,總比特位數(shù)恰好可以被 512 整除
append "1" bit to message
append "0" bits until message length in bits ≡ 448 (mod 512)
append original length in bits as 64-bit big-endian integer to message

//每次處理 512 位
for each 512-bit chunk of message
    break chunk into sixteen 32-bit big-endian words w[i], 0 ≤ i ≤ 15
    
    //擴(kuò)展 16 位的 w 數(shù)組為 80 位
    for i from 16 to 79
        w[i] := (w[i-3] xor w[i-8] xor w[i-14] xor w[i-16]) leftrotate 1
    
    a := h0
    b := h1
    c := h2
    d := h3
    e := h4
    
    //Main loop:
    for i from 0 to 79
        if 0 ≤ i ≤ 19 then
            f := (b and c) or ((not b) and d)
            k := 0x5A827999
        else if 20 ≤ i ≤ 39
            f := b xor c xor d
            k := 0x6ED9EBA1
        else if 40 ≤ i ≤ 59
            f := (b and c) or (b and d) or(c and d)
            k := 0x8F1BBCDC
        else if 60 ≤ i ≤ 79
            f := b xor c xor d
            k := 0xCA62C1D6
        temp := (a leftrotate 5) + f + e + k + w[i]
        e := d
        d := c
        c := b leftrotate 30
        b := a
        a := temp
    
    h0 := h0 + a
    h1 := h1 + b
    h2 := h2 + c
    h3 := h3 + d
    h4 := h4 + e

//Produce the final hash value (big-endian):
digest = hash = h0 append h1 append h2 append h3 append h4

MD5 的實(shí)現(xiàn)過程是基本一致, 不一樣的地方主要如下(實(shí)現(xiàn)的差異):

  • 輸入消息的比特長度: MD5 沒有限制的,SHA-1 最長 2^64 - 1 位(消息比特長度填充到消息尾部過程中,MD5 需要模 2^64 后填充最后 64 位,SHA-1 直接填充最后 64 位);
  • 輸出 16 進(jìn)制數(shù)的長度:MD5 是 32 位,SHA-1 是 40 位(增加一個(gè) h4,其他 4 個(gè)初始值是一樣的);
  • k 常量:MD5 是通過正弦函數(shù)獲取的,SHA-1 是固定四個(gè)常量 0x5A827999,0x6ED9EBA1,0x8F1BBCDC,0xCA62C1D6,這四個(gè)常量分別是素?cái)?shù) 2, 3, 5, 10,先開根號(hào),再乘上 2^30,最后向下取整。比如:floor(sqrt(2) * 2^30) -> floor(1518500249.9880) -> 1518500249 -> 0x5A827999

SHA-2

SHA-2,名稱來自于安全散列算法2(英語:Secure Hash Algorithm 2)的縮寫,一種密碼散列函數(shù)算法標(biāo)準(zhǔn),由美國國家安全局研發(fā),由美國國家標(biāo)準(zhǔn)與技術(shù)研究院(NIST)在2001年發(fā)布。屬于SHA算法之一,是SHA-1的后繼者。其下又可再分為六個(gè)不同的算法標(biāo)準(zhǔn),包括了:SHA-224、SHA-256、SHA-384、SHA-512、SHA-512/224、SHA-512/256。

SHA-2 系列的算法主要思路和 SHA-1 基本一致

SHA-256 的偽代碼

//前 8 個(gè)素?cái)?shù)(2, 3, 5, 7, 11, 13, 17, 19),依次通過 floor(sqrt_小數(shù)部分(x) * 2^32) 運(yùn)算
//比如:h0 = floor(sqrt_小數(shù)部分(2) * 2^32) = floor(0.414213562373095 * 2^32) 
//        = floor(1779033703.952099) = 1779033703 = 0x6a09e667
h0 := 0x6a09e667
h1 := 0xbb67ae85
h2 := 0x3c6ef372
h3 := 0xa54ff53a
h4 := 0x510e527f
h5 := 0x9b05688c
h6 := 0x1f83d9ab
h7 := 0x5be0cd19

//前 64 個(gè)素?cái)?shù),依次通過 floor(cbrt_小數(shù)部分(x) * 2^32) 運(yùn)算
//比如:k[0] = floor(cbrt_小數(shù)部分(2) * 2^32) = floor(0.259921049894873 * 2^32) 
//          = floor(1116352408.840464) = 1116352408 = 0x428a2f98
k[0..63] :=
   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


// 跟 SHA-1 一樣的處理
append "1" bit to message
append "0" bits until message length in bits ≡ 448 (mod 512)
append original length in bits as 64-bit big-endian integer to message

for each 512-bit chunk of message
    break chunk into sixteen 32-bit big-endian words w[i], 0 ≤ i ≤ 15
    
    for i from 16 to 63
        s0 := (w[i-15] rightrotate 7) xor (w[i-15] rightrotate 18) xor(w[i-15] rightshift 3)
        s1 := (w[i-2] rightrotate 17) xor (w[i-2] rightrotate 19) xor(w[i-2] rightshift 10)
        w[i] := w[i-16] + s0 + w[i-7] + s1

    a := h0
    b := h1
    c := h2
    d := h3
    e := h4
    f := h5
    g := h6
    h := h7
    
    for i from 0 to 63
        s0 := (a rightrotate 2) xor (a rightrotate 13) xor(a rightrotate 22)
        maj := (a and b) xor (a and c) xor(b and c)
        t2 := s0 + maj
        s1 := (e rightrotate 6) xor (e rightrotate 11) xor(e rightrotate 25)
        ch := (e and f) xor ((not e) and g)
        t1 := h + s1 + ch + k[i] + w[i]
        
        h := g
        g := f
        f := e
        e := d + t1
        d := c
        c := b
        b := a
        a := t1 + t2
        
    h0 := h0 + a
    h1 := h1 + b
    h2 := h2 + c
    h3 := h3 + d
    h4 := h4 + e
    h5 := h5 + f
    h6 := h6 + g
    h7 := h7 + h
    
digest = hash = h0 append h1 append h2 append h3 append h4 append h5 append h6 append h7

SHA-512 的偽代碼

//與 SHA-256 相比,把之前的 32-bit 改成 64-bit
h[0..7] := 0x6a09e667f3bcc908, 0xbb67ae8584caa73b, 0x3c6ef372fe94f82b, 0xa54ff53a5f1d36f1, 
           0x510e527fade682d1, 0x9b05688c2b3e6c1f, 0x1f83d9abfb41bd6b, 0x5be0cd19137e2179

// 前 80 個(gè)素?cái)?shù)
k[0..79] := [ 0x428a2f98d728ae22, 0x7137449123ef65cd, 0xb5c0fbcfec4d3b2f, 0xe9b5dba58189dbbc, 0x3956c25bf348b538, 
              0x59f111f1b605d019, 0x923f82a4af194f9b, 0xab1c5ed5da6d8118, 0xd807aa98a3030242, 0x12835b0145706fbe, 
              0x243185be4ee4b28c, 0x550c7dc3d5ffb4e2, 0x72be5d74f27b896f, 0x80deb1fe3b1696b1, 0x9bdc06a725c71235, 
              0xc19bf174cf692694, 0xe49b69c19ef14ad2, 0xefbe4786384f25e3, 0x0fc19dc68b8cd5b5, 0x240ca1cc77ac9c65, 
              0x2de92c6f592b0275, 0x4a7484aa6ea6e483, 0x5cb0a9dcbd41fbd4, 0x76f988da831153b5, 0x983e5152ee66dfab, 
              0xa831c66d2db43210, 0xb00327c898fb213f, 0xbf597fc7beef0ee4, 0xc6e00bf33da88fc2, 0xd5a79147930aa725, 
              0x06ca6351e003826f, 0x142929670a0e6e70, 0x27b70a8546d22ffc, 0x2e1b21385c26c926, 0x4d2c6dfc5ac42aed, 
              0x53380d139d95b3df, 0x650a73548baf63de, 0x766a0abb3c77b2a8, 0x81c2c92e47edaee6, 0x92722c851482353b, 
              0xa2bfe8a14cf10364, 0xa81a664bbc423001, 0xc24b8b70d0f89791, 0xc76c51a30654be30, 0xd192e819d6ef5218, 
              0xd69906245565a910, 0xf40e35855771202a, 0x106aa07032bbd1b8, 0x19a4c116b8d2d0c8, 0x1e376c085141ab53, 
              0x2748774cdf8eeb99, 0x34b0bcb5e19b48a8, 0x391c0cb3c5c95a63, 0x4ed8aa4ae3418acb, 0x5b9cca4f7763e373, 
              0x682e6ff3d6b2b8a3, 0x748f82ee5defb2fc, 0x78a5636f43172f60, 0x84c87814a1f0ab72, 0x8cc702081a6439ec, 
              0x90befffa23631e28, 0xa4506cebde82bde9, 0xbef9a3f7b2c67915, 0xc67178f2e372532b, 0xca273eceea26619c, 
              0xd186b8c721c0c207, 0xeada7dd6cde0eb1e, 0xf57d4f7fee6ed178, 0x06f067aa72176fba, 0x0a637dc5a2c898a6, 
              0x113f9804bef90dae, 0x1b710b35131c471b, 0x28db77f523047d84, 0x32caab7b40c72493, 0x3c9ebe0a15c9bebc, 
              0x431d67c49c100d4c, 0x4cc5d4becb3e42b6, 0x597f299cfc657e2a, 0x5fcb6fab3ad6faec, 0x6c44198c4a475817]

append "1" bit to message
append "0" bits until message length in bits ≡ 896 (mod 1024)
append original length in bits as 128-bit big-endian integer to message

for each 1024-bit chunk of message
    break chunk into sixteen 64-bit big-endian words w[i], 0 ≤ i ≤ 15
    
    for i from 16 to 79
        s0 := (w[i-15] rightrotate 1) xor (w[i-15] rightrotate 8) xor (w[i-15] rightshift 7)
        s1 := (w[i-2] rightrotate 19) xor (w[i-2] rightrotate 61) xor (w[i-2] rightshift 6)
        w[i] := w[i-16] + s0 + w[i-7] + s1

    a := h0
    b := h1
    c := h2
    d := h3
    e := h4
    f := h5
    g := h6
    h := h7
    
    for i from 0 to 79
        S0 := (a rightrotate 28) xor (a rightrotate 34) xor (a rightrotate 39)
        maj := (a and b) xor (a and c) xor(b and c)
        t2 := S0 + maj
        S1 := (e rightrotate 14) xor (e rightrotate 18) xor (e rightrotate 41)
        ch := (e and f) xor ((not e) and g)
        t1 := h + S1 + ch + k[i] + w[i]
        
        h := g
        g := f
        f := e
        e := d + t1
        d := c
        c := b
        b := a
        a := t1 + t2
        
    h0 := h0 + a
    h1 := h1 + b
    h2 := h2 + c
    h3 := h3 + d
    h4 := h4 + e
    h5 := h5 + f
    h6 := h6 + g
    h7 := h7 + h
    
digest = hash = h0 append h1 append h2 append h3 append h4 append h5 append h6 append h7

前 100 個(gè)素?cái)?shù)表

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  101 103 107 109 113
127 131 137 139 149 151 157 163 167 173
179 181 191 193 197 199 211 223 227 229
233 239 241 251 257 263 269 271 277 281
283 293 307 311 313 317 331 337 347 349
353 359 367 373 379 383 389 397 401 409
419 421 431 433 439 443 449 457 461 463
467 479 487 491 499 503 509 521 523 541

SHA-224

SHA-224 和 SHA-256 基本上是相同的,除了:

  • h0 到 h7 的初始值不同;
  • SHA-224 輸出時(shí)截掉 h7 的函數(shù)值。
// 生成規(guī)則與 SHA-256 一樣,取第 9 至第 16 個(gè)素?cái)?shù)
h[0..7] :=
    0xc1059ed8, 0x367cd507, 0x3070dd17, 0xf70e5939, 
    0xffc00b31, 0x68581511, 0x64f98fa7, 0xbefa4fa4

SHA-512

SHA-512 和 SHA-256 的結(jié)構(gòu)相同,除了:

  • SHA-512 所有的數(shù)字都是 64 位;
  • SHA-512 運(yùn)行 80 次加密循環(huán)而非 64 次;
  • SHA-512 初始值和常量拉長成 64 位;
  • 二者比特的偏移量和循環(huán)位移量不同。

SHA-384

SHA-384 和 SHA-512 基本上是相同的,除了:

  • h0 到 h7 的初始值不同;
  • SHA-384 輸出時(shí)截掉 h6 和 h7 的函數(shù)值。
// 生成規(guī)則與 SHA-512 一樣,取第 9 至第 16 個(gè)素?cái)?shù)
h[0..7] := 0xcbbb9d5dc1059ed8, 0x629a292a367cd507, 0x9159015a3070dd17, 0x152fecd8f70e5939, 
           0x67332667ffc00b31, 0x8eb44a8768581511, 0xdb0c2e0d64f98fa7, 0x47b5481dbefa4fa4

SHA-512/224 和 SHA-512/256

SHA-512/224、SHA-512/256 和 SHA-512 基本上是相同的,除了:

  • h0 到 h7 的初始值不同;
  • 輸出時(shí),h0 到 h7 組成的比特中,分別取前 244 位和前 256 位。

h0 到 h7 的生成過程中(以 SHA-512/224 為例)

  1. 先把 SHA-512 對應(yīng)的 h[0..7] 依次與 0xa5a5a5a5a5a5a5a5 進(jìn)行異或運(yùn)算,得到 h'[0..7];
  2. SHA-512 使用 h'[0..7] 對 "SHA-512/224" 字符串進(jìn)行加密處理,得到 512-bit 的 data;
  3. 把 data 分成 8 個(gè) 64-bit 的組成新的 h"[0..7]

SHA-3

SHA-3 第三代安全散列算法(Secure Hash Algorithm 3),之前名為 Keccak 算法。

Keccak 是一個(gè)加密散列算法,由 Guido Bertoni,Joan Daemen,Micha?l Peeters,以及 Gilles Van Assche 在 RadioGatún 上設(shè)計(jì)。

2012年10月2日,Keccak 被選為 NIST 散列函數(shù)競賽的勝利者。SHA-2 目前沒有出現(xiàn)明顯的弱點(diǎn)。由于對 MD5、SHA-0 和 SHA-1 出現(xiàn)成功的破解,NIST 感覺需要一個(gè)與之前算法不同的,可替換的加密散列算法,也就是現(xiàn)在的 SHA-3。

SHA-3 在2015年8月5日由 NIST 通過 FIPS 202 正式發(fā)表。

海綿結(jié)構(gòu)

海綿函數(shù)允許輸入長度和輸出長度都可變。所以海綿函數(shù)可以用于設(shè)計(jì) Hash 函數(shù)(固定輸出長度)。

SHA-3 的設(shè)計(jì)者將 SHA-3 使用的基本迭代結(jié)構(gòu)稱為海綿結(jié)構(gòu)方案。

海綿結(jié)構(gòu)分“吸收過程”和“擠出過程”兩個(gè)過程。

  • 吸收過程:把一個(gè)長度為 n 的消息,填充后,分成 k 組,每個(gè)分組的長度為 r,通過分組尾部補(bǔ) 0 擴(kuò)展其長度為 b(c = b - r,c 定義為容量),每個(gè)分組依次作為每輪迭代的輸入丟進(jìn)一個(gè)函數(shù) f 中,同時(shí)上輪迭代的輸出也反饋至下輪的迭代中,最終產(chǎn)生一組長度為 b 的輸出塊 S
  • 擠出過程:假設(shè)輸出的長度為 d,Z0 為 S 的前 r 位
    • 如果 d <= r,則直接輸出塊 Z0 的前 d 位
    • 如果 d > r, 令 c = ceil(d/r),再進(jìn)行 c - 1 次函數(shù) f 操作,一共有產(chǎn)生 c 個(gè)長度為 r 的輸出塊,依次為 Z0, Z1, ... Zc-1,拼接取前 d 位輸出
sha_img01.jpg

海綿函數(shù)由三組參數(shù)定義:

  • pad = 填充算法
  • r = 輸入分組的位長度,稱其為位速率,r 越大,海綿結(jié)構(gòu)處理消息的速度就越快
  • f = 迭代函數(shù),用于處理每輪的輸入分組,輸出一個(gè)等長的分組

關(guān)于填充算法 pad

一般海綿結(jié)構(gòu)推薦兩種填充方案

  • 簡單填充:用 pad 10* 表示,用一個(gè) 1 后面跟若干個(gè) 0 進(jìn)行填充, 0 的個(gè)數(shù)是使得總長度為分組長度整倍數(shù)的最小值;
  • 多重位速率填充:用 pad 10*1 表示,用一個(gè) 1 后面跟若干個(gè) 0,再跟一個(gè) 1 進(jìn)行填充, 0 的個(gè)數(shù)是使得總長度為分組長度整倍數(shù)的最小值。

注意:為了格式統(tǒng)一,任意消息都需要進(jìn)行填充。因此如果 n mod r = 0,那么將填充一個(gè) r 位的完整塊。

關(guān)于 SHA3 的海綿結(jié)構(gòu)

SHA3 類型 消息摘要長度 消息長度 分組長度(位速率r) 字長度 圈數(shù) 容量 c 抗碰撞攻擊 抗第二原像攻擊
SHA3-224 224 沒有限制 1152 64 24 448 2^112 2^224
SHA3-256 256 沒有限制 1088 64 24 512 2^128 2^256
SHA3-384 384 沒有限制 832 64 24 768 2^192 2^384
SHA3-512 512 沒有限制 576 64 24 1024 2^256 2^512

接下來主要看一下輪函數(shù) f 的實(shí)現(xiàn),輪函數(shù) f 每次處理塊的長度為 1600 位(即:b = 1600)。

輪函數(shù) f 的主要功能是,輸入一個(gè)長度為 b 的 s,經(jīng)過輪函數(shù) f 處理后,返回一個(gè)同樣長度的 s'。

可以表示為:s'b = f(sb)

在輪函數(shù) f 中,會(huì)把 1600 位的輸入 s,轉(zhuǎn)換成 5 * 5 * 64 的矩陣 a,然后對矩陣 a 循環(huán) 24 輪處理,每輪處理包含 5 個(gè)步驟分別是:θ, ρ, π, χ, ι。

θ 步函數(shù)

輸入一個(gè) 5 * 5 * 64 的矩陣 A,輸出 5 * 5 * 64 的矩陣 A'

C[x, z] = A[x, 0, z] ⊕ A[x, 1, z] ⊕ A[x, 2, z] ⊕ A[x, 3, z] ⊕ A[x, 4, z] (0≤x<5 and 0≤z<64)
D[x, z]=C[(x-1) mod 5, z] ⊕ C[(x+1) mod 5, (z–1) mod 64] (0≤x<5 and 0≤z<64)
A′[x, y, z] = A[x, y, z] ⊕ D[x, z] (0≤x<5, 0≤y<5, and 0≤z<64)

ρ 步函數(shù)

輸入一個(gè) 5 * 5 * 64 的矩陣 A,輸出 5 * 5 * 64 的矩陣 A'

ρ 步函數(shù)主要是對 A[x, y, z] 中的 z 進(jìn)行置換

if x == 0 && y == 0
    A'[0, 0, z] = A[0, 0, z]
else
    A'[x, y, z] = A[x, y, (z-(t+1)(t+2)/2) mod 64]

x、y、t 之間的關(guān)系,滿足在 GF(5)2*2 上:

sha_img02.png

其中 0 <= t < 24,并且 t 決定了 x 和 y 值。

比如 t = 3,會(huì)得到 x = 1 和 y = 2

sha_img03.png

矩陣中各字的循環(huán)移位值

sha_img04.png

π 步函數(shù)

輸入一個(gè) 5 * 5 * 64 的矩陣 A,輸出 5 * 5 * 64 的矩陣 A'

// 0≤x<5, 0≤y<5, and 0≤z<64
A′[x, y, z] = A[(x + 3y) mod 5, x, z]

χ 步函數(shù)

輸入一個(gè) 5 * 5 * 64 的矩陣 A,輸出 5 * 5 * 64 的矩陣 A'

// 0≤x<5, 0≤y<5, and 0≤z<64
A′[x, y, z] = A[x, y, z] ⊕ ((A[(x+1) mod 5, y, z] ⊕ 1) AND A[(x+2) mod 5, y, z])

ι 步函數(shù)

輸入一個(gè) 5 * 5 * 64 的矩陣 A,輸出 5 * 5 * 64 的矩陣 A'

A′[x, y] = A[x, y] ⊕ RC[ir], 0<= ir < 24

其中 A[x, y] 表示一個(gè) 64 位的縱,z 為 0..63

sha_img05.png

對比

類型 輸出位(Bits) 碰撞(Bits) 原像(Bits) 是否已攻破
SHA1 160 < 80 160
SHA2-224 224 112 224
SHA2-512/224 224 112 224
SHA2-256 256 128 256
SHA2-512/256 256 128 256
SHA2-384 384 192 384
SHA2-512 512 256 512
SHA3-224 224 112 224
SHA3-256 256 128 256
SHA3-348 348 192 348
SHA3-512 512 256 512

對于 Hash 函數(shù) h = H(x),稱 x 是 h 的原像。

抗原像攻擊(單向性):對任意給定的 Hash 碼 h,找到滿足 H(y) = h 的 y 在計(jì)算上是不可行的

抗第二原像攻擊(抗弱碰撞性):對任何給定的分塊x,找到滿足 y != x 且 H(x) = H(y) 的 y 在計(jì)算上是不可行的

抗碰撞攻擊(抗強(qiáng)碰撞性):找到任何滿足 H(x) = H(y) 的偶對 (x,y) 在計(jì)算上是不可行的

參考資料

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容