2020-10-11

エンドツーエンド暗号化(通称: E2E)について解説する

[B! セキュリティ] フェイスブックの暗号化、日米英などが見直し要求へ (写真=AP) 日本経済新聞

エンドツーエンド暗号化という技術がある。

暗号とは

平文一定アルゴリズムに従って暗号から生成したノイズデータを掛け合わせ、意味が読み取れない暗号を作るのが暗号化である。逆に意味が取れない暗号から平文を求める操作復号と呼ぶ。アルゴリズムがよく知られていながら暗号鍵が無ければ復号できないものがよい暗号と言われる。一般には256bitAESでも使っておけばまずパッと見ても聞いても数学的にもほぼ乱数区別できなくなる。

ノイズデータの生成方法には色々あり、事前に送り付けた乱数表を使い使用後は破棄するもの、事前に送り付けた共通鍵や公開鍵を使うもの、都度生成するものなどがある。掛け合わせる方法も色々あり、乱数表に書いてある数字暗号文を足し合わせると平文になるもの共通鍵を暗号文に使うと平文になるもの公開鍵を使うと平文になるものなどがある。

共通鍵を平文に使うと暗号文になり、共通鍵を暗号文に使うと平文になるものを、対称暗号とか共通暗号と呼ぶ。

公開鍵を平文に使うと暗号文になり、暗号文に秘密鍵を使うと平文になるもの公開鍵暗号と呼ぶ。非対称暗号ともいう。

ノーマルモードコモンモードみたいで意味不明だが耐えろ。

共通暗号でも公開鍵暗号でも「平文が、暗号文になり、平文に戻る」というところは同じだが、

共通鍵では「平文→   鍵→暗号文→鍵   →平文」と同じ鍵を使い、

公開鍵では「平文→ 公開鍵暗号文→秘密鍵 →平文」と二種類の鍵を順に使う。

なお、この二種類の鍵は順に使えば順序はどっちでも良い。先に秘密鍵で処理して公開鍵で処理することも可能だ。とにかく2種類両方を使えば良い。

共通暗号は分かりやすい。zipパスみたいなもんだ。Wi-Fiパスワードも同じだ。だが公開鍵暗号については、二種類の鍵を順番に使うと何が良いのかと思う人も多いだろう。どうせ暗号で読めないのだからいいじゃないかと思うだろう。実は名前の通り鍵を公開しても全くノーダメージというところがメリットなのだ。書かなかったが公開鍵から秘密鍵数学的に求めることは不可能である。逆も不可能である。そして処理する順番もどっちでもいい。つまり適当暗号文と鍵の片割れを公開しておくことで、もう片割れの所有を証明できるである。これが公開鍵暗号醍醐味である

この技術HTTPS証明書に使われている。というかすべての公開鍵基盤で使われている。.pemとか.cerとかid_rsa.pubはこの片割れであり、ウェブブラウザの「証明書の検証」とは、ネットを見てる時にサーバが送ってくる「適当暗号文」として"*.hatena.ne.jp"のハッシュを知らん鍵で暗号化したものハッシュを知らん鍵で暗号化したものハッシュ暗号化したものに対して、事前にWindowsインストールした時に付いてきたHatena-Masuda Ultra Global Root CAかいったけったいな鍵の片割れを使ってみてちゃんと復号出来てるかチェックしているのである

ここまでが暗号技術のおさらいである。

暗号化通信とは

暗号化通信を行うには、暗号鍵でデータ暗号化すればいい。暗号化には共通暗号を使うのが高速で便利だ。公開鍵暗号原理的に計算量が多く低速であるしかし、どうやって共通鍵を事前に知らせればいい? 公開鍵暗号共通鍵を暗号化すれば、受け取り手自分秘密鍵で復号できるだろう。しかし、秘密鍵は本当に秘密か? 暗号文と秘密鍵が手に入れば、公開鍵暗号でも解読できてしまうのではないか? HTTPS化しているウェブサービスでも、TLSロードバランサで終端してデータセンタ内は平文だったりするのではないか? そこで鍵交換、セッション鍵生成の議論が登場する。

Diffie-Hellman-Merkle鍵交換方式

Diffie-Hellman-Merkle(Diffie-Hellman)鍵交換方式とは、ディッフィー君とヘルマン君が下宿階段をドタドタやってる時に天啓のように降ってきたと言われる、ネット上に数字のものを公開することなく、2者間で同じ1つの乱数を得る方法である

送信者と受信者の間で共通の1つの乱数を得ることができ、その乱数第三者に知られることがない。

上で何度か「公開鍵暗号秘密鍵公開鍵は、平文に対して両方使えば平文に戻り、順序は関係ない」と書いたのを覚えているだろうか。Diffie-Hellmanはこれに似た方式だ。まず、AさんとBさんは送信者がお互い本人であることを証明できるようにする(公開鍵基盤を使う)。そして、それぞれ手元で乱数AとBを生成する。次に、鍵用の乱数Aを適当乱数暗号化した鍵Aと、鍵用の乱数Bを適当乱数暗号化した鍵Bを計算し、お互いに送り付ける。この暗号Aと暗号Bは盗聴されているものとする。

Aさんの手元には乱数A、適当暗号Bがある。

Bさんの手元には乱数B、適当暗号Aがある。

