問題
公開鍵暗号方式を使った暗号通信をn人が相互に行う場合、全体で何個の異なる鍵が必要になるか。 ここで、一組の公開鍵と秘密鍵は2個と数える。
ア: $2n$
イ: $\frac{n(n-1)}{2}$
ウ: $n^2$
エ: $2^n$
そもそも公開鍵暗号方式とは
「誰でも暗号化できるけど、特定の1人しか解読できない」という仕組みの暗号方式です。
Webエンジニアにとって一番身近な例は、GitHubなどに接続するときの「SSH接続」や、Webサイトの「HTTPS通信」の裏側で動いている仕組みです。
南京錠(暗号化)と、そのカギ(復号)が別々になっている、とイメージすると分かりやすいです。
※補足:実際のHTTPS通信では、最初に公開鍵暗号方式を使って安全に「共通鍵」を受け渡し、その後のデータ通信は処理の速い共通鍵暗号方式で行う「ハイブリッド方式」が採用されています。
公開鍵と秘密鍵とは
この方式では、必ず「ペアとなる2つの鍵」をセットで作ります。(例えば id_rsa.pub と id_rsa のような関係です)
公開鍵(Public Key):
南京錠のようなもの。みんなに「私に秘密のメッセージを送るときは、この南京錠でガチャンとロックしてね!」とバラまいてOKな鍵。
秘密鍵(Private Key):
南京錠を開けるための、世界に1つしかない本物のカギ。絶対に誰にも見せてはいけない、自分だけが持っておく鍵。
解き方
この問題の最大のポイントは「1人が何個の鍵を持てばいいか?」を考えるだけ、という点です。
公開鍵暗号方式では、相手が何人いようと、「自分の公開鍵(バラまく用)」と「自分の秘密鍵(自分用)」の 1セット(2個) さえ作っておけば、世界中の誰とでも安全に通信できます。
つまり、通信する人が $n$ 人いる場合……全員がそれぞれ「自分のペア(2個)」を作るだけなので、計算式はシンプルです。
$$2 \times n = 2n$$
全体で必要な鍵の数は $2n$ 個 となり、正解は ア になります。
⚠️ おまけ:「共通鍵暗号方式」の場合
共通鍵の場合は、通信する相手ごとに「2人だけの専用の合鍵」を作る必要があります。
したがって、鍵の数は「$n$人の中から通信する2人のペアを選ぶ組み合わせ(数学の ${}_nC_2$)」と同じになり、公式は $\frac{n(n-1)}{2}$ となります。(総当たり戦の試合数を求める計算と同じです。)
・公開鍵暗号方式: $2n$ (みんな自分のペアを作るだけ)
・共通鍵暗号方式: $\frac{n(n-1)}{2}$ (相手ごとに合鍵を作るので大変)
🍌NanoBanana君による解説漫画