【セキュリティ】怖くないよ 暗号超入門

# この記事の概要

インターネットが普及し様々な通信が飛び交う今の世の中を陰ながら支えている情報セキュリティ技術
カッコいい！面白そう！（私の主観）と思いつつも難しそうなイメージがあるかと思いますので、セキュリティに対する興味の入り口になってくれたら良いなと思い社内テーマとして記事にしました。
今回は暗号分野に注目して暗号とはそもそも何か、そして現代における暗号技術の活用方法について軽く解説します。

# そもそも暗号とは？

そもそも暗号とはどのようなものを指すのでしょうか。

<details><summary>暗号とは</summary>

Wikipediaには以下の概要が記載されています。
> 暗号（あんごう）とは、第三者が通信文を見ても特別な知識なしでは読めないように変換する、というような手法をおおまかには指す。[wikipedia](https://ja.wikipedia.org/wiki/%E6%9A%97%E5%8F%B7)


ざっくりというとある手紙を送った人(送信者)送られた人(受信者)の間で一定のルールの下に文章を改変し、第三者がその手紙を盗み見した際に内容を解釈できなくすることが暗号の概要であり目的となります。
その一定のルールを暗号方式、元の文章(平文)に戻す(復号~~化~~)ための情報を鍵といいます。
</details>

### 暗号の歴史

暗号の歴史は長く、紀元前19世紀頃から存在していたと言われています。
その中で有名なものをピックアップして見ていきましょう。

### 換字式暗号

換字式暗号がもっとも歴史が古い暗号として知られ、その起源は今から4000年前 紀元前19世紀から存在していたとされています。
換字式暗号とは換字表をもとに元の文字を置き換えて暗号化する暗号方式です。コナン君にも出てきましたね。
換字式暗号では換字表自体が鍵となります。

例: 
暗号文: A1A2J3D5I2G5M5C4
![換時表.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3350410/423733bc-31f9-f18a-3a4b-38fa1368490e.png)

<details><summary>平文</summary>

あいをとりもどせ
</details>

### シーザー暗号

こちらも歴史が古く紀元前1世紀から存在していたとされている暗号です。
シーザー暗号は連続した鍵を数値で表し、その数値分ある方向に文字をずらすことで暗号化を実施します。
シーザー暗号ではずらす方向とずらす数値が鍵となります。
またずらした後の文字の並びも換字表になるため、単一換字式暗号の一種になります。

ABCDEFGHIJKLMNOPQRSTUVWXYZ
↓ (鍵3で左にずらした場合)
XYZABCDEFGHIJKLMNOPQRSTUVW

例:
暗号文: LJXB EX JLR PKFKABFOR

<details><summary>平文</summary>

OMAE HA MOU SHINDEIRU
</details>

### エニグマ暗号

エニグマ暗号は第二次世界大戦でドイツが用いた暗号で、こちらもまた換字式暗号の一種です。[映画](https://www.amazon.co.jp/%E3%82%A4%E3%83%9F%E3%83%86%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%83%BB%E3%82%B2%E3%83%BC%E3%83%A0-%E3%82%A8%E3%83%8B%E3%82%B0%E3%83%9E%E3%81%A8%E5%A4%A9%E6%89%8D%E6%95%B0%E5%AD%A6%E8%80%85%E3%81%AE%E7%A7%98%E5%AF%86-DVD-%E3%83%99%E3%83%8D%E3%83%87%E3%82%A3%E3%82%AF%E3%83%88%E3%83%BB%E3%82%AB%E3%83%B3%E3%83%90%E3%83%BC%E3%83%90%E3%83%83%E3%83%81/dp/B01M00TAYM)とかにもなっているので有名かもしれませんね。
仕組みが複雑なのであまり深くは解説しませんが、複数の換字表を１文字入力するごとにずらし暗号から平文を推測することを難しくしています。（シーザー暗号と換字表暗号の組み合わせといった感じです）

> 換字表をずらす頻度: 1は一文字ずつずらす、2は1が一回転した場合に一文字ずらす、3は2が一回転した場合にずらす
> 換字表は入れ替え可能
> ![エニグマ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3350410/50782ce4-be1d-9309-972a-15e1df38ce26.png)


本来は換字表が電気信号を操作するローターだったり、もっと手前にプラグボードという変換器もあります。
ローターの配置やプラグボードの設定を国防軍鍵表という冊子で日ごとに設定し暗号通信を実施していました。
この設定を記された国防軍鍵表が名前の通り鍵になり、その設定をエニグマ暗号機に設定することで暗号化/復号がされていたということですね。

> 仕組みが複雑なので詳しく解説するまでの理解はできませんでした。。。興味があるかたは調べてみてください。

# 現代の暗号

さて、ここまで歴史に存在した有名な暗号化方式について解説してきましたが、次は現代の暗号技術について見ていきましょう。
世の中には利用用途によって様々な暗号方式が存在していますが、そのなかで大きく共通鍵暗号方式/公開鍵暗号方式と２つの大きな派閥がいます。
各派閥についての概要と代表的な暗号方式について解説します。

## 共通鍵暗号方式

共通鍵暗号方式は暗号化/復号を同じ鍵を利用して実施する方式です。

```plantuml
scale 1.5
skinparam ParticipantPadding 50
skinparam lifelineStrategy solid
participant Alice
participant 共通鍵
participant Bob

Alice->共通鍵 : Hello!
共通鍵->Alice : kl*r+w!lj\n(暗号化)
Alice->Bob : kl*r+w!lj
Bob->共通鍵 : kl*r+w!lj\n(復号)
共通鍵->Bob : Hello!
```

このようにAliceとBobは同じ鍵を利用して暗号化/復号ができています。
<details><summary>いままでの解説と「同じ鍵を利用する」でピンと来た方いらっしゃいますかね？</summary>

なんと解説に出てきた暗号方式は全て共通鍵暗号方式です。
換字式暗号: 換字表が共通鍵
シーザー暗号： ずらす数と方向が共通鍵
エニグマ暗号: 国防軍鍵表が共通鍵
</details>

共通鍵暗号方式で有名なのは以下の方式です。
- AES(政府推奨暗号)
- Camellia(政府推奨暗号)
- DES
- TDES(運用監視暗号)

この中でも今一番利用されているAESについて詳細に解説していきます。

### AES

AESはアメリカ合衆国の連邦情報処理標準規格(FIPS)に制定されていたDESの危殆化(後述)に伴って、2000年に新たに採用された暗号規格です。
Rijndael(ラインデール)という暗号アルゴリズムを持ち、鍵生成/暗号化/復号までのすべての仕様がオープンであるためだれでも利用でき、現在までに簡単に鍵を当てる仕組み(数学的根拠)が存在しない。＝総当たり攻撃するしか鍵を推測できない。
鍵長は128/192/256bitから選択できDESの56bitより2倍以上組み合わせが存在する。
処理速度早い、暗号強度高い、設計がクリアなことから世界で幅広く利用されています。

<details><summary>総当たりで鍵長128bitのAES鍵を推測するには何回の計算が必要?</summary>

2の128乗で約340澗回です。
澗(かん)なんて単位聞き馴染みがなさすぎますが、2020年に計算速度世界一位になった日本のスパコン富岳（一秒間に約41京回計算可能）でさえ約2600億年かかる計算ですね。
~~ドラ〇もんのバイバインも128回でそんな個数になるので絶対に食べ残してはいけませんよ~~

</details>

<details><summary>暗号手順</summary>

![AES_超簡略.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3350410/b3681aa8-e5ff-06a0-87c5-7458743fbcde.png)


1. SubByte: 換字表を基に置き換える
2. ShiftRows: 行のシフトを実施し、順序を混ぜる
3. MixColumns: 行列の掛け算を実施し、値を混ぜる
4. AddAroundKey: 鍵との排他的論理和を取る

[MixColumns Wikipedia](https://en.wikipedia.org/wiki/Rijndael_MixColumns)
[MixColumnsの日本語解説](https://tex2e.github.io/blog/crypto/aes-mix-columns)
</details>


:::note
旧規格がDES(Data Encryption Standard)、新規格がAES(Advanced Encryption Standard)とAdvancedな規格というわかりやすい命名です。
:::

### 共通鍵暗号方式の課題

共通鍵暗号方式における共通の課題は鍵配送問題です。

例：MalloryはAliceとBobの通信を盗聴している悪意のある人物です。

```plantuml
scale 1.5
skinparam ParticipantPadding 50
skinparam lifelineStrategy solid
participant Alice
participant Mallory
participant Bob

Alice->Mallory : 共通鍵
Mallory->Bob : 共通鍵
Alice->Alice : Hello!を暗号化\nkl*r+w!lj\n(暗号)
Alice->Mallory : kl*r+w!lj\n(暗号)
Mallory->Mallory : kl*r+w!lj\n(暗号)を復号\nHello!
Mallory->Bob : kl*r+w!lj\n(暗号)
Bob->Bob : kl*r+w!lj\n(暗号)を復号\nHello!
```
これではせっかく暗号化した通信が筒抜けですね。
共通鍵暗号方式は同じ鍵を使って暗号化/復号するためこのようにこの鍵自体が第三者に見つかってしまったらその人にとって暗号は平文と等価になってしまいます。
事前に手渡しなどで鍵を渡せたら問題ないのですが、通信が普及している今不特定多数に鍵を渡すのは現実的ではありません。
その鍵配送問題を解決できるのが公開鍵暗号方式です。

## 公開鍵暗号方式

公開鍵暗号方式は暗号化/復号を異なる鍵を利用して実施する方式です。
公開鍵で暗号化されたものは秘密鍵でしか復号できず、逆に秘密鍵で暗号化されたものは公開鍵でしか復号できません。
通信をしたい人が鍵ペア(公開鍵/秘密鍵)を作成して、公開鍵を名前の通り公開します。

:::note warn
秘密鍵は絶対に公開しないでください。
公開鍵から秘密鍵を作成することは困難ですが、秘密鍵から公開鍵を作成することは非常に簡単です。
:::
公開鍵を受け取った通信相手が共通鍵を公開鍵で暗号化して返信することで、公開鍵しか持たない第三者は復号することができずに内容を盗聴することができません。
その後は秘密鍵をもった人が秘密鍵で共通鍵を復号し安全に共通鍵を利用することができます。

```plantuml
scale 1.5
skinparam ParticipantPadding 50
skinparam lifelineStrategy solid
participant Alice
participant Mallory
participant Bob

Alice->Alice : 鍵ペアを作成\n(公開鍵/秘密鍵)
Alice->Mallory : 公開鍵
Mallory->Bob : 公開鍵
Bob->Bob : 共通鍵を公開鍵で暗号化
Bob->Mallory : 暗号化された共通鍵
Mallory->Alice : 暗号化された共通鍵
Mallory->Mallory : 秘密鍵がないため復号できない
Alice->Alice : Hello!を共通鍵で暗号化\nkl*r+w!lj\n(暗号)
Alice->Mallory : kl*r+w!lj\n(暗号)
Mallory->Mallory : 共通鍵がないため復号できない
Mallory->Bob : kl*r+w!lj\n(暗号)
Bob->Bob : kl*r+w!ljを共通鍵で復号\nHello!(平文)
```

公開鍵暗号方式で有名なのは以下の方式です。
- ECC（楕円曲線暗号）
- RSA暗号

この中でもよく利用されているRSAについて詳細に解説していきます。

### RSA

RSA暗号は1977年に発明され、RSA Security社が1983年に特許を取得されたのち、2000年に特許期間満了になり今では誰でも自由に利用することができます。
RSA暗号の安全性は巨大な素数p×qの素因数分解が極めて難しい（とてつもない計算量が必要になる）ことから数学的に証明されています。

とてもニッチな数学の世界に入っていくためこれ以上は割愛します。(というか理解できてない)
~~サマー〇ォーズの主人公はこれを暗算で解いてました。~~

### 公開鍵暗号方式の課題

公開鍵暗号方式は共通鍵暗号方式に比べて計算量が大きくなるため数百倍処理が遅く、通常の通信で利用するには負荷が高いため、鍵配送や認証等に利用されることが多いです。
また鍵配送時に盗聴だけでなくなりすましをされた場合(MITM攻撃)に検知できないため、署名や証明書などを利用したPKI(公開鍵認証基盤)の併用が必要です。~~そこから先はこの記事の10倍ぐらいの内容が書きたくなるので、やめます~~

MITM攻撃の例

```plantuml
scale 1.5
skinparam ParticipantPadding 50
skinparam lifelineStrategy solid
participant Alice
participant Mallory
participant Bob

Alice->Alice : 鍵ペアを作成\n(公開鍵/秘密鍵)
Alice->Mallory : 公開鍵
Mallory->Mallory : 共通鍵を公開鍵で暗号化
Mallory->Alice : Bobを偽って共通鍵を送信
Alice->Alice : Malloryとの共通鍵を秘密鍵で復号
Mallory->Mallory : 鍵ペアを作成\n(公開鍵/秘密鍵)
Mallory->Bob : Aliceを偽って公開鍵を送信
Bob->Bob : 共通鍵を公開鍵で暗号化
Bob->Mallory : 暗号化された共通鍵
Mallory->Mallory : Bobとの共通鍵を秘密鍵で復号
```

どちらの共通鍵もMalloryが所有していることになるので全て筒抜けですね。
このように通信を中継してなりすますことによって偽装することをMITM(Man In The Middle)攻撃といいます。

# 暗号の危殆化

共通鍵暗号方式の中でチラッと触れましたが、暗号技術はコンピュータの進化に伴って危殆化が進んでいます。
DESは1977年に世界的に利用される標準規格になったものの2007年時点で7日で解読できるようになりAESに覇権を譲りました。
また昨今では量子コンピュータの研究により様々な暗号技術が危殆化すると噂され対量子暗号の開発も進んでいます。
いずれ来る未来に備えて最適な暗号強度を備えたアルゴリズムの選定を心がけましょう。

:::note info
危殆化とは、何らかの作為や状況の変化により、対象が危険に晒されるようになること。ITの分野では、暗号の安全性に疑念が生じる「暗号の危殆化」を指すことが多い。「e-words.jp」引用
:::

# まとめ

今回は暗号ってなんぞやという話から暗号の歴史、現代で使用されている暗号技術の一例を挙げてざっくりと解説しました。
あまりこの分野には関わることは少ないかと思われますが、情報社会を支える縁の下の力持ち的な存在です。
暗号について知ってみると意外と「ここはこの暗号方式が使われてるのか」や「この暗号を使えば実現できるのではないか」という気付きにもなったりしますので、この記事を読んで少しでも興味が湧いたら学んでみてください。

以上、ご清聴ありがとうございました。


# 参考文献
- [暗号技術入門 第3版 秘密の国のアリス | 結城 浩 | コンピュータ・IT | Kindleストア | Amazon](https://www.amazon.co.jp/dp/B015643CPE/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1)
- [暗号 - Wikipedia](https://ja.wikipedia.org/wiki/%E6%9A%97%E5%8F%B7)
- [暗号史 - Wikipedia](https://ja.wikipedia.org/wiki/%E6%9A%97%E5%8F%B7%E5%8F%B2)
- [シーザー暗号 - Wikipedia](https://ja.wikipedia.org/wiki/%E3%82%B7%E3%83%BC%E3%82%B6%E3%83%BC%E6%9A%97%E5%8F%B7)
- [エニグマ（暗号機）- Wikipedia](https://ja.wikipedia.org/wiki/%E3%82%A8%E3%83%8B%E3%82%B0%E3%83%9E_(%E6%9A%97%E5%8F%B7%E6%A9%9F))
- [Advanced_Encryption_Standard - Wikipedia](https://ja.wikipedia.org/wiki/Advanced_Encryption_Standard)
- [Rijndael_MixColumns - Wikipedia](https://en.wikipedia.org/wiki/Rijndael_MixColumns)
- [RSA暗号 - Wikipedia](https://ja.wikipedia.org/wiki/RSA%E6%9A%97%E5%8F%B7)
- [中間者攻撃 - Wikipedia](https://ja.wikipedia.org/wiki/%E4%B8%AD%E9%96%93%E8%80%85%E6%94%BB%E6%92%83)
- [CRYPTREC - デジタル庁](https://www.cryptrec.go.jp/list.html)
- [AES (Rijndael) の MixColumns を理解する](https://tex2e.github.io/blog/crypto/aes-mix-columns)
- [危殆化とは - 意味をわかりやすく](https://e-words.jp/w/%E5%8D%B1%E6%AE%86%E5%8C%96.html)