메르클-담고르 구성 데모
SHA-256 등 많은 해시 함수가 임의 길이 입력을 고정 길이로 접는 표준 구성법을 장난감 압축 함수로 재현하고, 길이 확장 공격이 왜 통하는지 직접 계산으로 보여줍니다.
해시값0x311bc161
패딩 후 길이16바이트
블록 수4개
블록별 상태 갱신
| 블록0 | 0x6a09e667 | → | 0x868883ea |
| 블록1 | 0x868883ea | → | 0x8bb2323b |
| 블록2 | 0x8bb2323b | → | 0x28df65ac |
| 블록3 | 0x28df65ac | → | 0x311bc161 |
실제 SHA-256 압축 함수가 아니라 교육용 장난감 함수를 씁니다. 목적은 정확한 출력값이 아니라 "블록을 체이닝해서 접는" 구성 자체가 낳는 길이 확장 취약점을 보여주는 것입니다.
사용 방법
- 1메시지를 입력해 해시가 어떻게 블록 단위로 계산되는지 확인합니다.
- 2길이 확장 공격 탭에서 원문(M1)과 덧붙일 문구(접미사)를 정합니다.
- 3원문 없이 이어붙여 계산한 해시가 실제로 처음부터 계산한 해시와 같은지 확인합니다.
자주 묻는 질문
짧은 "압축 함수" 하나를 메시지 블록마다 반복 적용해 상태를 갱신하는 방식입니다: state_i = compress(state_{i-1}, block_i). 마지막 블록까지 처리한 뒤의 상태가 해시값이 됩니다. SHA-1·SHA-256 등 많은 해시 함수가 이 구성을 따릅니다.
아닙니다. 실제 압축 함수 대신 곱셈·XOR·회전으로 만든 장난감 함수를 씁니다. 목적은 특정 해시 함수의 정확한 출력값이 아니라 "블록을 체이닝해서 접는다"는 구성 자체의 성질(그리고 그 성질이 낳는 약점)을 보여주는 것입니다.
메시지 끝에 길이를 덧붙이는 패딩 방식 때문에, hash(M1)과 M1의 길이만 알면(M1 자체는 몰라도) hash(M1 ‖ pad(M1) ‖ M2)를 계산할 수 있습니다. hash(M1)이 곧 "M1까지 처리한 뒤의 중간 상태"이기 때문에, 공격자는 그 상태에서 M2 블록만 이어서 접으면 됩니다.
HMAC은 키를 안쪽·바깥쪽 두 번 섞어 계산하기 때문에 내부 상태를 알아도 그다음을 이어붙일 수 없습니다. SHA-3(스펀지 구성)는 애초에 마지막 상태 전체를 드러내지 않고 일부만 출력으로 내보내(squeeze) 이 공격 자체가 성립하지 않습니다.
알아두면 좋은 점
- 길이 확장 공격 시뮬레이션 결과(원문을 모른 채 이어붙여 계산한 해시)가 원문을 실제로 알고 처음부터 계산한 해시와 무작위 원문·접미사 조합 30개에서 모두 정확히 일치하는지 검증했습니다 — 구조 자체의 수학적 성질이라 외부 표준과 대조할 필요가 없었습니다.
- 패딩이 항상 블록 크기의 배수 길이가 되는지, 0x80 마커와 길이 필드가 정확히 인코딩되는지도 확인했습니다.
- 이 구현은 교육용 장난감 압축 함수를 씁니다. 실제 암호학적으로 안전한 해시 함수가 아닙니다.
함께 보면 좋은 도구
머클 트리잎 개수에서 머클 트리의 높이와 노드 수, 포함 증명에 필요한 해시 개수와 바이트를 계산합니다.해시 생성텍스트의 MD5·SHA-1·SHA-256·SHA-512 해시값을 브라우저에서 바로 계산합니다.gitignore 판정.gitignore 규칙과 경로를 넣으면 그 파일이 무시되는지, 어느 줄이 마지막으로 이겼는지 알려줍니다.울프람 규칙규칙 번호 0~255를 8비트로 풀어 세 칸 이웃에 대응시키고 세대를 쌓아 무늬를 그립니다.2-SAT「둘 중 하나는 참」인 조건을 여럿 넣으면 참·거짓 배정이 가능한지 판정하고 배정을 하나 찾아 줍니다.
마지막 검증: 2026년 9월 3일 · 결과는 참고용 추정치입니다.