■概要
「電子署名=『秘密鍵で暗号化』」という良くある誤解の話 の記事内容を整理して、『秘密鍵で暗号化』が誤解である理由をわかりやすく説明する。
■電子署名で出来ること
電子署名(デジタル署名)とは、あるメッセージがその作者によって作られたことを検証する仕組み。
平文のメッセージm、電子署名s、公開鍵から、以下が検証できる。
- mが秘密鍵の持ち主によって作られたこと
- mが改ざんされていないこと
■RSAで電子署名を実現する初期のアイデア
RSA暗号アルゴリズムには、公開鍵で暗号化する関数、秘密鍵で復号化する関数『しか存在しない』。
公開鍵と秘密鍵は形式が違うため、公開鍵を秘密鍵として利用したりその逆を行うこともできない。
1. 暗号化関数(平文メッセージm, 公開鍵) → 変換されたデータs
2. 復号化関数(変換されたデータs, 秘密鍵) → 平文メッセージm
これでは秘密鍵を使った関数で平文しか出力できないので電子署名が実現できないように思える。
ここで……、
2. 暗号化関数(変換されたデータs, 公開鍵) → 平文メッセージm
1. 復号化関数(平文メッセージm, 秘密鍵) → 変換されたデータs
……ということが『可能であるとすれば』、秘密鍵を使った関数で変換されたデータsを作り、それを電子署名として平文メッセージmに添付することで秘密鍵の持ち主によって署名がつくられたこと、改ざんがされていないことを検証できる。
そしてRSAではこれが『可能である』ため、実際にRSAを使って電子署名を実現できている。
このアイディアは1977年に公開鍵暗号と同時に提唱された。
■RSA以外の普及している電子署名
前述の「初期のアイデア」は、暗号化関数と復号化関数を逆にしても成立するという特殊な性質を必要とする。
これはむしろ、RSAが例外的に持っている性質であるため、他の公開鍵暗号アルゴリズムではこの手法は使えないことが多い。
しかし電子署名の本質はあくまで、(秘密鍵を持つ)本人のみが署名を作れること、(秘密鍵と対になる公開鍵を使って)誰でも署名データの妥当性を検証できることである。メッセージをまるごと暗号化、復号化できる必要は、じつは無い。
今日主流の電子署名では、以下のような要件のみを満たすアルゴリズムが使われている。
このアルゴリズムはメッセージ全体の暗号化、復号化をできないので、もはや公開鍵『暗号』を使った方式とは言えない。
- 平文メッセージmと秘密鍵から、電子署名sを作成できる関数
- 平文メッセージmと公開鍵から、検証用の値(a)を作成する関数
- 正しい電子署名sと公開鍵から、上記と同じ値の検証用の値(b)を作成する関数
※(a)と(b)が一致することで、署名データの妥当性を検証できる
■結論
-
RSAについて
-
「秘密鍵で暗号化(=RSA暗号化関数に平文メッセージと秘密鍵を渡して戻り値を得る)」して電子署名を作るというのは、厳密には誤っている。
-
「秘密鍵で復号化(=RSA復号化関数に平文メッセージと秘密鍵を渡して戻り値を得る)」して電子署名を作るというのが正しい。
-
-
RSA以外の電子署名について
- そもそも署名データの妥当性を検証するために暗号化・復号化できる公開鍵暗号を使っていない。
そのため「秘密鍵で暗号化」という表現は成立しない。
- そもそも署名データの妥当性を検証するために暗号化・復号化できる公開鍵暗号を使っていない。
よって、電子署名=『秘密鍵で暗号化』」は誤解である。
■補足
しかし技術資格試験や多くの解説サイトでは、(本当は「RSAを使う場合は秘密鍵で復号化する」と書くべきところが)「秘密鍵で暗号化する」となっている。
厳密な話をするのでなければ、この表現は受け入れるしかない。
実は間違いとしては駄目でした。なぜなら、技術資格試験(情処など)のその手の問題で不正解として点を失う恐れがあるからです。
試験対策で「秘密鍵で暗号化」という記述があった場合は大人の対応で受け入れて下さい。カラスは白いんです。