SHA-256 내부 구조

패딩 → 64바이트 블록 → 블록마다 f(Hᵢ₋₁, Mᵢ) = Hᵢ · 마지막 H가 SHA-256 결과

1. 패딩과 블록

  1. 1

    글자를 바이트로 바꾸기

    메시지길이 제한 없음
    안녕하세요
    바이트15바이트
    ec9588eb8595ed9598ec84b8ec9a94
  2. 2

    뒤에 0x80, 0, 길이를 붙여 64바이트의 배수로 맞추기

    바이트15바이트↑ 1단계 결과
    ec9588eb8595ed9598ec84b8ec9a94
    패딩한 메시지64바이트
    메시지ec9588eb8595ed9598ec84b8ec9a94
    0x8080
    0 × 4000000000000000000000000000000000000000000000000000000000000000000000000000000000
    길이8바이트0000000000000078
  3. 3

    64바이트 블록 1개로 자르기

    패딩한 메시지64바이트↑ 2단계 결과
    ec9588eb8595ed9598ec84b8ec9a9480000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000078
    M₁64바이트
    ec9588eb8595ed9598ec84b8ec9a9480000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000078

2. 메시지 확장: M₁ → W₀ … W₆₃

M₁64바이트
ec9588eb8595ed9598ec84b8ec9a9480000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000078
메시지 확장 W64개 × 4바이트
W₀ec9588ebW₁8595ed95W₂98ec84b8W₃ec9a9480W₄00000000W₅00000000W₆00000000W₇00000000W₈00000000W₉00000000W₁₀00000000W₁₁00000000W₁₂00000000W₁₃00000000W₁₄00000000W₁₅00000078W₁₆2d727ff7W₁₇c8cb5d3aW₁₈c26510dfW₁₉b1a2a42bW₂₀2a44803aW₂₁06bcc64cW₂₂d010c1c2W₂₃2960acafW₂₄41b89374W₂₅062d3a96W₂₆0d676afaW₂₇645cc8d7W₂₈5edde511W₂₉cd790b59W₃₀67bbe08aW₃₁5ab6759aW₃₂7bb39b8eW₃₃ae9b2c67W₃₄cdc7f5a4W₃₅5527a127W₃₆a55cfb23W₃₇42ed3e74W₃₈7df9472bW₃₉a261cdc7W₄₀de2feb99W₄₁e2718e1cW₄₂fb8e64e5W₄₃50d185eeW₄₄897f64d7W₄₅1debbad5W₄₆0b764d8fW₄₇d8804383W₄₈5f319b62W₄₉80fb8abaW₅₀c9ab91d9W₅₁fffb0443W₅₂2d73da05W₅₃39880fdbW₅₄d53c0d4aW₅₅da4bd84eW₅₆2c72dfd0W₅₇90f4f345W₅₈e7627faaW₅₉cd3c9757W₆₀7a5553c9W₆₁58b60032W₆₂f5872be8W₆₃6e7d35b6
Wₜ (t < 16)
= Mᵢ의 t번째 4바이트
Wₜ (t ≥ 16)
= σ₁(Wₜ₋₂) + Wₜ₋₇ + σ₀(Wₜ₋₁₅) + Wₜ₋₁₆ (mod 2³²)
σ₀(x)
= ROTR⁷(x) ⊕ ROTR¹⁸(x) ⊕ SHR³(x)
σ₁(x)
= ROTR¹⁷(x) ⊕ ROTR¹⁹(x) ⊕ SHR¹⁰(x)

3. 64라운드: a … h 갱신

