SHA-2

kriptográfiai hash-függvények csoportja
(SHA-256 szócikkből átirányítva)

Az SHA-2 (angolul: Secure Hash Algorithm 2) kriptográfiai hash-függvények csoportja, melyet az Egyesült Államok Nemzetbiztonsági Ügynöksége (NSA) tervezett és publikált 2002-ben.[1] A publikált dokumentum az SHA-1 mellett három új függvényt definiált: SHA-256, SHA-384 és SHA-512 néven, ahol a számok a függvények lenyomatának a bitekben meghatározott hosszát jelölik. 2015 augusztusában az NSA a FIPS PUB 180-4 kiadványában bővítette a függvények számát, így a SHA-2 család hat hash függvényből áll: SHA-224, SHA-256, SHA-384, SHA-512, SHA-512/224, SHA-512/256.[2]

Története szerkesztés

Az Egyesült Államok Nemzetbiztonsági Ügynöksége (NSA) a Capstone projekt[3] keretében kapott megbízást, hogy olyan biztonságos kriptográfiai algoritmusokat fejlesszen ki, amely megfelelnek az Egyesült Államokban 1987-ben elfogadott számítógép-biztonsági törvénynek (angolul: Computer Security Act). Ennek eredménye a Secure Hash Algorithm (SHA), melynek leírását 1993-ban publikálta az amerikai Nemzeti Szabványügyi és Technológiai Intézet (NIST) a FIPS 180 elnevezésű dokumentumban.[4] Az első specifikációban szereplő algoritmusra a szakmai körökben SHA-0 néven hivatkoznak. A szabványt 1995-ben az FIPS 180-1 elnevezésű leírásban felülbírálták, ez a SHA-1 nevű függvény első definícióját tartalmazta.[5]

Az SHA-2 algoritmusok első ismertetője a 2002-ben kiadott FIPS 180-2 kiadványban szerepelt.[1] A leírás a korábbi SHA-1 algoritmus mellett megfogalmazta az SHA-256, SHA-384 valamint SHA-512 függvényeket.

A FIPS 180-2 leírásból 2004-ben kiadtak egy újabb változatot, amely az SHA-2 családot bővítette az SHA-224 függvénnyel.[6]

Felhasználása szerkesztés

A hash függvény olyan függvény, amely tetszőleges hosszúságú bemeneti üzenetből egy rögzített hosszúságú karakterláncot („ujjlenyomat”) hoz létre. A kriptográfiai hash függvények számos olyan tulajdonsággal rendelkeznek, amelyek alkalmassá teszik őket az üzenet integritásának ellenőrzésére és a digitális aláírási megoldások részeként történő használatra.

Az SHA-2 hash függvényeket számos biztonsági alkalmazásban és protokollban alkalmazzák, úgy mint a TLS, az SSL, a PGP, az SSH, az S/MIME és az IPsec.

A Bitcoin digitális fizetőeszköz és klónjai SHA-256 algoritmust használnak.

Megbízhatósága szerkesztés

A kriptográfiai módszerek sebezhetőségeinek feltárásával a kriptoanalízis foglalkozik, célja a bennük elrejtett információ felfedése, támadási lehetőségeinek vizsgálata.

Egy hash függvénynél az előkép megszerzésére irányuló támadás esetén, ahol a kódolt hashben lévő bitek száma L, egy adott üzenet megtalálásához „nyers erővel” avagy brute force-támadással 2L kiértékelés elvégzésére van szükség. Ez a fajta módszer nagyban függ a felhasználható számítási kapacitástól, és így a variációk számának nagyságától függően a sikeresség elérése időben vagy pénzügyileg adott esetben kevésbé gazdaságos.

Egy másik támadási vektor az ütközések keresése (angolul: collision attack), amikor a cél hogy eltérő bemenetre ugyanazt a kimenetet generálja a függvény. Ennek a megoldásnak ugyan a brute force támadással ellentétben más a célja, de azt bizonyítja hogy lehetséges a függvény kompromittálása. A megoldásához L bitet tartalmazó kódolt hash esetében átlagosan 2L/2 kiértékelésre lehet szükség, ami nagyságrendekkel gazdaságosabban kivitelezhető mint a nyers erővel történő támadási formával.

