SHA-1 skraćenica je od engleske složenice Secure Hash Algorithm i ime je za algoritam koji služi za provjeru autentičnosti datoteka ili poruke prilikom prijenosa između pošiljaoca i primatelja. SHA-1 je nasljednik MD-5 i koristi se u raznim sigurnosnim programima ili u protokomima kao što su: TLS, SSL, PGP, SSH, S/MIME, i IPsec. SHA-1 je kompromitiran 2002. [1] nakon čega je razvijena poboljšana inačica SHA-2.
Pseudokod algoritma SHA-1 :
Opaska: Sve varijable su unsigned 32 bita dugačke modulo 232 kod računanja Inicijaliziraj varijable: h0 := 0x67452301 h1 := 0xEFCDAB89 h2 := 0x98BADCFE h3 := 0x10325476 h4 := 0xC3D2E1F0 Pred-obrada: dodaj bit '1' na kraj poruke dodaj k bitova '0', gdje je k broj >= 0 tako da rezutirajuća poruka duljina (u bitovima) je congruent 448 (mod 512) dodaj duljinu poruke (prije pred-obrade), u bitovima, kao 64-bitni big-endian cijeli broj Obradi poruku u sekventim nizovima od 512-bita: razbij poruku u komade od 512-bita za svaki komad razbij komad u šestnaest 32-bitnih big-endian riječi w[i], 0 ≤ i ≤ 15 Produži šesnaest 32-bitne u osam 32-bitne riječi: za i od 16 do 79 w[i] := (w[i-3] xor w[i-8] xor w[i-14] xor w[i-16]) rotirajlijevo 1 Inicializiraj hash vrijednost za svaki komad: a := h0 b := h1 c := h2 d := h3 e := h4 Glavna petlja: za i od 0 do 79 ako je 0 ≤ i ≤ 19 tada f := (b and c) or ((not b) and d) k := 0x5A827999 inače ako je 20 ≤ i ≤ 39 f := b xor c xor d k := 0x6ED9EBA1 inače ako je 40 ≤ i ≤ 59 f := (b i c) or (b i d) or (c i d) k := 0x8F1BBCDC inače ako je 60 ≤ i ≤ 79 f := b xor c xor d k := 0xCA62C1D6 temp := (a rotrirajlijevo 5) + f + e + k + w[i] e := d d := c c := b rotirajlijevo 30 b := a a := temp Dodaj hash ovog komada na dosadašnji rezultat: h0 := h0 + a h1 := h1 + b h2 := h2 + c h3 := h3 + d h4 := h4 + e Proizvedi završnu hash vrijednost (big-endian): digest = hash = h0 poveži h1 poveži h2 poveži h3 poveži h4
Umjesto uporabe originalne formulacije u FIPS PUB 180-1 može se upotrijebiti sljedeći izraz f
u glavoj petlji prikazanoj iznad:
(0 ≤ i ≤ 19): f := d xor (b i (c xor d)) (alternative) (40 ≤ i ≤ 59): f := (b i c) ili (d i (b ili c)) (alternativa 1) (40 ≤ i ≤ 59): f := (b i c) ili (d i (b xor c)) (alternativa 2) (40 ≤ i ≤ 59): f := (b i c) + (d i (b xor c)) (alternativa 3)