公開鍵暗号方式に喰らいつく

f:id:ironoir:20210209163301p:plain

理解に自信がないので、違っていたらこっそり教えてください。

うん、公開鍵暗号方式というか、サーバ認証やSSL(TLS)のしくみですね。ときどきわからなくなって、その度に調べ直します。なにかいい覚え方はないですかね。一時期、「公開鍵は南京錠で、秘密鍵はそれを開けるキーだ」みたいに言われてなんとなくそのイメージを持っていたんですけど、それだと微妙におかしなことになるんですよね。データは公開鍵・秘密鍵両方で、暗号も復号もできるんですよね?それぞれのユースケースに応じて、どちらの鍵で閉めて、どちらの鍵で開けるかは変わりうるような気がするので。

経験の浅い人に説明する機会があるとすれば、sshを使う時と、SSL(TLS)に関してぐらいですかね。しかし世の中のソフトウェアエンジニアの方々はこんなのは余裕で諳んじれるでしょうか?sshで最初にサーバに接続するときにfingerprintが表示されますけど、あれはサーバ側公開鍵の話ですよね?一方で、接続するときにクライアント側でssh-keygenするのは、クライアント認証のためにキーペアを生成しているわけですよね?認証に使う時は、キーペアを生成する側=秘密鍵を保持する側が「自分が自分であると証明したい」ときに使うわけです。

話がややこしいのは、ここにCA(認証局)が関わる場合があることだと思うんですよね。サーバ認証のときとかだと、公開鍵をクライアント側に返すときに、そのまま返すわけではなく、証明書の形で返すわけです。で、この証明書自体が公開鍵暗号方式で作られているわけで、そこらへんであまり興味のない人()には話がややこしくなってきてさらに興味を失ってしまうわけですよね(超偏見)。

あとは、現在はどうなっているのかわかりませんが、iOSの開発を行うときにクライアント側で証明書を作ってApple側にアップロードする必要がありました。もうずいぶん前ですが、あのときにも「自分が一体何をやっているのかちゃんと理解したい」と思って調べたんですよね。あれはもちろんユーザ側が、開発者としてAppleに認めていただくために使うものですね。ブラウザに入っているのと同じように、OSが持っているCAのリストを使っているわけです。

SSL(TLS)の場合は公開鍵/秘密鍵だけだとパフォーマンス的な問題があるため、共通鍵も使ってるんですよね?(教科書的知識)これに関しては書籍を買ったような記憶がありますが、結局あまり読めていない気がします。とは言うものの、正直、セキュリティの問題は幅広いし、通信を少しでも扱うソフトウェアエンジニア(いまどき、 お仕事ではそうじゃない方が少ないんでしょうが)は説明できないと、ちょっとプロフェッショナルっぽくないですよね(自分を棚に上げる)。鍵交換とかも一回勉強した覚えもあるし、各種の暗号方式も遊びで実装してみるとかやったことがあるような記憶も微かにあります。

まあ、ちゃんと興味を持つことが大切ですね(それはそう)。