SHA-1 esetében a Google kutatói 2017-ben publikáltak egy dokumentumot, amely két eltérő fájl esetében ugyanazon hash értéket előállítását mutatja be.[7] A tanulmány szerint a megoldáshoz 263.1 műveletre volt szükség, aminek futtatására 65 000 évre volna szükség egy processzorros (single-CPU) rendszerrel és 110 évig tartana ugyanez egy grafikai processzor (single-GPU) alkalmazásával. Ezzel szemben egy teoretikus brute force támadás 12 000 000 évbe telne grafikai processzor (single-GPU) használatával.

2019-ben francia és szingapúri kutatók publikációjukban szintén az SHA-1 függvény sebezhetőségét állapították meg, amihez egy szabadon megválasztható a prefixű ütközéses támadást használtak.[8]

SHA-2 esetében is több tanulmány készült a lehetséges támadási vektorokról.

Publikációk az SHA-2 támadásokról szerkesztés

Publikáció Publikálás éve Támadási mód Támadás Változat Lépésszám Nehézség
New Collision Attacks Against
Up To 24-step SHA-2[9]
2008 determinisztikus ütközés keresés SHA-256 24/64 228.5
SHA-512 24/80 232.5

Minta kimenetek szerkesztés

Az SHA-2 függvények kimenete üres (nulla hosszúságú üzenet) bemenetek esetén:

SHA224("")
0x d14a028c2a3a2bc9476102bb288234c415a2b01f828ea62ac5b3e42f
SHA256("")
0x e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
SHA384("")
0x 38b060a751ac96384cd9327eb1b1e36a21fdb71114be07434c0cc7bf63f6e1da274edebfe76f65fbd51ad2f14898b95b
SHA512("")
0x cf83e1357eefb8bdf1542850d66d8007d620e4050b5715dc83f4a921d36ce9ce47d0d13c5d85f2b0ff8318d2877eec2f63b931bd47417a81a538327af927da3e
SHA512/224("")
0x 6ed0dd02806fa89e25de060c19d3ac86cabb87d6a0ddd05c333b84f4
SHA512/256("")
0x c672b8d1ef56ed28ab87c3622c5114069bdd3ad7b8f9737498d0c01ecef0967a

Még az üzenet egy kis változtatása is (nagy valószínűséggel) jelentősen eltérő eredményt ad a lavinahatás (angolul: avalanche effect) következtében.

Például a következő esetben az üzenetek csak egyetlen karakterben térnek el (a szavak Hamming-távolsága egy), a kimenet mégis teljesen eltérő:

SHA256("majom")
0x 56026d01f89f22ae2293833a736b5bcdc8cbee4852d3c3ab2067000f969d38fa
SHA256("bajom")
0x 390e091b2978c04af5258725d9ea52c98f7d6d3cec11981bf88e638daf870782

Pszeudokód szerkesztés

SHA-256 szerkesztés

Változók kezdőértékének a beállítása:
h0 := 0x6a09e667
h1 := 0xbb67ae85
h2 := 0x3c6ef372
h3 := 0xa54ff53a
h4 := 0x510e527f
h5 := 0x9b05688c
h6 := 0x1f83d9ab
h7 := 0x5be0cd19

Konstansok értékének a beállítása:
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

Előfeldolgozás:
begin with the original message of length L bits
append a single '1' bit
append K '0' bits, where K is the minimum number >= 0 such that L + 1 + K + 64 is a multiple of 512
append L as a 64-bit big-endian integer, making the total post-processed length a multiple of 512 bits
such that the bits in the message are L 1 00..<K 0's>..00 <L as 64 bit integer> = k*512 total bits

