1章 暗号とはなにか
1.1 暗号の要、プロトコルの保護ということ
暗号とは、妨害活動からプロトコルを守ること。 プロトコルとは、個人が何らかの目的を達成しようとするときに従う一連の手順のこと。
例: TCP: Transmission Control Protocol; IP: Internet Protocolなど。
1.2 対称暗号: 対称暗号化とは
暗号学の基本: 対称暗号化
例: アリスからボブ宛の手紙
アリス女王「忠実な使者よ、この手紙をボブ卿に届けてください。何者の目にも触れさせないでね」 忠実な使者「わかりました!」 アリス女王(忠実な使者とはいえ、この人も「絶対に中身を見ない」とは限らないわね……。)
アリス女王には「仲立ち」をおかずにボブ卿に手紙を渡す過程を「模倣」したプロトコルが必要。 このプロトコルが対称暗号化プロトコル(暗号プリミティブ: 暗号化のアルゴリズムのこと)
暗号プリミティブは以下の2つの関数を果たす。
暗号化(Encrypt) 復号(Decrypt)
暗号化は以下のような関数であたかもランダムな文字列を生成する。 ここで f
は平文と秘密鍵を使った暗号化アルゴリズム
def encrypt(plaintext):
= f(plaintext, privatekey)
message return message
復号は以下で、ランダムな文字列に見える暗号文を、明示的な鍵を用いて文章に戻す。 g
は暗号化関数の逆関数だが \(f^{-1}\)を想定する。アルゴリズムによっては真逆ではない場合もあるかもしれない。
def decrypt(message, privatekey):
= g(message, privatekey)
decrypt return decrypt
対称暗号は、アリスとボブが全く同じ鍵( privatekey
) を持つ必要がある。鍵は複数のこともある。 秘密鍵暗号とも言う。 秘密鍵を使って平文をノイズ・乱数っぽいものに見せるのは、現代の暗号のアルゴリズムにおいて一般的
→ これからお勉強します。
1.3 ケルクホフスの原理: 秘匿されるのは鍵だけ
暗号プリミティブを作ること自体は誰でもできるけど、安全な暗号プリミティブの設計は難しい。 ではその暗号プリミティブが「安全」と信頼するためには何が必要なのか?
暗号アルゴリズムが破られる原因や、暗号に対する攻撃方法は色々ある。 ・ 秘密鍵が漏洩する ・ 暗号化されたメッセージを細かく見ることで平文に関する情報がわかる ので、暗号アルゴリズムは「破られる」前提で考えられるべき (どれだけ「破られにくい」かを評価すればよい)
AES(Advanced Encryption Standard): NISTが提案する暗号アルゴリズム → コンペで暗号プリミティブを採用するスタイル。 ケルクホフスの原理: 暗号の標準をオープンに策定しようというアイデア。
鍵の秘匿性: プロトコルを守るものであってアルゴリズムを守るものではない
どんなアルゴリズムでもいつか敵に破られるので、秘密になる部分はアルゴリズムではない
1.4 非対称暗号: 鍵は1つより2つ
対称暗号である限りは、アリスとボブは最低1度は顔を合わせ、鍵を共有する必要がある。 参加者が多いプロトコル(それこそTCP/IPとか)は、たくさんのアリスとたくさんのボブが、お互いに鍵を交換する必要があるので、シンプルに大変。
→ 「鍵配送問題」という問題で長いこと議論されてきたが、1970年代に解決する
公開鍵暗号がこれを解決する。公開鍵暗号は鍵を2つ準備して用いる。ここにおける信頼関係をどう確立するかは重要な議論
1.4.1 鍵交換: 共有の秘密を使う
Diffie-Hellman鍵交換アルゴリズム: 2者間で「共通の秘密」を設定する→第5章 基本的には鍵①共通の秘密/鍵②自分だけの秘密(秘密鍵)を持つ。
- アリスとボブは事前に「■を使う」ことを採用する。
- 鍵②として、アリスは▲、ボブは★を使うことにする。これはお互い絶対の秘密である
- 鍵①と鍵②が決まったら、お互いに図形を「重ねる」。これが鍵①「公開鍵」になる
- アリス: ■+▲
- ボブ: ■+★
- 共有の秘密はアリス・ボブ双方の公開鍵の重ね合わせ: ■+(▲+★)
相手の公開鍵(ボブから見ればアリスの公開鍵: ■+▲)+秘密鍵(★)で、共有の秘密(■+(▲+★))が作れる。
全く別の敵が公開鍵の交換(■+▲と■+★の交換)を読み取っても、
それだけでは共有の秘密を知る十分な情報は(本来)手に入らない。
Diffie-Hellman暗号は安全ではない。
中間者攻撃(Man In The Middle Attack; MTM)
- アリスはどんな公開鍵でも「ボブの公開鍵だ」と信じて受け取る。
- 公開鍵をすり替えれば、ボブになりすます事ができる。
- 中間者イブ(■+●)がボブになりすますと、共有の秘密を(■+(▲+●))と計算できる。
- それをもとに情報を交換出来てしまう。
公開鍵暗号にすると、信頼性が上がる訳では無いが、信頼性を評価することがより簡単になる。
1.4.2 非対称暗号化と対称暗号化との違い
RSAアルゴリズム(Rivest-Shamir-Adleman) → 秘密を守るためにメッセージを暗号化する目的。 → DH鍵交換は共通の対称鍵を用いて暗号化/復号する。 RSA暗号は「公開鍵」と「秘密鍵」が定義される
公開鍵を使って暗号化できるが、秘密鍵がないと復号できない。
例: アリスとボブ
公開鍵: 蓋の開いた箱🗃 秘密鍵: 普通の鍵🔑
アリスの蓋の開いた箱に、色んな人がそれぞれメッセージを入れる。 → 蓋を閉じると鍵が勝手に締まる仕組み。 アリスは受信すると、普通の鍵🔑で蓋の鍵を開ける。 → アリス以外はこの鍵を持っていないので、安全っぽい。
1.4.3 デジタル署名: 紙とペンを使う署名にかわるもの
デジタル署名によって通信の秘密に対する信頼の確立は進んだ。 「署名が捏造されないか心配……」→捏造できない上、他者が簡単に検証できるようになっている。
例: アリスとボブとデイビッド
- 設定: アリスはボブを信頼することをデイビッドに伝えたい。
- デイビッドがボブを信頼できるようにするためのプロトコルを確立する
- メッセージに署名するときに、アリスは秘密鍵🔑を使って、署名を生成する。
- デイビッドはアリスとアリスの署名アルゴリズムを信頼していれば、ボブを信頼できる。
1.5 暗号の分類と抽象化
まとめると、現代の暗号の中は大きく2つに分類。
- 対称暗号: 秘密を1つ使う。複数の参加者が秘密を知っていれば「共有の秘密」
- Diffie-Hellman鍵交換
- 非対称暗号: 非対称な立場から秘密を利用する。
- 公開鍵だけを知っている人もいれば、公開鍵と秘密鍵を知っている人もいる。
- RSA暗号
- デジタル署名
- 公開鍵だけを知っている人もいれば、公開鍵と秘密鍵を知っている人もいる。
暗号のプリミティブは他にも存在するが一旦対称暗号と非対称暗号を見ていく。
- 数学ベースの構成法(RSAはじめいろいろ)
- 計算が遅い。
- ヒューリスティック(AESがこちらにあたる)
- 計算が速い。
読み方のコツ
- 最初は難解だけど読み進めれば文脈とかでなんとか分かるようになると思う
- 現状の暗号学はクッソ複雑で、今も日進月歩で技術が発展している。
- プロトコルによって達成しようとする目的を抑えながら進めていこう。
重要なのは大きく2つの特性 - 機密性(confidentiality): 正当な相手以外から情報を隠して保護すること - 認証(authentication): 話している相手の身元を検証すること。 - わかりやすく言うと「本当にアリスからの手紙?」ということを確認できること。
暗号プリミティブをプロトコルの中でどう使うのかによって、セキュリティの達成水準は異なる。
1.6 理論暗号学と現実世界の暗号学
省略。
1.7 理論から実践へ: 「きみならどうする」
著者でも暗号プリミティブが実用化されるまでのパターンはよくわからない。 ぼくならどうする?
A. 暗号研究者になる? D. 民間企業で、問題の解決法を探している? E. 暗号学の事ばかり考えている?
とりあえず研究者でも民間企業所属としての必要性でもないので、Eを選ぶ。
政府には需要があり(シナリオ上)政府機関で新しい暗号を考案する必要がある。 NISTとかFIPSとかでは暗号アルゴリズムの標準化を進めている。失敗も少なくないが。
- 研究資金を提供する→1
- 公開コンペを主催する→6
- 使っているプリミティブ/プロトコルの標準化を進める→7
特に専門性はないけど専門性の集まった場を知りたいから公開コンペを主催しよう。
アルゴリズムがコンペティションで勝つ。公開コンペは人気。
- 僕の考えた暗号構成法が勝った(ことにする)→7
アルゴリズムやプロトコルが標準化される。
→ とりあえずうまく行ったことにする。
実装される
→ 見直されるべきでは?
→ 話題になった!
応用される(ゴール)
1.8 戒めの言葉をひとつ
無知に近い素人から暗号研究の第一人者まで誰でも、自分では破れないアルゴリズムを作ることはできる
暗号技術をマスターすることは簡単ではないし『現代暗号技術入門』を読み終われば最強になれるわけでもない。 どんなときに暗号を使うべきかを認識しよう。怪しいと思ったときに、どんなプリミティブ/アルゴリズムを使えば良いのか 暗号アルゴリズムの水面下の動きを知ること。