T₁
= h + Σ₁(e) + Ch(e, f, g) + Kₜ + Wₜ
T₂
= Σ₀(a) + Maj(a, b, c)
새 a … h
= T₁ + T₂, a, b, c, d + T₁, e, f, g
Σ₀(x)
= ROTR²(x) ⊕ ROTR¹³(x) ⊕ ROTR²²(x)
Σ₁(x)
= ROTR⁶(x) ⊕ ROTR¹¹(x) ⊕ ROTR²⁵(x)
Ch(e, f, g)
= (e ∧ f) ⊕ (¬e ∧ g) e가 1이면 f, 0이면 g를 고름
Maj(a, b, c)
= (a ∧ b) ⊕ (a ∧ c) ⊕ (b ∧ c) 세 비트 중 다수
tKₜ4바이트Wₜ64개 × 4바이트abcdefgh
시작6a09e667bb67ae853c6ef372a54ff53a510e527f9b05688c1f83d9ab5be0cd19
0428a2f98ec9588ebe89e11386a09e667bb67ae853c6ef372855d6b8d510e527f9b05688c1f83d9ab
1713744918595ed95d0212fe0e89e11386a09e667bb67ae8556dc5a11855d6b8d510e527f9b05688c
2b5c0fbcf98ec84b8102846dbd0212fe0e89e11386a09e66713d5844f56dc5a11855d6b8d510e527f
3e9b5dba5ec9a9480419c3df9102846dbd0212fe0e89e113887b41fb413d5844f56dc5a11855d6b8d
43956c25b000000003095853d419c3df9102846dbd0212fe0f9b07fe387b41fb413d5844f56dc5a11
559f111f10000000024dd28d43095853d419c3df9102846dbb08a419af9b07fe387b41fb413d5844f
6923f82a400000000d650c5fb24dd28d43095853d419c3df98aa6a28ab08a419af9b07fe387b41fb4
7ab1c5ed5000000001ac05a2dd650c5fb24dd28d43095853d8e29a5888aa6a28ab08a419af9b07fe3
8d807aa9800000000c1d770d91ac05a2dd650c5fb24dd28d444ec38378e29a5888aa6a28ab08a419a
912835b01000000007d687c6bc1d770d91ac05a2dd650c5fb23fc9ebc44ec38378e29a5888aa6a28a
10243185be000000000cbb07897d687c6bc1d770d91ac05a2deb5afb6f23fc9ebc44ec38378e29a588
11550c7dc3000000006bd4699f0cbb07897d687c6bc1d770d9a520cefbeb5afb6f23fc9ebc44ec3837
1272be5d740000000032af72006bd4699f0cbb07897d687c6bbee63be3a520cefbeb5afb6f23fc9ebc
1380deb1fe0000000057c77e5a32af72006bd4699f0cbb0789890e4e0bbee63be3a520cefbeb5afb6f
149bdc06a7000000008a712d4a57c77e5a32af72006bd4699fa88ab1c7890e4e0bbee63be3a520cefb
15c19bf17400000078879f548b8a712d4a57c77e5a32af7200d40f0ceea88ab1c7890e4e0bbee63be3
16e49b69c12d727ff73bcc772a879f548b8a712d4a57c77e5aadbaa51ad40f0ceea88ab1c7890e4e0b
17efbe4786c8cb5d3a6cafb8803bcc772a879f548b8a712d4a321b568aadbaa51ad40f0ceea88ab1c7
180fc19dc6c26510dfe44ed77c6cafb8803bcc772a879f548bdd66054d321b568aadbaa51ad40f0cee
19240ca1ccb1a2a42b2e9de49ae44ed77c6cafb8803bcc772a8fc4ddc5dd66054d321b568aadbaa51a
202de92c6f2a44803a559bbc482e9de49ae44ed77c6cafb8804bf3d9678fc4ddc5dd66054d321b568a
214a7484aa06bcc64c69b0d879559bbc482e9de49ae44ed77cd7eb3a084bf3d9678fc4ddc5dd66054d
225cb0a9dcd010c1c2b6483f2a69b0d879559bbc482e9de49ad2367c10d7eb3a084bf3d9678fc4ddc5
2376f988da2960acafd04337c5b6483f2a69b0d879559bbc48150d48a5d2367c10d7eb3a084bf3d967
24983e515241b89374b6459648d04337c5b6483f2a69b0d87954bfba7e150d48a5d2367c10d7eb3a08
25a831c66d062d3a96456c0a12b6459648d04337c5b6483f2a6f4db5dc54bfba7e150d48a5d2367c10
26b00327c80d676afa96bfafd6456c0a12b6459648d04337c506e177cf6f4db5dc54bfba7e150d48a5
27bf597fc7645cc8d70075a05596bfafd6456c0a12b645964814a7457606e177cf6f4db5dc54bfba7e
28c6e00bf35edde511a84c3e560075a05596bfafd6456c0a12c5dfea8f14a7457606e177cf6f4db5dc
29d5a79147cd790b59830cf122a84c3e560075a05596bfafd6df9c3589c5dfea8f14a7457606e177cf
3006ca635167bbe08a2de6c2e1830cf122a84c3e560075a0552a46143edf9c3589c5dfea8f14a74576
31142929675ab6759a205380222de6c2e1830cf122a84c3e56b000d2dc2a46143edf9c3589c5dfea8f
3227b70a857bb39b8eea725cff205380222de6c2e1830cf122aa72711eb000d2dc2a46143edf9c3589
332e1b2138ae9b2c67b91ddc2aea725cff205380222de6c2e13fa7d165aa72711eb000d2dc2a46143e
344d2c6dfccdc7f5a43bc495c4b91ddc2aea725cff2053802288f5677b3fa7d165aa72711eb000d2dc
3553380d135527a1276cc612183bc495c4b91ddc2aea725cff1f3cc99288f5677b3fa7d165aa72711e
36650a7354a55cfb238f6c25c96cc612183bc495c4b91ddc2aac5f6bbb1f3cc99288f5677b3fa7d165
37766a0abb42ed3e74e8f0fdf18f6c25c96cc612183bc495c4754a7025ac5f6bbb1f3cc99288f5677b
3881c2c92e7df9472b2e9ce8ece8f0fdf18f6c25c96cc612182738897f754a7025ac5f6bbb1f3cc992
3992722c85a261cdc73effcd792e9ce8ece8f0fdf18f6c25c9bd62f3422738897f754a7025ac5f6bbb
40a2bfe8a1de2feb997094167d3effcd792e9ce8ece8f0fdf1f5bf6df2bd62f3422738897f754a7025
41a81a664be2718e1c5f6c3a757094167d3effcd792e9ce8ec4a28f6ecf5bf6df2bd62f3422738897f
42c24b8b70fb8e64e506ebaf945f6c3a757094167d3effcd7981f459824a28f6ecf5bf6df2bd62f342
43c76c51a350d185ee34d8398806ebaf945f6c3a757094167d49473be981f459824a28f6ecf5bf6df2
44d192e819897f64d7884a1d1634d8398806ebaf945f6c3a7540646f8f49473be981f459824a28f6ec
45d69906241debbad566fd2ac9884a1d1634d8398806ebaf945ecc887640646f8f49473be981f45982
46f40e35850b764d8f94ec7b0c66fd2ac9884a1d1634d839887ba098585ecc887640646f8f49473be9
47106aa070d88043831944b10194ec7b0c66fd2ac9884a1d167c7d238a7ba098585ecc887640646f8f
4819a4c1165f319b628b952fa01944b10194ec7b0c66fd2ac922552fad7c7d238a7ba098585ecc8876
491e376c0880fb8aba88d3cc098b952fa01944b10194ec7b0c4aad266322552fad7c7d238a7ba09858
502748774cc9ab91d991d8da7e88d3cc098b952fa01944b1014fa714ca4aad266322552fad7c7d238a
5134b0bcb5fffb04431ed831c591d8da7e88d3cc098b952fa0995fd2804fa714ca4aad266322552fad
52391c0cb32d73da05145e275c1ed831c591d8da7e88d3cc095dc08fe4995fd2804fa714ca4aad2663
534ed8aa4a39880fdbd87349e5145e275c1ed831c591d8da7e0504871b5dc08fe4995fd2804fa714ca
545b9cca4fd53c0d4a3b82ab38d87349e5145e275c1ed831c5bcebdd6f0504871b5dc08fe4995fd280
55682e6ff3da4bd84efda4e9cd3b82ab38d87349e5145e275ca69d59e1bcebdd6f0504871b5dc08fe4
56748f82ee2c72dfd03493f2cbfda4e9cd3b82ab38d87349e5acad4f98a69d59e1bcebdd6f0504871b
5778a5636f90f4f345dca9053f3493f2cbfda4e9cd3b82ab3862e2ee5cacad4f98a69d59e1bcebdd6f
5884c87814e7627faa10a76bffdca9053f3493f2cbfda4e9cdd4c7d9f362e2ee5cacad4f98a69d59e1
598cc70208cd3c97571773479310a76bffdca9053f3493f2cbf9f629dbd4c7d9f362e2ee5cacad4f98
6090befffa7a5553c98311ecb21773479310a76bffdca9053f6ea8719bf9f629dbd4c7d9f362e2ee5c
61a4506ceb58b60032f9d6d8558311ecb21773479310a76bff4069c4326ea8719bf9f629dbd4c7d9f3
62bef9a3f7f5872be879c1c28cf9d6d8558311ecb2177347930f5a32b44069c4326ea8719bf9f629db
63c67178f26e7d35b6c25e4b2779c1c28cf9d6d8558311ecb2d2e63adc0f5a32b44069c4326ea8719b

