[暗号技術] 共通鍵・公開鍵そしてハイブリット
最初に
今回は普段の投稿とは一味違って、通信技術における暗号化に視点をおいて、
基礎的な概念から、現代使用されている暗号技術に関してまとめてみようと思います。
では、始めます。
なぜ暗号技術が必要なのか
そもそも「なぜ?」を理解しておく必要があります。
技術者であればパッとわかることかと思いますが、主に挙げられる点は以下です。
- 通信内容が第三者に
- 盗まれないようにする
- 改竄されないようにする
- 通信相手が
- 本物であることを証明する
です。
仮に暗号技術なしで通信を行うとなると、盗聴・改竄し放題ですし、誰から送られてきたのか証明できず、通信における信頼性は皆無となるでしょう。
常に個人情報がバレバレの状態です。
こうならないために、暗号技術は誕生し、今日まで発展してきました。
では、どのような技術が使用されているのか。
以降でまとめていきます。
共通鍵暗号
共通鍵暗号とは、同じ鍵を事前に共有して暗号化・複合を行う暗号技術のことです。
代表的なアルゴリズムは以下です。
後述しますが、現代の暗号技術は、共通鍵暗号も用いたハイブリット暗号が採用されており、
そのうち、実際にデータを守っているのはこの暗号技術となります。
ハイブリットになっている理由はメリット・デメリットのいいとこ取りをして、
効率的に暗号化通信を行えるようにするためです。
以下は共通鍵暗号のメリット・デメリットとなります。
メリット
- 速い
- CPU負荷が低い
- 大容量に強い
デメリット
- 共通鍵を安全に配送することが困難
- 仮に通信経路に鍵を乗せて送りつける場合、途中で盗聴されてしまっては本末転倒です
そこで登場するのが以下です。
公開鍵暗号
公開鍵暗号とは、公開鍵と秘密鍵のキーペアを使用して暗号化・複合を行う暗号技術のことです。
共通鍵暗号の時は、一つの共通鍵をシェアして通信を行うのに対し、
公開鍵暗号の場合は、以下のような手順で暗号化・複合を行います。
登場人物は「受信者(サーバー)」「送信者(クライアント)」です。
- サーバーが秘密鍵を使って公開鍵を生成(この時、秘密鍵は絶対に外に漏らしてはいけません)
- クライアントが1の公開鍵を取得(公開鍵は名前の通りpublicに出しても問題ない鍵です)
- クライアントが1の公開鍵を使用して平文を暗号化して送信
- サーバーは自身が保持している秘密鍵を使用して平文を複合
こうすることで、サーバーは暗号化された平文が複合できれば、
自身が公開した公開鍵で暗号化されていることを検証できるので、安全にデータのやり取りができるという感じですね。
上記は「暗号化」に焦点を当てた話ですが、「認証(デジタル署名)」でもこの技術は用いられます。
- クライアントが秘密鍵を使用して公開鍵を生成
- クライアントが送信したい平文をハッシュ化(これをメッセージダイジェストと言います)
- クライアントが2でハッシュ化した平文に秘密鍵で署名
- サーバーが1で生成された公開鍵を使用して、3の署名を検証
こうすることで、サーバーは特定のクライアントが作成した改竄されていないデータであるということを検証できるといった感じです。
また、代表的なアルゴリズムは以下です。
メリット
- デジタル署名ができる
- 鍵を安全に共有できる
デメリット
- 処理が遅い
ここでお気づきの方もいらっしゃると思いますが、
共通鍵暗号と公開鍵暗号は融合させることでそれぞれのデメリットを解決できます。
- 共通鍵暗号は安全に鍵を共有することが困難
- でも、公開鍵暗号では安全に共有できる仕組みがある
- 公開鍵暗号は処理が遅い
- でも、共通鍵暗号では処理が高速な上に、大容量なデータにも耐えれる
お、じゃあハイブリット方式にすればいいじゃん。
ということで以下が誕生しました。
ハイブリット暗号
この暗号技術は、公開鍵暗号で鍵を安全に共有し、共通鍵暗号で平文を高速に暗号化する仕組みのことです。
主な手順は以下です。
- クライアントが共通鍵を生成
- サーバーが秘密鍵を使用して公開鍵を作成
- クライアントは2の公開鍵を入手(正確には受け取り)して共通鍵を暗号化
- クライアントがサーバーへ暗号化した共通鍵を送信
- サーバーは自身が持っている秘密鍵を使用して、3の共通鍵を複合
こうすることで、共通鍵自体を暗号化しているので、第三者への盗聴を防ぐことができ安全に共通鍵の共有ができるようになります。
そして、その共通鍵を使用して高速にデータのやり取りが行えるようになるといった感じです。
めでたしめでたし。。
いいえ、このままでは弱点となりうる点があります。
- 将来的に、もし仮にサーバーの秘密鍵が漏れてしまったら。。
- 過去の盗聴されていた通信は全て複合可能。。
やばい、、、
ということが近年問題視され、以下の仕組みが 生まれました 採用されるようになりました。
ECDHE型ハイブリット暗号
何が変わったのかというと、「共通鍵を暗号化して送らない」といった仕組みになりました。
実際の流れは以下です。
- クライアントとサーバー両者ともに、一時秘密鍵を生成(この段階で公開鍵もお互い持っている)
- 両者ともに、相手の公開鍵と組み合わせて共通鍵を「計算」する
こうすることで、これまで「共通鍵を暗号化して送っていた」を、お互いの公開鍵を使用して、
共通鍵を計算することで、共通鍵は通信経路上に一度も流れないため、これまで以上に安全なデータのやり取りができます。
そして1番の難点だった「過去の通信も全て複合できてしまう」は、1の一時秘密鍵を使用する方法にしたことによって、過去の分は複合することができなくなり、最小限の被害に抑えられることが可能となったため、安全性が増したという感じです。
現代ではこちらの暗号技術が広く採用されています。
まとめ
今回は暗号技術について触れてみました。
普段から使用している技術で意識しないと見えない仕組みなので「当たり前のもの」として扱ってしまいがちです。
- HTTPSだから安全。
- KMSを使っているから大丈夫。
- 証明書があるから問題ない。
でも、その裏側では
共通鍵暗号・公開鍵暗号
↓
ハイブリット暗号
↓
そしてECDHE
といったように発展を遂げ活躍し続けている仕組みがあると考えるととても面白いと感じました。
普段意識することが少ないからこそ理解しておくことの大切さを改めて実感しました。
今回の記事がお役にたてたら幸いです。
NCDC株式会社( ncdc.co.jp/ )のテックブログです。 主にエンジニアチームのメンバーが投稿します。 募集中のエンジニアのポジションや、採用している技術スタックの紹介などはこちら( github.com/ncdcdev/recruitment )をご覧ください!
Discussion
解説本なんかでありがちな内容なんですが、実態からズレている情報が多く、それでそういうものだと思っている人も相当数いるところなので、注意が必要なジャンルの技術だと思います。
暗号化とデジタル署名は技術的に別ものです。一部に両用できる方式 ( 典型的にはRSA ) があるので誤解されているところですが。
両者を同じ「公開鍵暗号」として扱うのは、もちろん類似する点もあるからですが、単におおまかな技術ジャンルの分類としての話です。
またこの分類で言うと、後で出てくる ECDH(E) も「公開鍵暗号」であって、そのことに言及していないのがちぐはぐになります。( 参考で挙げられている Elliptic Curve Cryptography にもちゃんと ECDH が紹介されています。ECDH は ECC の一種になるからです )
そういう理由で生まれたわけではなく、もともと昔からあって一方式として選択できたものです。( ECCが組み込まれる前は DHE として )
当初は「めでたしめでたし。。」の章で説明されている事項 ( FS ) があまり懸念されていなかったのが、近年になって問題視されるようになり、RSAで暗号化する方式が使われなくなった ( 結果 DHE/ECDHE のみが残った ) というのが実情です。