Back to IF4020 Kriptografi

SHA-2 - SHA-256 dan SHA-512

Questions/Cues

  • Apa perbedaan SHA-256 dan SHA-512 dari SHA-1?
  • Fungsi logika apa saja yang dipakai pada SHA-256 (Ch, Ma, Sigma)?
  • Berapa putaran, buffer awal, dan ukuran blok tiap varian?
  • Bagaimana menghitung hash di Python (teks, file, dan memeriksa integritas)?

Reference Points

  • IF4020 Kriptografi — Beberapa Fungsi Hash (Slides 20-39)

SHA-256

SHA-256 memakai kerangka Merkle-Damgård yang sama dengan SHA-1 (SHA-1 dan Konstruksi Merkle-Damgard): padding hingga , tambahan 64 bit panjang pesan, lalu pemrosesan blok 512 bit. Bedanya: 8 buffer 32 bit (bukan 5) dan 64 putaran (bukan 80), digest 256 bit.

Buffer awal ( sampai ):

abcd
6a09e667bb67ae853c6ef372a54ff53a
efgh
510e527f9b05688c1f83d9ab5be0cd19

Konstanta putaran (64 buah, satu per putaran; urut dari kiri ke kanan, 8 per baris):

428a2f9871374491b5c0fbcfe9b5dba53956c25b59f111f1923f82a4ab1c5ed5
d807aa9812835b01243185be550c7dc372be5d7480deb1fe9bdc06a7c19bf174
e49b69c1efbe47860fc19dc6240ca1cc2de92c6f4a7484aa5cb0a9dc76f988da
983e5152a831c66db00327c8bf597fc7c6e00bf3d5a7914706ca635114292967
27b70a852e1b21384d2c6dfc53380d13650a7354766a0abb81c2c92e92722c85
a2bfe8a1a81a664bc24b8b70c76c51a3d192e819d6990624f40e3585106aa070
19a4c1161e376c082748774c34b0bcb5391c0cb34ed8aa4a5b9cca4f682e6ff3
748f82ee78a5636f84c878148cc7020890befffaa4506cebbef9a3f7c67178f2

Asal nilainya (bukan angka acak): adalah 32 bit pertama dari bagian pecahan akar pangkat tiga bilangan prima ke- (2, 3, 5, 7, …). Mis. , pecahan 428a2f98. Dengan cara yang sama, buffer awal sampai berasal dari pecahan akar kuadrat delapan prima pertama. Tujuannya membuktikan tidak ada “pintu belakang” tersembunyi (nothing-up-my-sleeve numbers).

Fungsi logika per putaran ( = penjumlahan modulo , = rotasi kanan):

  • Ch (choose): memilih bit dari bila 1, dari bila 0.
  • Ma (majority): keluar 1 bila minimal dua dari bernilai 1. Pada tiap putaran, dua temporary dihitung dari kedua fungsi itu (ditambah , , ), lalu keempat buffer digeser (, , dst.). Setelah 64 putaran hasil dijumlahkan ke buffer awal blok tersebut.

Penjadwalan pesan SHA-256 (slide 23): satu blok 512 bit dipecah menjadi 16 word 32 bit ; proses ME (message expansion) memperluasnya menjadi (jadi 64 word, satu per putaran):

= rotasi kanan bit, = geser kanan bit, = penjumlahan mod . (Ini berbeda dari SHA-1 yang hanya memakai XOR dan rotasi 1 bit.)

Perbandingan SHA-1 dan SHA-256 (slide 20 dan 25):

AspekSHA-1SHA-256
StrukturMerkle-DamgårdMerkle-Damgård
Ukuran blok / word512 bit / 32 bit512 bit / 32 bit
Jumlah putaran8064
Register internal5 (A-E)8 (A-H)
Fungsi boolean4 fungsi berbeda menurut rentang putaran (AND, OR, XOR, majority)tetap: Ch, Maj, ,
Konstanta putaran 4 nilai (tergantung rentang putaran)64 konstanta (dari akar kubik prima)
Operasi utamarotasi dan penjumlahan mod rotasi, shift, dan penjumlahan mod
Collision resistancesudah ditembus (Google dan CWI 2017, SHAttered)belum ada kolisi yang diketahui
Preimage resistancemelemah, tidak lagi direkomendasikanmasih sangat kuat
Status keamanantidak aman, tidak direkomendasikan untuk kriptografi modernaman, direkomendasikan NIST
KeluargaSHA-1SHA-2 (SHA-224/256/384/512)

SHA-512

