Noiseプロトコルの概要 - Noise Protocol Framework(1)
Noise Protocol Frameworkとは?
ネットワークで繋がれた2者間で安全に通信するための仕組みです。
両者の公開鍵を交換して、それをもとにして共通鍵を生成、以後はその共通鍵で暗号化したデータ通信を行います。
SSL / TLSと同様の仕組みですが、証明書などは必要なくいくらかシンプルな感じです。
ハンドシェイクの手続きには色々なパターンがあり、用途によって使い分けできそう
共通鍵の生成までを1往復で完了するパターンや、1.5往復するパターンなどあります。
1方向通信の場合に利用できるパターンもあります。
公開鍵の交換はDH関数によって行います。Noiseプロトコルを利用するアプリケーションは
DH鍵交換を行うための公開鍵暗号方式(Ed25519, Ed448)
共通鍵暗号(ChaCha20-Poly1305, AES-GCM)
ハッシュ関数(SHA256, SHA512, Blake2s, Blake2b)
ハンドシェイクパターンと呼ばれる、ハンドシェイクを行うための一連の手順
を当事者間で決め、この決めた暗号方式や関数、ハンドシェイクパターンにしたがってハンドシェイクを行います。
また、上記に記載のない暗号方式、ハッシュ関数を使用することも可能です。
実際、Lightning Networkでは公開鍵暗号にsecp256k1を利用しています。
仕様は以下で公開されています。
Noiseプロトコルの利用例
WhatsApp, WireGuard, Lightning Network などのアプリケーションで利用さています。最近(2019/6)では、Facebookが発表した暗号通貨Libraでも使用されているようです。
WhatsApp
WireGuard
Lightning Network
Libra
Noiseプロトコルの実装
様々な言語で実装されています。下記は各言語で実装されているライブラリです。
C
C#
Go
Haskell
Java
Javascript
Python
Rust
Erlang
Ocaml
Ruby
Objective-C/Swift
ただし、それぞれがどのパターン、公開鍵暗号、共通鍵暗号、ハッシュ関数に対応しているかは各実装次第だと思います。
その他のリソース
WireGuardで使用されているNoise Protocolについて解説した動画があるのでリンクを貼っておきます。
(動画全体では6時間ありますが、WireGuard/Noise Protocolの話は40分程度です)
https://youtu.be/JKu6kOeGnRI?t=3201