ステガノグラフィーとクリプトグラフィー

強固なビットコインウォレットを作ろうとしている。

プロダクトを作るとき、どこまで原理を理解するのか、というのは難しい問題だ。 普通、財布を作るときに金融の歴史までは遡らない。

現代の暗号方式は全く直感に反する

調べてみると、コンピュータの秘密のやりとりは、第三者に傍受されないような通信を実現しているわけではないことがわかった。みんなが聞くことが可能であるにも関わらず、読み取られないのである。
誰に知られても構わない情報で暗号化しているのに、合意して解読できる、というのは全く直感に反する。だから、いつまでたってもわからない。

ステガノグラフィーとクリプトグラフィー

ほとんどの人が、通常のやりとりにおいて行う秘密のやりとりは、ステガノグラフィーによる。その秘密の、存在自体を隠すのである。例えば、グループラインでのやりとりの途中で、誰かに個別にやりとりをとる。これ自体も、ステガノグラフィーの一種と言えるだろう。 しかし、コンピュータにおけるやりとりは、クリプトグラフィーである。これを通常のやりとりで行うことはほとんどないだろう。学生が先生にわからない流行語でやりとりするようなイメージか。

下記の暗号方式はすべて、クリプトグラフィーの、コード換字式にジャンリングされる。

ディフィー・ヘルマン鍵共有

公開鍵暗号方式とも呼ばれる。現代にも広く活用される技術で、世界でもっとも強力なアルゴリズムの一つである。

直感的に理解できる暗号化の方法は、鍵を当事者間以外では秘密にすることだ。 だが、問題は、この鍵をどうやって伝えるかだ。 人間の場合であれば、耳打ちすれば良い。コンピュータの場合は、他のコンピュータがその情報を見つけることを制限することは原則できない。

簡単な方法は、二者間の鍵を事前に共有しておくことだ。これによって、いくらやりとりを見られても、第三者には複合化できない。

しかし、難しいのは、まず最初に共有化された「鍵」を合意することだ。

ディフィー・ヘルマン鍵共有方式は、一方向性関数の性質を使って、傍受されていても、鍵を安全に相手に届けることを可能にした。

一方向性関数

簡単に計算できるが逆関数の計算は非常に困難である関数を指す。

例えば、xのy乗=z mod pのとき (x,y,p)からzを求めるのは容易だが、(x,z,p)からyを求めるのは困難である。

この性質を使って、二者間で、秘密の数を公開することなく、鍵を共有することができる。

絵の具の比喩がわかりやすい。混ぜて色を作るのは簡単だが、出来上がっている調合色からもとの色を算定するのは極めて難しい。

ディフィー・ヘルマン鍵共有方式が担当するのはあくまでも通信の傍受に対する耐性である。例えば、通信相手が相手の振りをした悪者だった場合の危険性は防げない。

RSA暗号

ディフィー・ヘルマン鍵共有方式は別の暗号化アルゴリズムと組み合わせて用いられることが多い。公開鍵暗号としては、RSAを挙げることができる。

これにより、中間者攻撃への体制が増す。

どういうことかというと、RSAでは公開鍵が非対称(公開鍵で共通鍵を暗号化し、相手方は秘密鍵で共通鍵を復号する)となるので、公開鍵を事前に権威ある団体が認定することで、信用を持たせることが可能になるのである。

この方法を実現させるために、モジュラ演算の性質と、大きな数の素因数分解が困難である性質を利用している。

モジュラ演算

やや迂遠ではあるが、現代的暗号理論に用いられる数学の基礎から理解する。 ある数値を別の数値で除算し、余りを取得する演算である。(a modulo n、略して a mod nとも表記される)
単純に、ユークリッド除法における a を n で除算した余りとなる。

jsで書くと、例えば100分を ○○時○○分 と書き換えたい場合

var min = 100 % 60; var hour = (100 - min) / 60;

不思議なことに、割る数Nを二つの素数をかけた数値として、pはNより小さいとすると、余りyは、一定の周期で、元のxに戻る。これはフェルマーの小定理によって証明されている。

下記は演算の周期例だ

商(赤線)と余り(緑線)のグラフ

電子署名

公開鍵暗号方式と、ハッシュ関数は相性がいい。 これにより、なりすましや改善を検知しながら、発信者を否認を防ぐことができる。

ハッシュ関数

通信が途中で改ざんされるかもしれない。不安定な通信状況に起因して、データが壊れるかもしれない。これを防ぐために、普通、データにはチェックサムを追加する。例えとして、ネットワークを利用してのデータ送信時、IPパケットにデータを分割した際のIPヘッダの検査での利用例を以下に示す。

  1. IPヘッダのチェックサムフィールドにゼロをセット
  2. IPヘッダを16ビット単位で加算
  3. 総計の下位16ビットの補数をIPヘッダのチェックサムフィールドにセット
  4. 送信
  5. 受信したらIPヘッダを16ビット単位で加算

総計がゼロなら正常(チェックサムフィールドにはチェックサムフィールドがゼロの場合のチェックサムの補数がセットされているので、総計=チェックサムフィールド以外のチェックサム+チェックサムフィールド以外のチェックサムの補数=ゼロになれば正しい

上記のような計算を、ハッシュ関数という。 その性質を言葉で表すと、同じデータからは同じハッシュ値が得られ、かつ、ハッシュ値からは元のデータは推測できない、という性質があげられる。

上記のようなシンプルな計算の場合の問題は、違うデータからも同じハッシュ値が得られる可能性があるということだ。この問題を解決している代表的なハッシュ関数に、sha256がある。これは、ブロックチェーン技術を支える。

以上は下記の図のように示すことができる。

SSL認証

このSSL認証という仕組みが、本来はクリプトグラフィーであるインターネットの暗号を、ステガノグラフィーと誤解させる要因である気がしている。

SSL認証は、かくされた通信を実行しているわけではない。
やりとりは見れるが、通信を暗号化しているのである。

RSA認証アルゴリズムを利用することで、公開鍵を認証局によって承認し、公的期間であることを証明することができる。