それなりブログ

とあるWebエンジニアのそれなりのブログ、JavaScript/Node.js/Python/PHP/ゲーム作成 など

公開鍵暗号方式に対するセルフFAQ

昔からわかったようなわからんような、そしてやっぱりわかってないしすぐ忘れる。

という、公開鍵暗号方式について、脳に優しいFAQ形式でメモを残してみることにしました。

お恥ずかしい限りですが、マジで基本的です。
まずは、水道とか電気とかと同程度に抽象化して、把握できるようにしたいです。

Q1. 通信開始時にまず行われることは何ですか?

送信先である受信者の公開鍵を、送信者が取得します。

Q2. 送信時に手元の秘密鍵で暗号化しても、公開鍵で復号されませんか?

その理解は正しいですが、それ以前の認識が誤っています。

送信者は自分の秘密鍵で暗号化するのではなく、受信者の公開鍵を使って暗号化して、文章を送信します。

Q3. 公開鍵で暗号化したものは誰でも復号できるのではないですか?

公開鍵は誰でも取得できるから、それを使って暗号化してもすぐ解読されるんじゃね?
って、誰でも考えると思います。

しかし、「あるキーで暗号化できるけど、そのキーを使っても復号化はできない」(*1)というオーパーツなRSA暗号という暗号化手法がそれを解決しています。

難しいところだと思いますが、公開鍵暗号方式を理解するに当たっては、まずはそれを定理として認識しておけば充分だと思います。
他に有名な特徴として「秘密鍵から公開鍵を生成できる」というのがありますが、この論点にはあまり関係なかったりします。

個人的に、「RSA」という単語から入ると、迷走してわかったようなわからなかったような結果になることが多い気がします。(文系並感)

(*1)受信者の公開鍵だけでなく送信者の秘密鍵も使って暗号化するんじゃない?、という情報も貰いました。自分に判断付かず、詳細追わなくても良さそうな論点なので、参考情報として付記します。

Q4. その公開鍵は本物ですか?

もし、中間者攻撃などで公開鍵をすり替えられている場合、その後のセキュリティは全く機能しません。そのため、公開鍵の身元保証が必要になります。

ということで、もちろん行われています。
例えば「この公開鍵はgithub.comのもの」という風に、ドメイン単位(*1) で認証されています。

証明は、公開鍵証明書公開鍵基盤という仕組みによって担保されています。
ブラウザでSSL通信をする時に「正しくない証明書です」と表示されたり、wget を –no-check-certificate なしに実行したときにエラーが出たり、というのはこの公開鍵の証明が無いのが原因です。

それらの仕組みや機関がどうやって証明できるかは、理解不足なので割愛します。
まずは、「公開鍵には身元保証の有無がある」「公開鍵の身元保証確認は各ソフトウェアが独立して行える(*2)」という点を理解すればいいと思います。

(*1)「ドメイン単位で」の記述は正確でないか、もしかすると誤りかもです。自分のSSL証明書購入経験やオレオレ証明書作成経験から推測して書きました。ソースキボンヌ。

(*2) 先日のLenovoがやらかした悪質な点は、IEやChromeなど一部のソフトウェアの公開鍵証明の確認を実質無効化してしまうという点でした。

Q5. あるサイトで、共通鍵で暗号化して通信している、という記述を見つけたのですが・・・?

それも正しいです。

RSA暗号は処理が重いため、最初に共通鍵を受け渡すまでを公開鍵暗号方式で行い、以降は共通鍵暗号方式へ移行するようです。

この手法は、公開鍵暗号の具体的な手法ひとつしてディフィー・ヘルマン鍵共有と呼ばれています。

以上

水道、ひねれば出る
電気、スイッチ押せば付く
公開鍵暗号方式、公開鍵が本物なら安心

はい、パパッと理解して、終わりっ



コメントを残す

メールアドレスが公開されることはありません。

Categories

Archives