Struktur serupa dengan ukuran lebih besar: blok 1024 bit, buffer 64 bit (delapan buah, sampai , nilai awal dari pecahan akar kuadrat bilangan prima pertama), 80 putaran, digest 512 bit; panjang pesan ditambahkan dalam 128 bit. SHA-384 adalah SHA-512 dengan digest dipotong 384 bit dan nilai awal berbeda; SHA-224 serupa untuk SHA-256.

Inisialisasi buffer sampai (): delapan word 64 bit, nilainya 64 bit pertama dari pecahan akar kuadrat delapan prima pertama (2, 3, 5, 7, 11, 13, 17, 19). Bandingkan dengan SHA-256 yang memakai 32 bit pertama dari nilai yang sama (6a09e667, bb67ae85, …):

Buffer (awal)Setelah putaran 1Setelah putaran 2
6a09e667f3bcc908f6afceb8bcfcddf51320f8c9fb872cc0
bb67ae8584caa73b6a09e667f3bcc908f6afceb8bcfcddf5
3c6ef372fe94f82bbb67ae8584caa73b6a09e667f3bcc908
a54ff53a5f1d36f13c6ef372fe94f82bbb67ae8584caa73b
510e527fade682d158cb02347ab51f91c3d4ebfd48650ffa
9b05688c2b3e6c1f510e527fade682d158cb02347ab51f91
1f83d9abfb41bd6b9b05688c2b3e6c1f510e527fade682d1
5be0cd19137e21791f83d9abfb41bd6b9b05688c2b3e6c1f

Kolom pertama adalah nilai awal . Dua kolom berikutnya (pada gambar slide) memperlihatkan bagaimana isi buffer bergeser tiap putaran: nilai baru hanya muncul di dan (hasil hitungan putaran), sedangkan menerima nilai sebelumnya dan menerima sebelumnya. Nilai di dua kolom itu cocok dengan hasil putaran 1 dan 2 untuk pesan abc (kuverifikasi dengan program), jadi anggap keduanya contoh penelusuran, bukan nilai inisialisasi.

VarianDigestBlokPutaranKolisi
SHA-116051280ada cacat
SHA-224/256224/25651264belum
SHA-384/512384/512102480belum

Detail SHA-512 (slide 26-33):

  • Alur pesan (gambar 11.8): pesan bit + padding 1000...0 + 128 bit panjang pesan menjadi bit, dipecah menjadi blok (1024 bit). Mulai dari (512 bit), tiap blok masuk fungsi kompresi lalu hasilnya dijumlahkan (word demi word, mod ) dengan nilai sebelumnya, menghasilkan ; adalah hash code 512 bit.
  • Satu blok (gambar 11.9): modul message schedule membentuk dari ; ada 80 putaran, putaran ke- memakai dan ; keluaran putaran ke-79 dijumlahkan dengan menjadi .
  • Penjadwalan pesan (gambar 11.11): diambil langsung dari 16 word 64 bit blok, dan untuk :

ROTR = rotasi kanan 64 bit; SHR = geser kanan (nol masuk dari kiri; keterangan slide menyebut “left shift … zeros on the right”, yang merupakan salah tulis dari buku sumber).

  • Satu putaran (gambar 11.10 dan 11.12):
T1 = h + Ch(e,f,g) + Sigma1(e) + W_t + K_t
T2 = Sigma0(a) + Maj(a,b,c)
h = g;  g = f;  f = e;  e = d + T1
d = c;  c = b;  b = a;  a = T1 + T2
Ch(e,f,g) = (e AND f) XOR (NOT e AND g)   "jika e maka f, jika tidak g"

; semua penjumlahan modulo .

  • Algoritma lengkap (slide 33): untuk : (1) siapkan , (2) inisialisasi , (3) lakukan 80 putaran seperti di atas, (4) hitung nilai hash antara (langkah ini terpotong di slide, tetapi demikian standarnya).

Konstanta SHA-512 (80 buah, 64 bit), dibaca dari kiri ke kanan lalu ke bawah:

