Ugrás a tartalomhoz

SHA-2

Ellenőrzött
A Wikipédiából, a szabad enciklopédiából

AzSHA-2(angolul:Secure Hash Algorithm 2)kriptográfiaihash-függvényekcsoportja, melyet azEgyesü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 abitekbenmeghatá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 aSecure 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 aSHA-1nevű 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]

Ahash függvényolyan 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 aTLS,azSSL,aPGP,azSSH,az S/MIME és azIPsec.

ABitcoindigitá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ámaL,egy adott üzenet megtalálásához „nyers erővel” avagybrute force-támadással2Lkié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áhozLbitet tartalmazó kódolt hash esetében átlagosan 2L/2kié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.1műveletre volt szükség, aminek futtatására 65 000 évre volna szükség egyprocesszorros(single-CPU) rendszerrel és 110 évig tartana ugyanez egygrafikai 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 szavakHamming-távolságaegy), 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
foreach 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:
forifrom16 to 63
s0:= (w[i-15]rightrotate7)xor(w[i-15]rightrotate18)xor(w[i-15]rightshift3)
s1:= (w[i- 2]rightrotate17)xor(w[i- 2]rightrotate19)xor(w[i- 2]rightshift10)
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:
forifrom0 to 63
S1:= (erightrotate6)xor(erightrotate11)xor(erightrotate25)
ch:= (eandf)xor((note)andg)
t1:= h+S1+ch+k[i]+w[i]
S0:= (arightrotate2)xor(arightrotate13)xor(arightrotate22)
maj:= (aandb)xor(aandc)xor(bandc)
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:= h0appendh1appendh2appendh3appendh4appendh5appendh6appendh7

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:= (arightrotate28)xor(arightrotate34)xor(arightrotate39)
S1:= (erightrotate14)xor(erightrotate18)xor(erightrotate41)

s0:= (w[i-15]rightrotate1)xor(w[i-15]rightrotate8)xor(w[i-15]rightshift7)
s1:= (w[i-2]rightrotate19)xor(w[i-2]rightrotate61)xor(w[i-2]rightshift6)

Jegyzetek

[szerkesztés]
  1. abAnnouncing 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 Archive2008:270.

Források

[szerkesztés]

További információk

[szerkesztés]