이 공방을 알면 "왜 서명은 위조할 수 없을까?"에 자기 말로 답할 수 있게 돼요. 그냥 쓸 거라면 Web Crypto가 한 줄로 해 주니까 — 그래서 마루 밑은 들여다보고 싶은 사람만의 즐거움이에요.
원리의 핵심은 곡선 위에서의 "점 더하기"예요. 더하기를 몇억 번 거듭한 결과에서 원래 횟수를 거꾸로 셈하는 건 지금 수학으로는 사실상 못 해요. 비밀키는 "몇 번 더했는가", 공개키는 "더한 결과의 점"이에요. 거꾸로 셈할 수 없으니 도장은 위조할 수 없어요 — 그것뿐인, 아름다운 장치예요.
볼거리
- 키 길이는 겨우 32바이트예요. RSA 키(수백 바이트)보다 훨씬 짧은데도 같거나 더 센 강도를 가져요
- "이산 로그 문제가 어렵다"는 한 점에 안전성 전부가 얹혀 있어요
- Ed25519는 결정적 서명이에요 — 같은 문서에는 매번 같은 서명이 나와요. 난수 제비뽑기에 실패해서 비밀이 새는 고전적 사고가 구조적으로 일어나지 않죠
경문 한 구절
const proofCanon = serialize(proofConfig);
const proofBytes = encoder.encode(proofCanon);
const proofDigest = await crypto.subtle.digest("SHA-256", proofBytes);
const digest = new Uint8Array(proofDigest.byteLength + msgDigest.byteLength);
digest.set(new Uint8Array(proofDigest), 0);
digest.set(new Uint8Array(msgDigest), proofDigest.byteLength);
const sig = await crypto.subtle.sign("Ed25519", privateKey, digest); 만져 보기
「G 더하기」를 누를 때마다 지금 점과 G를 잇는 직선이 곡선과 세 번째로 만나고, x축에서 접어 넘긴 자리로 건너뛰어요——그게 덧셈 한 번. k번 눌러 닿은 자리 「kG」가 공개 키예요. 발자국(2G, 3G……)은 곡선 위에 남아요. 가끔 화면 밖까지 뛰지만, 그것도 곡선 위예요.