
브라우저 기반 Merkle 트리 데모 — 트리 구축, 포함 증명 생성, 루트 해시를 해시 단위로 재계산, RFC 6962 second-preimage 및 CVE-2012-2459 공격 재현. 실제 SHA-256. 백엔드 없음.
이것은 브라우저의 WebCrypto API를 통해 SHA-256을 기반으로 구축된 **머클 트리(Merkle tree)**와 **머클 포함 증명(Merkle inclusion proof)**의 대화형 데모입니다. 머클 트리는 데이터 블록 집합을 단일 루트 해시로 해싱하여 모든 블록에 한 번에 커밋합니다. 포함 증명은 누구나 단일 리프로부터 해당 루트를 다시 도출할 수 있게 해주는 형제 해시들의 짧은 목록입니다. 보안 모델은 순전히 해시 기반입니다. 즉, 키나 서명 없이 SHA-256의 충돌 저항성과 제2 역상 저항성에 의존합니다. 해싱은 RFC 6962 도메인 분리를 따릅니다(leaf = SHA-256(0x00 ∥ data), node = SHA-256(0x01 ∥ left ∥ right)). 이것이 바로 데모에서 제2 역상 방어가 장식이 아니라 실제로 작동하게 만드는 요소입니다. 이는 교육용 도구이며, 프로덕션 라이브러리가 아닙니다.
이 카탈로그에는 머클 트리를 다루는 두 개의 랩이 있으며, 이 둘은 서로 대체할 수 없습니다. 이 랩은 증명 의미론에 관한 것입니다: 신뢰할 수 있는 루트가 어디서 와야 하는지, 각 단계에서 해싱되는 정확한 바이트, RFC 9162 인덱스 기반 검증, 그리고 그것이 잡아내는 이력 공격을 동반한 일관성 증명, 페이지 상에서 깨뜨려 보이는 제2 역상 및 CVE-2012-2459 구성, 그리고 Google의 Argon 로그에 대해 검증된 고정된 실제 인증서 투명성(Certificate Transparency) 항목까지 다룹니다. crypto-lab-merkle-vault는 구조에 관한 것입니다: 부모-자식 연결선으로 그려진 트리, 실행 중인 해시가 올라감에 따라 해당 노드들이 점등되면서 한 레벨씩 따라가는 단일 증명, 그리고 맨 위에서 바이트 단위로 동일하다고 단언되는 재계산된 루트와 커밋된 루트. 머클 트리가 무엇이고 한 번의 상승이 어떻게 작동하는지를 알고 싶다면 그곳에서 시작하세요. 증명이 무엇을 믿을 수 있게 해주고 무엇을 믿을 수 없게 하는지를 알고 싶다면 이곳으로 오세요.
⌈log₂ n⌉개의 해시이므로, 블록 전체를 전송하지 않고도 단일 트랜잭션이 수백만 개 규모의 블록에 포함되어 있음을 보여줄 수 있습니다.systemslibrarian.github.io/crypto-lab-merkle-proofs
데이터 블록을 추가하거나 제거하여 트리를 실시간으로 구축하고, 아무 리프나 선택해 포함 증명(inclusion proof)을 생성한 뒤 검증하세요 — 리프와 형제 해시만으로 루트를 재계산합니다. 해시를 한 번에 하나씩 단계별로 진행하거나 애니메이션으로 재계산할 수 있으며(실행 중인 해시가 트리를 따라 올라가는 모습을 관찰), 아무 단계에서나 **“show bytes”**를 펼쳐 정확한 SHA-256 프리이미지(리프의 경우 0x00 ∥ data, 노드의 경우 0x01 ∥ L ∥ R)를 확인하고, 리프를 변조하거나 증명 단계의 비트를 뒤집어 검증이 REJECTED로 바뀌는 것을 지켜보며, 슬라이더를 조정해 최대 2³⁰개의 리프까지 증명이 로그 규모로 유지되는 것을 확인할 수 있습니다(실제 256–4,096개 리프 트리 구축 포함). 신뢰 모델 데모는 고전적인 오해를 직접 재현합니다: 리프, 증명, 그리고 루트를 제공하는 증명자는 검증을 통과하는 삼중항을 만들어내지만 — 아무것도 증명하지 못합니다. 두 가지 보안 데모에서는 RFC 6962 도메인 분리를 켜고 끄면서 두 번째 프리이미지 위조가 성공했다가 실패하는 것을 확인하고, 비트코인의 홀수 노드 복제와 RFC 6962 승격 방식을 비교하여 CVE-2012-2459 루트 충돌을 재현할 수 있습니다. 일관성(추가 전용) 증명에는 별도의 시각화가 제공됩니다 — 새 트리 안에 음영 처리된 이전 트리와 증명의 서브트리 루트가 표시되며 — 증명이 잡아내는 세 가지 히스토리 변조 공격(재작성, 삭제, 재정렬)도 함께 제공됩니다. 마지막으로, 이 페이지는 실제 인증서 투명성(Certificate Transparency) 항목을 검증합니다: Google의 Argon2026h1 로그(28억 개 인증서)의 인덱스 1,234,567,890에 있는 고정된 Let's Encrypt 인증서가 RFC 9162 인덱스 기반 검증을 사용하여 32개의 해시로 포함됨이 증명되며 — 이는 랩의 나머지 부분과 동일한 코드 경로입니다. 학습 목표, 예측 후 공개 프롬프트, 자기 점검 퀴즈, 용어집 툴팁, 요약 표, 추가 읽기 자료가 능동적 학습을 지원합니다; **“Copy link to this tree”**는 슬라이드나 과제를 위해 모든 트리 상태를 딥링크합니다.
git clone https://github.com/systemslibrarian/crypto-lab-merkle-proofs
cd crypto-lab-merkle-proofs
npm install
npm run dev
환경 변수는 없습니다. npm test로 테스트 스위트(RFC 6962 벡터, 증명 왕복, 변조 거부, 두 번째 원상 공격/방어, 일관성 증명, 독립 참조 구현에 대한 퍼징, 고정된 실제 CT 증명)를 실행하세요.
npm run test:a11y는 브라우저 게이트(Playwright)를 실행합니다. e2e/claims.spec.ts는 실제 페이지를 구동하고 페이지가 출력한 내용으로부터 모든 판정을 다시 도출합니다 — 재계산된 루트가 표시된 신뢰 루트와 같을 때만 INCLUDED, 출력된 두 루트가 같을 때만 ROOTS COLLIDE, 효율성 헤드라인은 자체 산술로부터 — 그리고 각 변조 경로(리프, 증명 비트, 로그 재작성/삭제/재정렬, CT 인증서 비트 플립)를 순회하며 거부에 도달하고, 원인을 명시하며, 복구됨을 검증합니다. e2e/a11y.spec.ts는 axe-core WCAG A/AA 스캔입니다. 둘 다 모든 Pages 배포 전에 CI에서 실행됩니다.
강사 가이드는 **TEACHING.md**를 참조하세요: 50분 수업 흐름, 토론 질문, 각 섹션이 깨뜨리도록 설계된 오해, 그리고 숙제 확장 과제가 담겨 있습니다.
systemslibrarian.github.io/crypto-lab에서 170개 이상의 라이브 브라우저 데모 중 하나 — Atbash(기원전 600년)부터 NIST FIPS 203/204/205(2024년)까지 아우릅니다.
"그런즉 너희가 먹든지 마시든지 무엇을 하든지 다 하나님의 영광을 위하여 하라." — 고린도전서 10:31