428a2f98d728ae227137449123ef65cdb5c0fbcfec4d3b2fe9b5dba58189dbbc
3956c25bf348b53859f111f1b605d019923f82a4af194f9bab1c5ed5da6d8118
d807aa98a303024212835b0145706fbe243185be4ee4b28c550c7dc3d5ffb4e2
72be5d74f27b896f80deb1fe3b1696b19bdc06a725c71235c19bf174cf692694
e49b69c19ef14ad2efbe4786384f25e30fc19dc68b8cd5b5240ca1cc77ac9c65
2de92c6f592b02754a7484aa6ea6e4835cb0a9dcbd41fbd476f988da831153b5
983e5152ee66dfaba831c66d2db43210b00327c898fb213fbf597fc7beef0ee4
c6e00bf33da88fc2d5a79147930aa72506ca6351e003826f142929670a0e6e70
27b70a8546d22ffc2e1b21385c26c9264d2c6dfc5ac42aed53380d139d95b3df
650a73548baf63de766a0abb3c77b2a881c2c92e47edaee692722c851482353b
a2bfe8a14cf10364a81a664bbc423001c24b8b70d0f89791c76c51a30654be30
d192e819d6ef5218d69906245565a910f40e35855771202a106aa07032bbd1b8
19a4c116b8d2d0c81e376c085141ab532748774cdf8eeb9934b0bcb5e19b48a8
391c0cb3c5c95a634ed8aa4ae3418acb5b9cca4f7763e373682e6ff3d6b2b8a3
748f82ee5defb2fc78a5636f43172f6084c87814a1f0ab728cc702081a6439ec
90befffa23631e28a4506cebde82bde9bef9a3f7b2c67915c67178f2e372532b
ca273eceea26619cd186b8c721c0c207eada7dd6cde0eb1ef57d4f7fee6ed178
06f067aa72176fba0a637dc5a2c898a6113f9804bef90dae1b710b35131c471b
28db77f523047d8432caab7b40c724933c9ebe0a15c9bebc431d67c49c100d4c
4cc5d4becb3e42b6597f299cfc657e2a5fcb6fab3ad6faec6c44198c4a475817

(Seperti SHA-256, adalah 64 bit pertama pecahan akar pangkat tiga bilangan prima ke-; kuverifikasi dengan program.)

Hash dengan Python (hashlib)

import hashlib
pesan = b'Yogyakarta kota kenangan'          # b: string menjadi bytes
print(hashlib.md5(pesan).hexdigest())        # df6ec566eb228237a59e012e343ecb13
print(hashlib.sha1(pesan).hexdigest())       # aa8adef498e0ffd2222f49a0021d645b9f8cfa4d
print(hashlib.sha256(pesan).hexdigest())     # c2494851d6345fac3810...2145707f

Tiga pola pemakaian di slide:

  1. Teks dari kode: pakai literal b'...'.
  2. Teks dari keyboard: message.encode('utf-8') karena hash bekerja pada bytes, bukan string.
  3. File: hash = hashlib.sha256(), baca berkas mode 'rb' per 1024 byte, hash.update(chunk) berulang, lalu hash.hexdigest().

Contoh keluaran slide 38 untuk berkas 07-AES-(2025).pptx: 386e7a95c3b3e73d3fcd4e05e7e05efb7cd926844741e5cf434e66c16efe1fe7. Slide mencetak label “Nilai hash SHA1”, padahal kodenya memakai hashlib.sha256() dan keluarannya 64 digit heksa (256 bit); label itu salah tulis. Contoh teks dari keyboard (slide 36): Mereka pergi ke Gunung Tangkubanperahu pukul 9.00 SHA-256 389384279fda7612c44045fb433ccb8069c642f59049395c3b5a5490fd4ccb4c.

Memeriksa integritas: hash Yogyakarta kota kenangan dan Yogyakarta koti kenangan dibandingkan dengan ==; berbeda “Pesan sudah diubah”.

flowchart TD
    A["SHA-256: 8 buffer 32-bit<br/>64 putaran, blok 512"] --> B["Ch, Ma, Sigma0, Sigma1<br/>penjumlahan mod 2^32"]
    C["SHA-512: 8 buffer 64-bit<br/>80 putaran, blok 1024"] --> B

Summary

SHA-256 mempertahankan struktur Merkle-Damgård SHA-1 tetapi memakai 8 buffer 32-bit (nilai awal 6a09e667, bb67ae85, …), 64 putaran, blok 512 bit, dan digest 256 bit dengan fungsi Ch, Ma, (rotasi 2, 13, 22), (rotasi 6, 11, 25), serta penjumlahan modulo . SHA-512 memakai blok 1024 bit, buffer 64 bit, 80 putaran, dan digest 512 bit. Keduanya belum ditemukan kolisinya. Di Python, hashlib menghitung MD5/SHA-1/SHA-256/SHA-512 atas bytes (teks lewat encode('utf-8'), file dibaca per bagian), dan integritas diperiksa dengan membandingkan dua hexdigest.