라운드마다 새로 계산되는 값은 a와 e뿐이고, 나머지는 한 칸씩 밀려나요.

4. 더하기: H₀ + (a … h) = H₁

H₀32바이트
6a09e667bb67ae853c6ef372a54ff53a510e527f9b05688c1f83d9ab5be0cd19
64라운드 뒤 a … h8개 × 4바이트
c25e4b2779c1c28cf9d6d8558311ecb2d2e63adc0f5a32b44069c4326ea8719b
4바이트씩 mod 2³²
H₁ = SHA-256(메시지)32바이트
2c68318e352971113645cbc72861e1ec23f48d5baa5f9b405fed9dddca893eb4

상수 · 표준이 정해 두어 누구나 같은 값

SHA-256FIPS 180-4

기호이름정의 · 출처값
H⁽⁰⁾초기 해시값 (IV)처음 8개 소수 2 … 19의 제곱근 소수부 앞 32비트6a09e667bb67ae853c6ef372a54ff53a510e527f9b05688c1f83d9ab5be0cd19
K₀ … K₆₃라운드 상수처음 64개 소수 2 … 311의 세제곱근 소수부 앞 32비트428a2f9871374491b5c0fbcfe9b5dba53956c25b59f111f1923f82a4ab1c5ed5d807aa9812835b01243185be550c7dc372be5d7480deb1fe9bdc06a7c19bf174e49b69c1efbe47860fc19dc6240ca1cc2de92c6f4a7484aa5cb0a9dc76f988da983e5152a831c66db00327c8bf597fc7c6e00bf3d5a7914706ca63511429296727b70a852e1b21384d2c6dfc53380d13650a7354766a0abb81c2c92e92722c85a2bfe8a1a81a664bc24b8b70c76c51a3d192e819d6990624f40e3585106aa07019a4c1161e376c082748774c34b0bcb5391c0cb34ed8aa4a5b9cca4f682e6ff3748f82ee78a5636f84c878148cc7020890befffaa4506cebbef9a3f7c67178f2
블록 크기압축 함수 한 번에 넣는 크기512비트 (64바이트)
워드 크기모든 연산의 단위, mod 2³²32비트 (4바이트)
라운드 수블록 하나당 (= K의 개수)64
출력 길이H⁽ᴺ⁾의 8워드256비트 (32바이트)