暗号技術の基本のキ【共通鍵と公開鍵】

# はじめに
これは、[Life is Tech!のアドベントカレンダー](https://qiita.com/advent-calendar/2022/life-is-tech-tokai)20日目です。
約2年ぶりのアドベントカレンダー参戦で何を書こうか頭を悩ませましたが、僕が最近特に勉強している**暗号技術**について書こうかなと思います〜

「暗号技術？なんそれ？」「暗号か〜聞いたことあるけどあんま知らんなぁ」「暗号技術？完全に理解している」など多くの方が見えると思いますが、本記事では「暗号ってなんか凄そう」って思っていただければ幸いです。

# 暗号とは？？
暗号と聞いて何を思い浮かべますか？幼少期に下のようななぞなぞゲーム(?)などした人もいるんじゃないでしょうか。
![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/727850/2bd8b43f-5835-25ce-922d-ed322e292c94.png)



どうですか？これが何を伝えたいかわかったでしょうか。答えは「W杯おもしろすぎ！」です。
たぬき君がいるので「"た"抜き」ということで、「わたたたーるどかたっぷおたもしたろすたぎた！」から”た”を抜いて「わーるどかっぷおもしろすぎ！」となります。（まあ、簡単ですよね）これも一種の暗号です。

ここで、暗号について3つ用語を紹介します。**平文**、**鍵**、**暗号文**です。
平文は、**暗号化する前の相手に伝えたい内容**を指します。上の例で言うと「W杯面白すぎ！」と言うのが平文です。
鍵は、**平文を暗号文にしたり暗号文を平文にするために必要な一種の”決まり事”のようなもの**です。上の例で言うと横のたぬき君が鍵です。
暗号文は、**平文を鍵を使って暗号化させた内容**です。上の例で言うと「わたたたーるどかたっぷおたもしたろすたぎた！」と言うのが暗号文です。

どうですか？暗号とはどんなものかわかってきましたか？
今は小学生の遊びのようなものを紹介しましたが、この暗号技術というものは日常的に使われています。皆さんが普段使っているAmazonやInstagramなどはログインするときにユーザー名とパスワードを使いますよね。これが第三者以外にバレてしまうとアカウントの持ち主以外がログインできてしまいます。このようなことを防ぐためにネットワーク上ではパスワードなどを暗号化して第三者にバレないようにしてやり取りをしているのです。

いやぁ、暗号大事っすね！暗号の大切さわかってきました？


# 暗号化方式の種類
次は、暗号化の種類について簡単に紹介します。
暗号界隈で、情報を送る人を「アリス」、情報を受け取る人を「ボブ」と慣例的に呼ぶのでここでもアリスとボブを使います。

## 共通鍵暗号方式
共通鍵暗号とは、ボブとアリスであらかじめ鍵を共有しておき、同じ鍵を使って平文を暗号文に、暗号文を平文にする方式です。先ほど使ったたぬき君の話で例えるなら、あらかじめ「”た”を挿入して暗号化する」と決めておくのです。そうやってあらかじめ決めておくことで、アリスは送信したいときに平文に”た”を挿入して暗号化し、ボブは”た”を抜くことで復号することができます。

![キャプチャ.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/727850/927bc996-ddb8-f17a-0795-ffb3f3dd0ca1.jpeg)


なーんだ、簡単だ！って思いました？ただ、この方式には大きな問題点があります。
それは、鍵をあらかじめアリスボブ間で共有しておかなければならないことです。

え？それのどこが問題かって？

確かに、一対一の友達間でやりとりするときはあらかじめ共有するのは簡単かもしれません。しかし、今の社会、もっと広く通信をしていますよね。例えば、Amazonを利用したいと思ったときに、最初にシリコンバレーまで行って鍵を伝えますか？無理ですよね。できたとしても、Amazonほどのサービスともなればユーザ数が多いので、ユーザ数の数だけ鍵を持っておかなければなりません。Amazon側も大変なわけです。

え？わざわざシリコンバレーまで行かなくても送ればいいじゃないって？だめです。僕たちの出発点は、**情報を第三者にバレることなく送受信したい**っていうことですよね？第三者にバレない送り方があるなら、何も暗号化なんてしなくてもいいのです。つまり、鍵を送るために安全な方法を確立する必要がさらに出てきます。これを鍵配送問題と言います。

まあ昔の戦争をしていた時代は軍の指令を暗号化して送るために鍵をトラックで厳重警備で送っていたそうですが、これは送受信するのが一対一でさほど離れていないからできた事ですよね。。。

## 公開鍵暗号方式
上で説明したような鍵配送問題を解決するために考案されたのが、公開鍵暗号です。
公開鍵暗号は共通鍵暗号と比べて少し複雑になります。のですごく簡単に説明します。
公開鍵暗号は、2種類の鍵を使います。「公開鍵」と「秘密鍵」です。この方式では、鍵配送問題に直面するくらいならあらかじめ鍵を公開しちゃえ！という発想のとても斬新な暗号化方式です。簡単に手順を紹介します。
1. ボブは公開鍵と秘密鍵を生成し、公開鍵を公開します。
1. アリスはボブが公開している公開鍵をもとに平文を暗号化し、暗号化したものをボブに送信します。
1. ボブは受け取った暗号文と秘密鍵を使って復号します。

なんとなくわかりました？
これだけ読んで、「どうやって鍵作るの？」、「秘密鍵だけで復号できるの？」とか思った方、鋭いですね。
鍵の生成法などはいくつかあるのですが、一番有名で現在多く使われているのは、RSA暗号という暗号です。この暗号は、素因数分解問題という数学の問題を使っています。難しそうですね。

素因数分解問題とは、素数$p$,$q$から積$pq$を求めるのは簡単だが、$pq$から$p$,$q$を求めるのは難しいという問題です。え？素因数分解なんて簡単だって？$35$から$5\times 7$なんて簡単にわかるぞ？って思いました？では、$988027$はどうですか？

わからないですよね。実は、$991$と$997$の積なんです。実際の暗号ではもっと大きな素数を使っているので二つの素数を見つけることは非常に困難です。このような素因数分解問題を利用した手法がRSA暗号です。この問題がどのように使われているかについて説明すると少し長くなるので、QuizKnockの動画[サマーウォーズの暗号、ガチで解けるかやってみた【RSA暗号】](https://youtu.be/kvC55N4k9ng)を是非見てみてください。面白くわかりやすく説明しています。

# ナウい暗号研究
ここまで、暗号化の種類について説明してきました。
では、今は一旦どんなことを暗号業界では研究されているのでしょうか？
気になりますよねぇ。ここでは2つほど紹介します。
## 耐量子暗号
現在使われているRSA暗号などの暗号は、既にちょっと書いた通り、素因数分解問題が困難と仮定した上で成り立っています。つまり、現在性能の良いコンピュータを使っても、とても大きな素数同士の積であれば素因数分解するのにかなりの時間を要するという「計算量的安全性」のもとで安全性が担保されているんです。
しかし、近年では量子コンピュータという従来のコンピュータより処理速度が格段に速くなった計算機の開発が進んでいます。処理速度が速くなり、素因数分解などが高速にできるようになってしまうと、RSA暗号などは悪意のある攻撃者によって攻撃されてしまう可能性があるのです。そこで、量子暗号にも耐えうる、「情報理論的安全性」を担保した暗号が現在研究されています。
## 秘密計算
昨今は、ビッグデータ解析などが流行っていますよね。各企業が顧客から収集したデータを解析してサービス向上に役立てています。ただ、ビッグデータを解析するときにも危険性というものが潜んでいるのです。ビッグデータを収集するときには、平文を暗号文にしてから収集し、解析するときには一旦平文に復号してから解析していました。そのため、計算機サーバが攻撃されると顧客から収集した情報が漏れる危険性があります。そこで、暗号文のままデータ解析してしまおうというのが、秘密計算です。

まだまだ他にもブロックチェーンなどたくさんの研究分野があるので是非調べてみてください。

# おわりに
今回、暗号技術の根本的なところについてお話ししました。
IoTデバイスが普及したり、スマートシティ構想が発展したり、ネットワークと人類の結びつきが強くなっていくことでより情報セキュリティという分野の需要は増していきます。興味がある方は是非調べてみてください〜！

という、僕も現在通っている大学では物理層のセキュリティの研究をしており、あまり暗号暗号してないのです。来年からもっと暗号暗号した研究をするつもりなので、来年度以降の記事にご期待ください。