개발자 도구 · SHA 해시 계산기
SHA-256 단계별: 패딩, 메시지 일정 및 64 라운드
· 작동 방식
샤-256 암호화 브라우저 API 자바스크립트
SHA-256는 입력을 채우고 이를 512비트 블록으로 분할한 다음 각각 64 라운드의 믹싱을 통해 실행합니다. 이 게시물은 암호화에 대한 배경지식이 필요 없이 일반 언어로 모든 단계를 설명합니다.
바이트에 실제로 일어나는 일 — 대부분의 개발자가 절대 열지 않는 블랙박스
SHA-256은 모든 입력을 256비트(32바이트) 지문으로 변환하는 결정적 알고리즘입니다. 겉에서 보면 블랙박스처럼 보이는 것은 실제로는 잘 정의된 일련의 단계이다. 이러한 단계를 이해하면 미스터리가 제거되고 정확성을 확인하고, 버그를 추적하고, 출력이 왜 그런 것인지 이해할 수 있습니다. 알고리즘의 모든 부분은 공개됩니다. 그 힘은 비밀에서 나오는 것이 아니라 디자인에서 나온다.
알고리즘은 512비트 블록에서 작동합니다. 입력이 더 짧으면 패딩됩니다. 길이가 길면 여러 블록으로 분할되어 각각 순서대로 처리되고 각 블록의 출력이 다음 블록에 공급됩니다. 모든 블록이 처리되면 함께 연결된 8개의 32비트 숫자가 최종 256비트 다이제스트를 형성합니다.
패딩 — 1 비트, 0 및 64비트 메시지 길이를 추가하여 512 비트의 배수에 도달
패딩 단계는 결정적이고 형식화되어 있습니다. 실제 입력 후에 단일 1 비트를 추가합니다(실제로 입력이 바이트 경계에서 끝나는 경우 바이트 0x80). 그런 다음 512 비트 배수보다 64 비트 부족할 때까지 0 비트를 추가합니다. 마지막으로 입력 길이(비트)의 64비트 빅엔디안 인코딩을 추가합니다. 이 패딩은 모든 메시지가 512 비트의 배수가 되도록 보장하고 원래 길이를 인코딩하므로 서로 다른 길이의 동일한 입력이 동일한 다이제스트를 생성할 수 없습니다.
입력 abc(3 바이트 = 24 비트)의 경우 패딩된 메시지는 512 비트(1 블록)입니다. 3바이트 61 62 63, 0x80, 0, 그 다음 24의 64비트 인코딩(64비트 빅엔디안 필드에서 0x00...0x18임). 이제 메시지는 정확히 하나의 512비트 블록을 채웁니다. 빈 문자열의 경우 패딩은 0x80, 0, 0x00...0x00을 추가합니다(입력의 0 비트를 나타냄). 100바이트 파일과 같은 긴 입력의 경우 패딩은 마지막 블록을 512비트로 채우고 원래 길이의 800비트를 나타냅니다.
초기값과 상수는 알고리즘에 의해 고정됩니다. 역사적 파생이 저장소 증거 외부에 있습니다.
알고리즘은 8개의 32비트 작업 변수로 시작하며 처음 8개 소수의 제곱근 소수 부분의 첫 번째 32 비트로 초기화됩니다. 이는 모든 참조 구현과 암호화 라이브러리의 소스 코드에서 볼 수 있는 하드 코딩된 상수입니다. 수학의 고정 상수를 사용하면 숨겨진 백도어에 대한 의심을 피할 수 있기 때문에 존재합니다. ToolAcre 도구는 이와 동일한 상수를 적용하는 브라우저의 Web Crypto 구현을 사용합니다.
알고리즘은 또한 첫 번째 64 소수의 세제곱근 분수 부분의 첫 번째 32 비트에서 파생된 64 반올림 상수를 사용합니다. 이것들은 또한 고정되어 있고 공개되어 있습니다. 상수는 추가 혼합 재료 역할을 합니다. 이를 변경하면 알고리즘이 중단되고 다른 다이제스트가 생성됩니다.
메시지 일정 — 교대 및 회전을 통해 16 단어를 64로 확장
메시지 일정은 특정 수식을 통해 16 단어(512 비트)를 64 단어(2048 비트)로 확장합니다. 0-15 라운드의 경우 단어는 입력 블록에서 직접 나옵니다. 16-63 라운드의 경우 각 새 단어는 두 개의 이전 단어(특정 오프셋에서)를 가져와서 회전 및 이동을 적용하고 다른 단어에 XOR을 적용한 후 결과를 저장하여 계산됩니다. 공식은 결정적이며 한 블록의 컨텍스트 내에서 되돌릴 수 있지만 확장은 모든 64 라운드에 걸쳐 입력의 영향을 분산시킵니다.
확장 수식은 오른쪽 회전(한 쪽 끝에서 떨어진 비트가 다른 쪽 끝에서 다시 나타나는 원형 비트 이동) 및 오른쪽 이동 작업을 사용합니다. 회전은 모든 비트를 유지하지만 위치를 변경합니다. 오른쪽 시프트는 비트를 버립니다. 회전, 이동 및 XOR 연산의 조합은 입력의 모든 비트가 일정의 여러 단어에 영향을 미치도록 보장합니다.
한 라운드 — 비트 혼합 연산으로 설명된 Ch, Maj 및 Sigma 함수와 8개의 작업 변수가 업데이트되는 방법
각 64 라운드는 메시지 일정의 한 단어를 처리하고 8개의 작업 변수를 업데이트합니다. 핵심 기능에는 제어 변수를 기반으로 비트를 선택하는 조건부 혼합(종종 "선택"을 뜻하는 Ch라고 함), 세 변수 중에서 가장 일반적인 값을 선택하는 다수 함수(Maj), 작업 변수를 회전 및 이동하는 두 개의 특수 혼합 함수(Sigma_0 및 Sigma_1), 추가 모듈로 2^32 등 6가지 작업이 포함됩니다. 모든 산술은 32비트 단어에서 수행되므로 오버플로가 발생합니다.
"선택" 기능은 3개의 32비트 입력을 사용하고 각 비트 위치에 대해 제어 비트가 1인 경우 첫 번째 입력의 비트를 선택하거나 제어 비트가 0인 경우 두 번째 입력의 비트를 선택합니다. 다수결 함수는 3개의 입력을 살펴보고 각 비트 위치에 대해 3개 중에서 가장 자주 나타나는 비트 값을 출력합니다. 이는 선형성을 깨고 작은 입력 변경 사항이 상태를 통해 예측할 수 없게 전파되도록 하는 비선형 작업입니다.
블록 연결 및 출력 생성 — 각 블록의 결과를 실행 상태에 추가
각 라운드는 8개의 작업 변수를 모두 회전하고 현재 라운드 상수, 메시지 일정 단어 및 이전 상태에서 계산된 새 값을 통합하여 업데이트합니다. 처음 7개의 작업 변수가 이동합니다. 즉, 8번째 변수가 1번째 변수가 되고, 1번째 변수가 2번째 변수가 되는 식입니다. 새로운 8번째는 혼합 함수를 사용하여 이전 변수로부터 계산됩니다. 64 라운드 후에는 8개의 새로운 32비트 값이 생성됩니다. 이는 초기 상수에 추가(모듈로 2^32)되어 이 블록의 최종 해시 상태를 생성합니다.
다중 블록 메시지의 경우 한 블록의 8개 값이 다음 블록의 초기 상태가 됩니다. 체인은 입력의 어느 부분에서든 변경 사항이 모든 후속 블록에 영향을 미치도록 보장합니다. 최종 블록에 도달하면 입력의 모든 비트가 최종 출력에 영향을 미칩니다.
실제 예제와 여기서 다루지 않는 내용 — 짧은 메시지의 패딩 및 블록 수를 추적합니다. 보안 증명은 범위를 벗어납니다.
입력 abc의 경우 메시지는 패딩 후 하나의 512비트 블록에 맞습니다. 패딩은 424 비트를 추가하여 총 512 비트를 만듭니다. 메시지 일정은 이를 64 단어로 확장합니다. 각 라운드는 한 단어를 소비하고 혼합 기능을 통해 8개의 작업 변수를 업데이트합니다. 64 라운드 후에 상태는 초기 상수와 XOR되어 최종 다이제스트 ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad를 생성합니다.
이는 게시된 테스트 벡터입니다. 동일한 입력에 대한 동일한 계산은 항상 동일한 출력을 생성합니다. ToolAcre 도구는 브라우저의 Web Crypto 구현을 통해 정확한 계산을 수행합니다. abc를 해싱하고 결과를 알려진 벡터와 비교하여 이를 확인할 수 있습니다. Web Crypto를 올바르게 구현하는 모든 브라우저는 동일한 출력을 생성합니다. 알고리즘은 지름길이나 대체 경로를 허용하지 않습니다.
요점: Web Crypto는 비밀을 노출하지 않고 결정론적 SHA-256 혼합을 수행합니다.
알고리즘은 공개되어 있으며 모든 단계는 결정적입니다. 혼합 기능(Ch, Maj, Sigma_0, Sigma_1)은 비선형으로 선택되었습니다. 즉, 하나의 입력 비트를 변경해도 하나의 출력 비트가 예상대로 변경되지 않습니다. 16 메시지 단어를 64로 확장하면 전체 입력이 전체 계산에 영향을 미치게 됩니다. 64 라운드 및 상태 체인은 출력이 입력의 모든 비트에 민감하고 저장소가 결과 출력을 결정적 다이제스트로 사용함을 의미합니다. 충돌 저항은 중복 출력이 수학적으로 불가능하다는 약속이 아니라 제한이 있는 보안 속성입니다.
암호화 증명은 이 게시물의 범위를 벗어납니다. 중요한 점은 이제 알고리즘이 실제로 무엇을 하는지 알게 되었다는 것입니다. 그것은 마술도 아니고, 블랙박스도 아닙니다. ToolAcre가 올바르게 해싱되고 있는지 확인하려면 다음 단계를 통해 자신의 입력을 추적하거나 다른 언어로 참조 구현을 사용하고 결과를 비교하십시오. 브라우저의 구현과 올바른 참조는 동일한 입력에 대해 동일한 다이제스트를 생성합니다.