この工房を知っていると、「なぜ署名は偽造できないの?」に自分の言葉で答えられるようになります。使うだけなら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……)は曲線の上に残ります。ときどき画面のそとまで跳びますが、それも曲線の上です。