AさんとBさんはそれぞれ鍵Bと鍵Aに対して暗号化を行う。すると鍵BAと鍵ABが生まれる。このとき数学的な都合により鍵BA == 鍵ABである

では、暗号A、暗号B、適当A、適当Bのみから鍵ABや乱数Aを求めることはできないのか? 可能だが式変形などで「解く」ことができず、総当たりになるため計算量が膨大になる。従って実質的にはできない。

或は、暗号A、暗号Bを掛け合わせれば、鍵ABになるのではないか? これもできない。暗号AまたはBと掛け合わせるのは生の乱数AまたはBでなければ意味がない。第三者乱数Cを作って暗号AやBと掛け合わせても、鍵ACや鍵BCになってしまい、鍵ABと一致しない。

これにより、手元で生成した乱数以外のすべての情報が公開で既知で盗聴されているにもかかわらず、2者間で秘密暗号鍵用乱数を得ることができる。

原始的Diffie-Hellman鍵交換の実際の計算は非常に簡単であり、この「暗号化」は事前に決めた別の方法で生成する既知の2つの整数X, Yと乱数A, Bに対して、

暗号A = XをA乗してYで割った余り、

暗号B = XをB乗してYで割った余り、

鍵AB = 暗号BをA乗してYで割った余り、

BA = 暗号AをB乗してYで割った余り

である

なお、くれぐれも簡単と聞いてPython 2.7とかで実装しようとしないように。算数の上手い人が作ったライブラリを使え。暗号処理の自作絶対バグらせて割られるのがオチだ。ちなみにDiffie-Hellman-Merkleの三人目のマークル氏というのは両名と何のゆかりもないので普通名前に入れないのだが、Merkle氏の先行研究が直接の元ネタなので入れるべきだと主張する派閥もある。俺はどっちでもいいと思うが折角なので入れておく。

End-to-End(E2E) 暗号化

ここでやっとE2E暗号化が登場する。上のセクションでしれっと書いたが、DH鍵交換が完了した時に送信者と受信者が得る共通乱数は、各々ローカルで都度生成する乱数を元にしている。身許保証公開鍵によるが、鍵は公開鍵に縛られないのだ。つまりSNSメールサーバその他、身許を保証する機能文章をやり取りする機能があるツールと、そのツールで間違いなく本人にDH鍵交換の暗号を送れるクライアントアプリがあれば、その経路で本人同士の間だけで共通乱数を生成し、それを「セッション鍵」として共通暗号方式による通信経路が設定できる。

この「公開鍵認証基盤で本人確認し、DH鍵交換でセッション鍵を設定し、鍵を端末に出し入れすることなく、受信側端末のメモリに入るまで暗号化を解くこともないまま、共通暗号通信する」のがいわゆる「End-to-End 暗号化である

E2E暗号化を行うと、鍵はDH鍵交換で生成され、端末の外に出ないし書き出す必要もなく、通信の中で割り出す事もできず、通信が終われば破棄してもよい。好きなだけ定期再生成してもよい。認証に使う公開鍵数学的な関係もない。一度設定してしまえば、SNS運営チャットログを出させても鍵交換した意味不明な履歴意味不明な暗号文が出てくるのみで、盗聴者をなりすまさせて鍵を再設定させても前の鍵と何も関係のない新しい鍵が出てくるだけで、意味不明な暗号文の解読の助けにはならない。ちょっと量子コンピュータめいているが、端末となりすましの両方で鍵を一致させることもできない。

ざっくり言えば送信側端末と受信側端末に残っている平文か鍵をバレる前にぶっこ抜く以外に解読方法がない。

これは盗聴関係者にとって非常に大きな問題で、米国FBIなどは盗聴能力を維持するには法規制以外に策がないと考えている。DH鍵交換のアルゴリズムは上に書いた剰余以外にも楕円曲線を用いた数学的に更に複雑なものもあり、ソースネットいくらでも転がっているし、電子計算機アルゴリズムの常でやたら強力な癖に計算量的には全然負担にならない。NSAなどは数学者を揃えて最高のアルゴリズム提供する振りをして、規格書で事前に決めた一定数学的特徴を備えているべき定数に備えていないもの指定するとか、実装ミスが出やす関数を選ぶなど小細工を入れているが俺は二次関数分からんので詳しいことは知らん。しばしば政府陰謀にキレた若いITキッズが小細工を抜いて差し替えた再実装を公開したりして揉めている。

実際にSNSなどでE2E暗号化実装する上での問題点は、本人確認機種変マルチデバイス嫌がらせ対応がある。まず本人確認コケればMITMは可能だ。E2Eでは鍵を外に出さないのがメリットなので複数端末ログインができず(鍵が変わって別端末で書いたメッセージは解読できなくなる)、運営で常時メッセージ監視できない(したら意味がない)ので嫌がらせ対応が多少困難になる。またMITBというか、改造偽アプリで抜かれる可能性は、まあ、ある。

まとめ

  • 平文を鍵で暗号化するのが暗号である
  • DH鍵交換では、信頼されない通信路を使って2者間で鍵を生成できる。
  • E2E暗号化では、端末上で鍵を都度生成し、その端末以外での復号を防げる。

終わりに

時間もかけてこの程度かもうちょっと短く書けるだろボケ🍆と思ったので投稿する。

記事への反応(ブックマークコメント)

ログイン ユーザー登録
ようこそ ゲスト さん