プログラミング素人のはてなブログ

プログラミングも電気回路も専門外の技術屋の末端が勉強したことや作品をアウトプットするブログ。コードに間違いなど見つけられたら、気軽にコメントください。 C#、Python3、ラズパイなど。

結城浩の「暗号技術入門」を読んで通信の秘密はどの様に守られているかを学ぶ

暗号技術入門 第3版

暗号技術入門 第3版

この本は、「数学ガール」などで有名な結城浩の著書です。
数学ガール/フェルマーの最終定理 (数学ガールシリーズ 2)

数学ガール/フェルマーの最終定理 (数学ガールシリーズ 2)

結城さんは小難しい話をとても分かりやすく説明した著書がたくさんあります。

内容は、暗号の歴史からはじまり、基本となる公開鍵方式から始まり、秘密鍵方式、暗号通貨で知られるハッシュ関数、デジタル署名、電子証明といった話に触れられています。

暗号技術は古くは「シーザー暗号」や「単一換字暗号」といったものから始まりました。
シーザー暗号は、アルファベットを決まった数だけアルファベットの順番にずらしたもの、単一換字暗号はアルファベットをそれぞれ別のアルファベットに置き換えるというものです。
しかしこれらは、文章の中に出現する文字確率を基準に見ていくと、英文で出現確率が高いのが、e、t、a、o、i、n…であることを利用して解くことができるとされています。
現代では、このような知識のほかにコンピューターを使った総当たり「ブルートフォースアタック」によっても、このような基本的な暗号はすぐに解読されてしまいます。

公開鍵暗号方式

コンピュータとインターネットを使った通信が普及し、なくてはならないものになった現代では、もっと強固な暗号がなければ不正利用されることは容易です。
そこで、現代ではRSAといった強固な暗号が知られています。
暗号なのにアルゴリズムが公開されている、というのが現代の暗号です。
もともと(シーザー暗号のような時代)には暗号というのは、そのアルゴリズムを秘密にすることによって、情報を守っていました。
しかし、現代では暗号のアルゴリズムが分かっても(現実的な時間では)コンピュータを使っても解読できない、というのが良しとされています。
RSAには割り算の余りが使われていて、大きな素数を使うことで複雑性を実現します。
新しい(大きな)素数が発見されると盛り上がるのは、このような暗号に活用できるからです。
RSAの仕組みについて説明したwebページは多くありますが、今一つ意味がピンとこなかったのですが、この本の説明ではわかることができました。
文書でも画像でも電子データはその中身は数字(2進数)なので、これを決まった桁数毎に区切って暗号化するものです。(2進数を10進数や16進数に変換して暗号化してもよい)
人に見られてもかまわない「公開鍵」によって暗号化した暗号文を受信者にしか知られてはいけない「秘密鍵」によって複号化するものです。
公開鍵に対して、決まった秘密鍵があって暗号が成立します。

さて問題。
秘密鍵は受信者(発信者は知っていても問題ない)以外に知られてはいけない。秘密鍵は公開鍵とセットで生成される。では秘密鍵をどうやって受信者に秘密に送るのか?」
これは、「鍵配送問題」と言われます。秘密鍵が秘密に送付できるのなら暗号なんて必要ありません。
どのようにこの問題を解決するか?これもこの本でわかります。

ハッシュ関数

暗号技術で最近話題になったのが、暗号通貨です。

ハッシュ関数とは、文書のようなデータ(中身は2進数)をハッシュ関数によってハッシュ化すると、もとの文書からは全く予想できない(しかし、もちろん再現性がある)ハッシュ値(数値)に変換できるものです。
これは確率的に、変換後のハッシュ値が一致するのはもとの文書が同じである以外にあり得ない、という特徴を利用したものです。
また、変換後のハッシュ値からもとの文書を計算することはできない、というものです。

暗号通貨では、その前までの取引歴の情報とともに特殊な値「ナンス」をハッシュ変換し、そのハッシュ値が先頭に0がいくつも並ぶようにします。
このようなナンスを発見するにはひたすら計算するしか方法がないとされています。
以前のブロックチェーンが改ざんされると、ナンスを含めたハッシュの計算結果が不一致になるので、改ざんが発見されます。
多くの「マイナー」による検証がなされている中でそれを上回る(全マイナーの51%以上の計算力があれば実現可能)計算力でブロックの改ざんを行うことは非常に困難とされていることが、ブロックチェーンの信頼を形成しています。
f:id:s51517765:20180901224404p:plain
www.thoughts-make-things.com

この「ブロック」には多数のトランザクション(取引の情報)と直前のブロックのハッシュ、そして 「ナンス(Nonce)」と呼ばれる特別な値が格納されています。
ハッシュとは1つ前のブロックのデータを要約した短いデータのことです。もし前のブロックのデータが1ビットでも改ざんされてしまうと、そのデータのハッシュ値が異なってしまい、チェーンをつなぐことができなくなってしまいます。
ブロックチェーンでは取引の検証作業を行なった人が新しい「ブロック」を生成します。この検証作業はナンス(Nonce)という値を計算し見つけ出すことで行います。
ナンスとは、ブロックのデータをハッシュ関数に通したときに先頭に0がたくさん並ぶような非常に小さいハッシュ値が生成されるように調整するための値のことです。
この値がターゲット値以下になるようにナンスを計算することができると新しいブロックが生成されます。(このナンスを計算する作業がマイニングです。)

coinnews.jp

デジタル署名

デジタル署名とは、そのメッセージが確かに送信者が作成したものであることを証明するためのものです。
ようするに、送信者以外の人間が作成したり、その内容が改竄されていないことを証明するためのものです。
デジタル署名には公開鍵の仕組みが応用されています。
しかし、その仕組みは公開鍵方式と逆で送信者のプライベート鍵で暗号化し、公開鍵で復号化します。
プライベート鍵はその送信者しか知らないはずなので、そのメッセージに対する署名として成立します。

ここでも、素数と割り算、余りの計算の具体的な例を示して説明されているので、なぜそんなことができるのか?が分かるようになっています。

デジタル署名は、「メッセージ」と「メッセージとプライベート鍵で作成した署名」のペアを送信し、「公開鍵で署名から復号化したメッセージ」が「送られてきたメッセージ」と一致するかどうかを確認することで検証します。
しかし、ここで、その公開鍵が本物であるかどうか?という問題が出てきます。

ここで、(公開鍵の)証明をする認証局というものが存在します。
証明書は「X.509」という標準規格がありますが、だれでも作成でき、つまり、だれでも認証局を開設することができます。
すると、だれでも開設できる認証局の認証が信頼できるか?という問題が発生することは容易に想像できます。
認証局は他の認証局によって証明書が発行されてその信頼が担保されます。
すると今度は、認証局を認証した認証局は信頼できるのか?という問題が発生します。
堂々巡りですね。

じつは、この問題は人の社会の信用と同じで、社会的に信用がある人は信用できるという、そういう話になってくるのです。

まとめ

結城浩さんの「暗号技術入門」を読みました。
そのなかから、主な技術について(こんなものもあるよ、というレベルですが)紹介しました。
ごく簡単な数学で説明されているので数学アレルギーでなければ1章あたり30分程度で、全部でも数時間程度で読み切ることができます。
暗号技術以外にも、現代のインターネットによる通信の仕組みやビットコインなどの暗号通貨について興味のある人におすすめです。

通信技術については↓のような書籍も簡単に読めて仕組みが理解できます。

ハッカーの手口 ソーシャルからサイバー攻撃まで (PHP新書)

ハッカーの手口 ソーシャルからサイバー攻撃まで (PHP新書)