**SHA-2** atau **AHK-2** (**Secure Hash Algorithm 2**, bahasa Indonesia: **Algoritma Hash Kuat 2**)adalah sebuah fungsi kriptografik hash yang didisain oleh Badan Keamanan Nasional (BKN) Amerika Serikat dan pertama kali dipublikasikan pada tahun 2001. Set ini dibangun menggunakan Konstruksi Merkle–Damgård, fungsi kompresi satu arahnya dibangun dengan menggunakan struktur Davies–Meyer dari *block chipher* yang dispesialisasikan.

SHA-2 memasukkan perubahan signifikan dibanding pendahulunya, SHA-1. Keluarga SHA-2 terdiri dari enam fungsi hash dengan perpendekan (nilai hash) yang berupa bita 224, 256, 384 atau 512: **SHA-224, SHA-256, SHA-384, SHA-512, SHA-512/224, SHA-512/256**. SHA-256 dan SHA-512 merupakan fungsi hash yang diprogram dengan delapan kata 32-bit dan 64-bit. Pengkodean ini menggunakan jumlah pergeseran dan konstanta penambahan yang berbeda, tetapi strukturnya sebenarnya hampir identik, hanya berbeda dalam jumlah rentetan pengkodean. SHA-224 dan SHA-384 merupakan versi terpotong dari SHA-256 dan SHA-512, dikodekan dengan nilai inisial berbeda. SHA-512/224 dan SHA-512/256 juga merupakan versi terpotong dari SHA-512, namun nilai inisialnya dihasilkan menggunakan metode yang dideskripsikan di Federal Information Processing Standards (FIPS) PUB 180-4.

SHA-2 dipublikasikan pertama kali oleh Institusi Nasional Umum dan Teknogi (INUK) sebagai standar federasi Amerika Serikat (FIPS). Keluarga algoritma SHA-2 dipatenkan di hak paten Amerika serikat nomor 6829355. Pemerintah Amerika Serikat mengeluarkan paten ini dibawah lisensi bebas pajak (*royalty-free*).

Pada tahun 2011, terdapat serangan publik terbaik yang merusak resistensi *preimage* untuk 57 dari 80 rentetan pengkodean SHA-512 dan 52 dari 64 rentetan pengkodean SHA-256.\*-++

Standar hash
------------

Satu iterasi dalam fungsi kompresi keluarga SHA-2.
Komponen biru melakukan operasi berikut:  

    {\displaystyle \operatorname {Ch} (E,F,G)=(E\land F)\oplus (\neg E\land G)}  

    {\displaystyle \operatorname {Ma} (A,B,C)=(A\land B)\oplus (A\land C)\oplus (B\land C)}  

    {\displaystyle \Sigma \_{0}(A)=(A\!\ggg \!2)\oplus (A\!\ggg \!13)\oplus (A\!\ggg \!22)}  

    {\displaystyle \Sigma \_{1}(E)=(E\!\ggg \!6)\oplus (E\!\ggg \!11)\oplus (E\!\ggg \!25)}   
 Rotasi penentu bita menggunakan konstanta berbeda untuk SSHA-512.Angka yang diberikan adalah untuk SHA-256.  

Komponen warna merah {\displaystyle \color {red}\boxplus } merupakan tambahan (adisi) dari modul 232 untuk SHA-256, atau 264 untuk SHA-512.

Dengan publikasi FIPS PUB 180-2, NIST menambahkan tiga fungsi penambahan hash pada keluarga SHA. Algoritma tersebut secara kolektif dinamakan sebagai SHA-2, yang dinamakan atas perpendekan panjang (dalam bita): SHA-256, SHA-384, dan SHA-512.

Vektor uji coba
---------------

Nilai hash dari *string* kosong (input teks sepanjang nol).

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

Bahkan perubahan kecil dalam suatu pesan (dengan kemungkinan sangat besar) akan menghasilkan hash yang sangat berbeda, dikarenakan efek Avalanche. Sebagai contoh, menambahkan titik pada suatu kalimat dapat mengubah banyak dari bita di dalam hash:

