SHA-256 내부 구조
패딩 → 64바이트 블록 → 블록마다 f(Hᵢ₋₁, Mᵢ) = Hᵢ · 마지막 H가 SHA-256 결과
1. 패딩과 블록
- 1
글자를 바이트로 바꾸기
- 2
뒤에 0x80, 0, 길이를 붙여 64바이트의 배수로 맞추기
바이트15바이트↑ 1단계 결과ec9588eb8595ed9598ec84b8ec9a94패딩한 메시지64바이트메시지ec9588eb8595ed9598ec84b8ec9a940x80800 × 4000000000000000000000000000000000000000000000000000000000000000000000000000000000길이8바이트0000000000000078 - 3
64바이트 블록 1개로 자르기
패딩한 메시지64바이트↑ 2단계 결과ec9588eb8595ed9598ec84b8ec9a9480000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000078M₁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) 세 비트 중 다수
| t | Kₜ4바이트 | Wₜ64개 × 4바이트 | a | b | c | d | e | f | g | h |
|---|---|---|---|---|---|---|---|---|---|---|
| 시작 | 6a09e667 | bb67ae85 | 3c6ef372 | a54ff53a | 510e527f | 9b05688c | 1f83d9ab | 5be0cd19 | ||
| 0 | 428a2f98 | ec9588eb | e89e1138 | 6a09e667 | bb67ae85 | 3c6ef372 | 855d6b8d | 510e527f | 9b05688c | 1f83d9ab |
| 1 | 71374491 | 8595ed95 | d0212fe0 | e89e1138 | 6a09e667 | bb67ae85 | 56dc5a11 | 855d6b8d | 510e527f | 9b05688c |
| 2 | b5c0fbcf | 98ec84b8 | 102846db | d0212fe0 | e89e1138 | 6a09e667 | 13d5844f | 56dc5a11 | 855d6b8d | 510e527f |
| 3 | e9b5dba5 | ec9a9480 | 419c3df9 | 102846db | d0212fe0 | e89e1138 | 87b41fb4 | 13d5844f | 56dc5a11 | 855d6b8d |
| 4 | 3956c25b | 00000000 | 3095853d | 419c3df9 | 102846db | d0212fe0 | f9b07fe3 | 87b41fb4 | 13d5844f | 56dc5a11 |
| 5 | 59f111f1 | 00000000 | 24dd28d4 | 3095853d | 419c3df9 | 102846db | b08a419a | f9b07fe3 | 87b41fb4 | 13d5844f |
| 6 | 923f82a4 | 00000000 | d650c5fb | 24dd28d4 | 3095853d | 419c3df9 | 8aa6a28a | b08a419a | f9b07fe3 | 87b41fb4 |
| 7 | ab1c5ed5 | 00000000 | 1ac05a2d | d650c5fb | 24dd28d4 | 3095853d | 8e29a588 | 8aa6a28a | b08a419a | f9b07fe3 |
| 8 | d807aa98 | 00000000 | c1d770d9 | 1ac05a2d | d650c5fb | 24dd28d4 | 44ec3837 | 8e29a588 | 8aa6a28a | b08a419a |
| 9 | 12835b01 | 00000000 | 7d687c6b | c1d770d9 | 1ac05a2d | d650c5fb | 23fc9ebc | 44ec3837 | 8e29a588 | 8aa6a28a |
| 10 | 243185be | 00000000 | 0cbb0789 | 7d687c6b | c1d770d9 | 1ac05a2d | eb5afb6f | 23fc9ebc | 44ec3837 | 8e29a588 |
| 11 | 550c7dc3 | 00000000 | 6bd4699f | 0cbb0789 | 7d687c6b | c1d770d9 | a520cefb | eb5afb6f | 23fc9ebc | 44ec3837 |
| 12 | 72be5d74 | 00000000 | 32af7200 | 6bd4699f | 0cbb0789 | 7d687c6b | bee63be3 | a520cefb | eb5afb6f | 23fc9ebc |
| 13 | 80deb1fe | 00000000 | 57c77e5a | 32af7200 | 6bd4699f | 0cbb0789 | 890e4e0b | bee63be3 | a520cefb | eb5afb6f |
| 14 | 9bdc06a7 | 00000000 | 8a712d4a | 57c77e5a | 32af7200 | 6bd4699f | a88ab1c7 | 890e4e0b | bee63be3 | a520cefb |
| 15 | c19bf174 | 00000078 | 879f548b | 8a712d4a | 57c77e5a | 32af7200 | d40f0cee | a88ab1c7 | 890e4e0b | bee63be3 |
| 16 | e49b69c1 | 2d727ff7 | 3bcc772a | 879f548b | 8a712d4a | 57c77e5a | adbaa51a | d40f0cee | a88ab1c7 | 890e4e0b |
| 17 | efbe4786 | c8cb5d3a | 6cafb880 | 3bcc772a | 879f548b | 8a712d4a | 321b568a | adbaa51a | d40f0cee | a88ab1c7 |
| 18 | 0fc19dc6 | c26510df | e44ed77c | 6cafb880 | 3bcc772a | 879f548b | dd66054d | 321b568a | adbaa51a | d40f0cee |
| 19 | 240ca1cc | b1a2a42b | 2e9de49a | e44ed77c | 6cafb880 | 3bcc772a | 8fc4ddc5 | dd66054d | 321b568a | adbaa51a |
| 20 | 2de92c6f | 2a44803a | 559bbc48 | 2e9de49a | e44ed77c | 6cafb880 | 4bf3d967 | 8fc4ddc5 | dd66054d | 321b568a |
| 21 | 4a7484aa | 06bcc64c | 69b0d879 | 559bbc48 | 2e9de49a | e44ed77c | d7eb3a08 | 4bf3d967 | 8fc4ddc5 | dd66054d |
| 22 | 5cb0a9dc | d010c1c2 | b6483f2a | 69b0d879 | 559bbc48 | 2e9de49a | d2367c10 | d7eb3a08 | 4bf3d967 | 8fc4ddc5 |
| 23 | 76f988da | 2960acaf | d04337c5 | b6483f2a | 69b0d879 | 559bbc48 | 150d48a5 | d2367c10 | d7eb3a08 | 4bf3d967 |
| 24 | 983e5152 | 41b89374 | b6459648 | d04337c5 | b6483f2a | 69b0d879 | 54bfba7e | 150d48a5 | d2367c10 | d7eb3a08 |
| 25 | a831c66d | 062d3a96 | 456c0a12 | b6459648 | d04337c5 | b6483f2a | 6f4db5dc | 54bfba7e | 150d48a5 | d2367c10 |
| 26 | b00327c8 | 0d676afa | 96bfafd6 | 456c0a12 | b6459648 | d04337c5 | 06e177cf | 6f4db5dc | 54bfba7e | 150d48a5 |
| 27 | bf597fc7 | 645cc8d7 | 0075a055 | 96bfafd6 | 456c0a12 | b6459648 | 14a74576 | 06e177cf | 6f4db5dc | 54bfba7e |
| 28 | c6e00bf3 | 5edde511 | a84c3e56 | 0075a055 | 96bfafd6 | 456c0a12 | c5dfea8f | 14a74576 | 06e177cf | 6f4db5dc |
| 29 | d5a79147 | cd790b59 | 830cf122 | a84c3e56 | 0075a055 | 96bfafd6 | df9c3589 | c5dfea8f | 14a74576 | 06e177cf |
| 30 | 06ca6351 | 67bbe08a | 2de6c2e1 | 830cf122 | a84c3e56 | 0075a055 | 2a46143e | df9c3589 | c5dfea8f | 14a74576 |
| 31 | 14292967 | 5ab6759a | 20538022 | 2de6c2e1 | 830cf122 | a84c3e56 | b000d2dc | 2a46143e | df9c3589 | c5dfea8f |
| 32 | 27b70a85 | 7bb39b8e | ea725cff | 20538022 | 2de6c2e1 | 830cf122 | aa72711e | b000d2dc | 2a46143e | df9c3589 |
| 33 | 2e1b2138 | ae9b2c67 | b91ddc2a | ea725cff | 20538022 | 2de6c2e1 | 3fa7d165 | aa72711e | b000d2dc | 2a46143e |
| 34 | 4d2c6dfc | cdc7f5a4 | 3bc495c4 | b91ddc2a | ea725cff | 20538022 | 88f5677b | 3fa7d165 | aa72711e | b000d2dc |
| 35 | 53380d13 | 5527a127 | 6cc61218 | 3bc495c4 | b91ddc2a | ea725cff | 1f3cc992 | 88f5677b | 3fa7d165 | aa72711e |
| 36 | 650a7354 | a55cfb23 | 8f6c25c9 | 6cc61218 | 3bc495c4 | b91ddc2a | ac5f6bbb | 1f3cc992 | 88f5677b | 3fa7d165 |
| 37 | 766a0abb | 42ed3e74 | e8f0fdf1 | 8f6c25c9 | 6cc61218 | 3bc495c4 | 754a7025 | ac5f6bbb | 1f3cc992 | 88f5677b |
| 38 | 81c2c92e | 7df9472b | 2e9ce8ec | e8f0fdf1 | 8f6c25c9 | 6cc61218 | 2738897f | 754a7025 | ac5f6bbb | 1f3cc992 |
| 39 | 92722c85 | a261cdc7 | 3effcd79 | 2e9ce8ec | e8f0fdf1 | 8f6c25c9 | bd62f342 | 2738897f | 754a7025 | ac5f6bbb |
| 40 | a2bfe8a1 | de2feb99 | 7094167d | 3effcd79 | 2e9ce8ec | e8f0fdf1 | f5bf6df2 | bd62f342 | 2738897f | 754a7025 |
| 41 | a81a664b | e2718e1c | 5f6c3a75 | 7094167d | 3effcd79 | 2e9ce8ec | 4a28f6ec | f5bf6df2 | bd62f342 | 2738897f |
| 42 | c24b8b70 | fb8e64e5 | 06ebaf94 | 5f6c3a75 | 7094167d | 3effcd79 | 81f45982 | 4a28f6ec | f5bf6df2 | bd62f342 |
| 43 | c76c51a3 | 50d185ee | 34d83988 | 06ebaf94 | 5f6c3a75 | 7094167d | 49473be9 | 81f45982 | 4a28f6ec | f5bf6df2 |
| 44 | d192e819 | 897f64d7 | 884a1d16 | 34d83988 | 06ebaf94 | 5f6c3a75 | 40646f8f | 49473be9 | 81f45982 | 4a28f6ec |
| 45 | d6990624 | 1debbad5 | 66fd2ac9 | 884a1d16 | 34d83988 | 06ebaf94 | 5ecc8876 | 40646f8f | 49473be9 | 81f45982 |
| 46 | f40e3585 | 0b764d8f | 94ec7b0c | 66fd2ac9 | 884a1d16 | 34d83988 | 7ba09858 | 5ecc8876 | 40646f8f | 49473be9 |
| 47 | 106aa070 | d8804383 | 1944b101 | 94ec7b0c | 66fd2ac9 | 884a1d16 | 7c7d238a | 7ba09858 | 5ecc8876 | 40646f8f |
| 48 | 19a4c116 | 5f319b62 | 8b952fa0 | 1944b101 | 94ec7b0c | 66fd2ac9 | 22552fad | 7c7d238a | 7ba09858 | 5ecc8876 |
| 49 | 1e376c08 | 80fb8aba | 88d3cc09 | 8b952fa0 | 1944b101 | 94ec7b0c | 4aad2663 | 22552fad | 7c7d238a | 7ba09858 |
| 50 | 2748774c | c9ab91d9 | 91d8da7e | 88d3cc09 | 8b952fa0 | 1944b101 | 4fa714ca | 4aad2663 | 22552fad | 7c7d238a |
| 51 | 34b0bcb5 | fffb0443 | 1ed831c5 | 91d8da7e | 88d3cc09 | 8b952fa0 | 995fd280 | 4fa714ca | 4aad2663 | 22552fad |
| 52 | 391c0cb3 | 2d73da05 | 145e275c | 1ed831c5 | 91d8da7e | 88d3cc09 | 5dc08fe4 | 995fd280 | 4fa714ca | 4aad2663 |
| 53 | 4ed8aa4a | 39880fdb | d87349e5 | 145e275c | 1ed831c5 | 91d8da7e | 0504871b | 5dc08fe4 | 995fd280 | 4fa714ca |
| 54 | 5b9cca4f | d53c0d4a | 3b82ab38 | d87349e5 | 145e275c | 1ed831c5 | bcebdd6f | 0504871b | 5dc08fe4 | 995fd280 |
| 55 | 682e6ff3 | da4bd84e | fda4e9cd | 3b82ab38 | d87349e5 | 145e275c | a69d59e1 | bcebdd6f | 0504871b | 5dc08fe4 |
| 56 | 748f82ee | 2c72dfd0 | 3493f2cb | fda4e9cd | 3b82ab38 | d87349e5 | acad4f98 | a69d59e1 | bcebdd6f | 0504871b |
| 57 | 78a5636f | 90f4f345 | dca9053f | 3493f2cb | fda4e9cd | 3b82ab38 | 62e2ee5c | acad4f98 | a69d59e1 | bcebdd6f |
| 58 | 84c87814 | e7627faa | 10a76bff | dca9053f | 3493f2cb | fda4e9cd | d4c7d9f3 | 62e2ee5c | acad4f98 | a69d59e1 |
| 59 | 8cc70208 | cd3c9757 | 17734793 | 10a76bff | dca9053f | 3493f2cb | f9f629db | d4c7d9f3 | 62e2ee5c | acad4f98 |
| 60 | 90befffa | 7a5553c9 | 8311ecb2 | 17734793 | 10a76bff | dca9053f | 6ea8719b | f9f629db | d4c7d9f3 | 62e2ee5c |
| 61 | a4506ceb | 58b60032 | f9d6d855 | 8311ecb2 | 17734793 | 10a76bff | 4069c432 | 6ea8719b | f9f629db | d4c7d9f3 |
| 62 | bef9a3f7 | f5872be8 | 79c1c28c | f9d6d855 | 8311ecb2 | 17734793 | 0f5a32b4 | 4069c432 | 6ea8719b | f9f629db |
| 63 | c67178f2 | 6e7d35b6 | c25e4b27 | 79c1c28c | f9d6d855 | 8311ecb2 | d2e63adc | 0f5a32b4 | 4069c432 | 6ea8719b |
라운드마다 새로 계산되는 값은 a와 e뿐이고, 나머지는 한 칸씩 밀려나요.
4. 더하기: H₀ + (a … h) = H₁
H₀32바이트
6a09e667bb67ae853c6ef372a54ff53a510e527f9b05688c1f83d9ab5be0cd1964라운드 뒤 a … h8개 × 4바이트
c25e4b2779c1c28cf9d6d8558311ecb2d2e63adc0f5a32b44069c4326ea8719b4바이트씩 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바이트) |