수학의 숨은 거리

타원곡선 공방

ja· en· ko
처음 오신 분께서명(사칭을 막는 도장)의 속이 실은 곡선 위의 계산이라는 이야기예요.

이 공방을 알면 "왜 서명은 위조할 수 없을까?"에 자기 말로 답할 수 있게 돼요. 그냥 쓸 거라면 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);
packages/fedify/src/sig/proof.ts L179-L190— 의전의 방과 같은 현장을 마루 밑에서 봐요. 바깥 라이브러리 없이, Web Crypto의 "Ed25519" 한 마디에 곡선이 전부 접혀 있어요

만져 보기

「G 더하기」를 누를 때마다 지금 점과 G를 잇는 직선이 곡선과 세 번째로 만나고, x축에서 접어 넘긴 자리로 건너뛰어요——그게 덧셈 한 번. k번 눌러 닿은 자리 「kG」가 공개 키예요. 발자국(2G, 3G……)은 곡선 위에 남아요. 가끔 화면 밖까지 뛰지만, 그것도 곡선 위예요.

배치도

packages/fedify/src/sig/proof.ts
지상의 현장. createProof/verifyProof

옆방

바깥 링크