```
SHA224("Saya suka menyunting di Wikipedia")
0x 82bcdccfbc2763dbfbbda3a4669eb3182e6cd7169b0b81a1b8d6b4b1
SHA224("Saya suka menyunting di Wikipedia.")
0x b71c91e1cd82d017ce78391b47b29ce792294f2673136dd25aace018
```

*Pseudocode*
------------

*Pseudocode* untuk algoritma SHA-256 adalah sebagai berikut. Perlu diingiat bahwa terdapat peningkatan luar biasa dalam pencampuran antara bita-bita dari `w[16..63]` kata dibandingkan SHA-1.

```
*Catatan 1: Semua variabel merupakan integral 32 bit yang belum dan dengan tambahan modulo kalkulasi 232*
*Catatan 2: Untuk setiap putaran, terdapat satu putaran konstan k[i&#93, dan satu entri dalam schedule array w[i], 0 ≤ i ≤ 63*
*Catatan 3: Kompresi fungsi menggunakan 8 variabel yang sedang bekerja, a melewati h*
*Catatan 4: Konvensi Big-endian digunakan ketika mengekspresiman konstanta dalam pseudocode ini,*
    *dan saat melakukan parsing dalam data blok pesan dari bita ke huruf, sebagai contoh,*
    *huruf pertama dalam pesan masukan adalah "abc" setelah padding menunjukkan 0x61626380*
*Inisialisasi nilai hash:*
(32 bita pertama dari *bagian fraksional* dari akar kuadrat dari 8 bilangan prima pertama 2..19):
h0 := 0x6a09e667
h1 := 0xbb67ae85
h2 := 0x3c6ef372
h3 := 0xa54ff53a
h4 := 0x510e527f
h5 := 0x9b05688c
h6 := 0x1f83d9ab
h7 := 0x5be0cd19

*Inisalisasi array konstanta putaran:*
(32 bita pertama dari *bagian fraksional* dari akar kubik dari 64 bilangan prima pertama 2..311):
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

*Pra-proses (Padding):*
dimulai dengan pesan awal dengan panjang L bita
penambahan bita '1' tunggal
penambahan K '0' bita, dimana K merupakan nilai minimal bilangan >= 0 dan (L + 1 + K + 64) merupakan kelipatan 512
penmbahan L sebagai intergral big-endian 64-bita, membuat panjang setelah-proses sebagai kelipatan dari 512 bita   
dan disusun sedemikian rupa sehingga bit dalam pesan adalah: <pesan awal dengan panjang L> 1 <nol sebanyak K> <L sebagai intergral 64 bita> , (jumlah bita akan menjadi kelipatan dari 512)

*Memproses pesan dalam chunk suksesif 512 bita:*
memecah pesan menjadi chunk-chunk 512-bita
**untuk** setiap chunk
    membuat sebuah pesan schedule array 64-masukan w[0..63] dari kata 32 bita
    *(Nilai inisial dalam w[0..63] tidak akan dipermasalahkan, sehingga banuak implementasi nol dari ini disini)*
    menyalin chunk menjadi 16 huruf pertama w[0..15] dari pesan schedule array

    *Memanjangkan 16 huruf pertama menjadi 48 huruf sisanya w[16..63] dari pesam schedule array:*
    **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

    *Inisialisasi variabel yang sedang bekerja ke nilai hash kini:*
    a := h0
    b := h1
    c := h2
    d := h3
    e := h4
    f := h5
    g := h6
    h := h7

    *Kompresi fungsi loop utama:*
    **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)
        temp1 := 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)
        temp2 := S0 **+** maj
 
        h := g
        g := f
        f := e
        e := d **+** temp1
        d := c
        c := b
        b := a
        a := temp1 **+** temp2

    *Menambahkan chunk terkompresi pada nilai hash kini:*
    h0 := h0 **+** a
    h1 := h1 **+** b
    h2 := h2 **+** c
    h3 := h3 **+** d
    h4 := h4 **+** e
    h5 := h5 **+** f
    h6 := h6 **+** g
    h7 := h7 **+** h

''*Menghasilkan nilai hash akhir (big-endian):*
digest := hash := h0 **append** h1 **append** h2 **append** h3 **append** h4 **append** h5 **append** h6 **append** h7
```