Az üzenet egymást követő 512-bites darabjaira a következő műveletek végrehajtása:
break message into 512-bit chunks
for each chunk
    create a 64-entry message schedule array w[0..63] of 32-bit words
    (A w[0..63] kezdőértékei nem számítanak, ezért sok implementáció kinullázza őket)
    copy chunk into first 16 words w[0..15] of the message schedule array

    Az első 16 darab 32 bites szó kiterjesztése 64 bitesre:
    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 használni kívánt változók inicializálása az aktuális hash értékekre:
    a := h0
    b := h1
    c := h2
    d := h3
    e := h4
    f := h5
    g := h6
    h := h7

    Tömörítési funkció fő ciklusa:
    for i from 0 to 63
        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]
        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

        h := g
        g := f
        f := e
        e := d + t1
        d := c
        c := b
        b := a
        a := t1 + t2

    A tömörített darab hozzáadása az aktuális hash értékhez:
    h0 := h0 + a
    h1 := h1 + b
    h2 := h2 + c
    h3 := h3 + d
    h4 := h4 + e
    h5 := h5 + f
    h6 := h6 + g
    h7 := h7 + h

A végső hash érték előállítása (big endianként):
digest := hash := h0 append h1 append h2 append h3 append h4 append h5 append h6 append h7

SHA-224 szerkesztés

Az SHA-224 szinte teljesen megegyezik az SHA-256 megoldásával, csupán a kezdeti h0 és h7 hash értékek eltérőek, és a kimenet a h7 hozzáfűzése nélkül áll össze.

SHA-224 kezdőértékek (big endianként):

h[0..7] := 0xc1059ed8, 0x367cd507, 0x3070dd17, 0xf70e5939, 0xffc00b31, 0x68581511, 0x64f98fa7, 0xbefa4fa4

SHA-512 szerkesztés

Az SHA-512 esetében a számok 64 bit hosszúak, az üzenet 1024-bites darabokra van osztva, a k tömb pedig 80 elemű. A fő ciklus 64 helyett 80-szor fut le és a használt eltolási és forgatási bitek számai is eltérőek.

SHA-512 kezdőértékek (big endianként):

h[0..7] := 0x6a09e667f3bcc908, 0xbb67ae8584caa73b, 0x3c6ef372fe94f82b, 0xa54ff53a5f1d36f1, 
           0x510e527fade682d1, 0x9b05688c2b3e6c1f, 0x1f83d9abfb41bd6b, 0x5be0cd19137e2179
SHA-512 konstansok:

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]
SHA-512 fő ciklus funkciók:

S0 := (a rightrotate 28) xor (a rightrotate 34) xor (a rightrotate 39)
S1 := (e rightrotate 14) xor (e rightrotate 18) xor (e rightrotate 41)

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)

Jegyzetek szerkesztés

  1. a b Announcing Approval of Federal Information Processing Standard (FIPS) 180-2, Secure Hash Standard; a Revision of FIPS 180-1. www.federalregister.gov (angolul) (2002. augusztus 26.) (Hozzáférés: 2021. november 9.)
  2. FIPS PUB 180-4: Secure Hash Standard (SHS). nvlpubs.nist.gov (angolul) (2015. augusztus) (Hozzáférés: 2021. november 9.)
  3. What is Capstone? x5.net (angolul) (Hozzáférés: 2021. november 10.)
  4. FIPS 180 – Secure Hash Standard (SHS). csrc.nist.gov (angolul) (1993. május 11.) (Hozzáférés: 2021. november 10.)
  5. FIPS 180-1 – Secure Hash Standard. csrc.nist.gov (angolul) (1995. április 17.) (Hozzáférés: 2021. november 10.)
  6. FIPS Publication 180-2 (with Change Notice 1). csrc.nist.gov (angolul) (2004. február 25.) (Hozzáférés: 2021. november 10.)
  7. SHAttered: The first collision for full SHA-1. shattered.it (angolul) (Hozzáférés: 2021. november 10.)
  8. Nemzeti Kibervédelmi Intézet – Újabb szög az SHA-1 koporsójába. nki.gov.hu (magyarul) (Hozzáférés: 2021. november 10.)
  9. Somitra Kumar Sanadhya (2008). „New Collision Attacks Against Up To 24-step SHA-2”. IACR Cryptology ePrint Archive 2008:270.  

Források szerkesztés

További információk szerkesztés