Komputasi dari nilai `ch` dan `maj` dapat dioptimalkan menggunakan cara yang sama dengan yang diatur dalam SHA-1.

SHA-224 identikal dengan SHA-256, kecuali:

* nilai hash inisial `h0` melewati `h7` berbeda, and
* output yang dikonstruksikan dengan peluluhan `h7`.

```
Nilai hash inisial SHA-224 (dalam big endian):
(32 bita kedua dari bagian fraksional dari akar kuadrat dari bilangan prima ke-9 ke ke-16 23..53)
h[0..7] :=
    0xc1059ed8, 0x367cd507, 0x3070dd17, 0xf70e5939, 0xffc00b31, 0x68581511, 0x64f98fa7, 0xbefa4fa4
```

SHA-512 identikal dalam konteks struktur dengan SHA-256, namun:

* pesan dipecah menjadi chunk 1024 bita
* nilai hash inisial dan konstanta putara diperpanjang ke 64 bita,
* terdapat 80 putaran dan bukan 64,
* schedule array pesan w memiliki 80 kata 64 bita dan bukan 64 kata 32 bita,
* untuk memperpanjang schedule array pesan w, loop dari 16 ke 79 dan bukan dari 16 ke 63,
* konstanra bulat didasarkan pada 80 bilangan prima pertama 2..409,
* ukuran kata yang digunakan untuk kalkulasi adalah sepanjang 64 bita,
* panjang yang ditambahkan dari pesan (sebelum pra-proses), dalam *bita*, adalah sebuah integral big-edian 128 bita, dan
* banyak nilai shift dan rotate yang digunakan berbeda.

```
Nilai isial hash SHA-512 (dalam big-endian):

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

Putaran konstanta SHA-512:

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 Sum & Sigma:

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)
```

SHA-384 identikal dengan SHA-512, kecuali:

* nilai inisial hash `h0` melalui `h7` berbeda (diambil dari bilangan prima ke-9 sampai ke-16), dan
* output disusun oleh peluluhan `h6` dan `h7`.

```
Nilai hash inisial SHA-384 (dalam big-endian):

h[0..7] := 0xcbbb9d5dc1059ed8, 0x629a292a367cd507, 0x9159015a3070dd17, 0x152fecd8f70e5939, 
           0x67332667ffc00b31, 0x8eb44a8768581511, 0xdb0c2e0d64f98fa7, 0x47b5481dbefa4fa4
```

SHA-512/t identikal teehadap SHA-512 kecuali:

* nilau inisial hash `h0` melalui `h7` diberikan oleh *SHA-512/t IV generation function*,
* output disusun oleh perpotongan rangkaian dari `h0` melalu `h7` di *t* bita,
* nilau *t* tidak diperbolehkan setara dengan 384 dalam SHA-384
* nilai *t* 224 dan 256 disetujui.

*SHA-512/t IV generation function* mengevaluasi *SHA-512* yang dimodifikasi pada string ASCII "SHA-512/*t*", diganti dengan representasi desimal *t*. *SHA-512* yang dimodifikasi sama dengan SHA-512 kecuali nilai awalnya `h0` yang melewati `h7` telah di-XORed dengan konstanta heksadesimal `0xa5a5a5a5a5a5a5a5`.

Contoh implementasi C untuk keluarga fungsi hash SHA-2 dapat ditemukan di RFC 6234.

Referensi
---------

1. 1 2
2. 1 2
3. ↑  "On the Secure Hash Algorithm family" (PDF). Diarsipkan dari versi asli (PDF) tanggal 2016-03-30.  Parameter `|url-status=` yang tidak diketahui akan diabaikan (bantuan)
4. ↑
5. ↑  US 6829355
6. ↑  "IPR Details: The United States of America as represented by the National Security Agency's general license statement". *IETF Datatracker*. 858. Diakses tanggal 2008-02-17.