Nymプロジェクトには現在、2つのコア技術があります。
1. Mixnetによるデータとメタデータの保護
NymのMixnetは、インターネットを通過するすべてのTCP/IPパケットの匿名化を実現します。これにより、国家や企業レベルの強力な敵に対しても有効です。Mixnetは、メッセージの内容だけでなく、誰が誰と通信しているか、パケットがどのような経路を辿ったかなどの情報も隠します。
2. 選択的認証情報の開示(Selective Disclosure Credential)
Nymは、EUのHorizon 2020が出資した「Decode」プロジェクトの「Coconut」を基盤とした設計技術を使用しています。ここでは、選択的な認証情報の開示の概念を説明します。
ココナッツ(Coconut)とその機能
ココナッツは、以下の3つの基本的なアルゴリズムから構成されています:
- 鍵生成(Keygen)
- 検証(Verify)
- 署名(Sign)
ユーザーは、公開鍵/秘密鍵ペアを生成(keygen)することができなければなりません。そして、秘密鍵を使って平文の一部に署名することができます。その後、署名者の公開鍵を持っている人なら誰でも、その署名が有効であることを検証できるはずです。RSA、DSA、そしてED25519のような新しく魅力的なものまで、すべての署名方式は同じように機能します。
ココナッツは、この基本的な3つの機能を、さらにいくつかの機能で拡張しています。追加された機能を理解することが、それを使って何ができるかを理解する鍵になります。どんなアルゴリズムが追加されるのか見てみましょう:
4. ブラインド発行(Blind Issuance)
avid Chaumは1980年代にブラインド署名を発明しました。ブラインド署名は、上記の性質に加えて、いくつかの特別な性質を持っています。
keygen、verify、signの各アルゴリズムはまだ存在します。また、署名の秘密鍵を持たない人がメッセージをブラインドさせるアルゴリズムもあります。平文の一部を取り出し、秘密鍵を持つ署名者が署名できるような無意味な文章に変えてしまうのです。
この署名は、メッセージを作成した人物に戻され、まだブラインドされたままです。この署名は、その人物によって解除することができます。この署名は、元の平文メッセージに対する有効な署名と同等になります。いったんブラインドが解除されると、署名者はブラインドされたメッセージの署名とブラインド解除されたメッセージを結びつけることができなくなり ます。
理解を深めるには、例を挙げるのが効果的です。仮に存在するシンプルな個人向け電子マネーのスキームを例にとってみましょう。それを利用する際の手順を説明します:
・1ドルを持っているというメッセージを平文で作成する。
・ブラインド署名のアルゴリズムを使って、それを見えなくする。平文のメッセージは無意味な言葉に変わる。
・ブラインドされたメッセージを1ドルと一緒に銀行に送る。
・銀行は、私が1ドルを持っていることを証明するために署名し、その署名を私に返す。
・私はその署名を解除し、銀行から戻ってきた署名とのリンクを解除する。これが、私のプライバシーを保証する重要なステップです。
・私は今、私が1ドルを持っていることを証明する匿名のbearerトークンを持っています。
Bearerトークンは銀行からもらったものとリンクできませんが、その有効性は銀行の公開鍵があれば誰でも検証できます。
これがblind issuance(ブラインド発行)であり、そのプロセスは平文作成、ブラインド、署名者への送信、署名、作成者への返却、ブラインド解除、使用となります。ブラインド発行には問題があります。署名者は自分が何に署名しているのか全く分からないのです。
つまりあなたが銀行の立場なら、訳のわからない言葉を受け取る、ということになります。銀行が「100万ドルあります」と書いていないことをどうやって確認するのでしょう?それは銀行にとって不透明なことなのです。一般的な解決策は、メッセージに1ドルが含まれていることを証明するゼロ知識証明を使うことですが、それ以外のこと(シリアル番号、私の身元など)は何も明らかにしません。
ココナッツはこのゼロ知識証明の能力を持っているので、ブラインドされた発行が可能なのです。通貨に関するゼロ知識証明と、身元保証や匿名投票プロトコルに関するゼロ知識証明は異なるので、それぞれの領域でコード化する必要があります。
5. 再ランダム化可能な署名(Randomizable Signatures)
署名に関連するもう一つの概念として、再ランダム化があります。このタイプの署名には、randomizeというアルゴリズムが1つ追加されています。これにより、ユーザーはある署名を受け取り、それに対してrandomize()を呼び出し、同じメッセージに対して有効な全く新しい署名を生成することができます。ランダム化された署名の新しいビット列は、元の署名と同等ですが、リンクすることはできません。
どんなことに使えるのか
あなたは署名を様々な人に見せることができ、見せた人はその署名が互いに、あるいはあなたにリンクしていることを理解することはできません。どの場合も根本的なメッセージは同じですから、偽造の可能性はありません。基本的には、複数の匿名化されたベアラートークン(bearer tokens)を持つことになります。
ココナッツは再ランダム化を行うのです。
6. 選択的開示(Selective Disclosure)
ココナッツは、選択的開示(selective disclosure)と呼ばれるものも可能にしています。
選択的開示とは何ですか?
従来の署名方式では、メッセージに署名し、後で公開鍵を持っている人なら誰でもそれを検証することができます。通常、検証者は検証するためにメッセージの全文を持っていなければならない、という暗黙の制約があります。
選択的開示では、検証のためにメッセージ全体を見せる必要はなく、メッセージの一部だけを見せ、他の部分は非公開のまま検証することができます。
別の例として、パブに行きたいが、入り口で年齢を証明する必要があるとする。このとき、次のような属性を持つパスポートを提示します:
あなたはパブに行きます。ドアの前にいる用心棒は、あなたの外見と年齢だけで、他のことは何も気にしません。しかし、毎回認証情報を全部見せるので、用心棒に対してすべての情報を渡す必要があります。
選択的開示では、このプロセスを改善することができます。パスポートの全フィールドのタプルに署名し、いざ検証するときに、検証者は一部の属性だけを検証することができます。ここでいう検証者は公開されており、(a)パスポート発行当局の公開鍵を知っていて、(b)パスポート発行当局の署名を見ることができる人であれば誰でもいいのです。
つまり、3つのパーティが存在することになります:
1.パスポート発行当局(passport authority)
2.主体 (あなた) (subject (you))
3.証明書の利用者 (用心棒)(relying party (bouncer))
あなたは署名されたメッセージの一部、またはすべての属性を選択的に開示することができます。
選択的開示は「一般的な」署名方式に適用できます(ブラインドされず、 再ランダム化もされない)。つまり、権威から署名付きメッセージを入手し、属性を選択的に開示することができるということです。これにより、必要以上の情報を公開しないことで、relying party(用心棒)に対するプライバシーが確保されるのです。しかし、同じパブにもう一度行ったり、パスポート当局が(署名した)メッセージを見たりすると、それらの当事者は署名と検証を結びつけることができ、その結果、subject(あなた)のプライバシーを破ることができます。
さて、Nymの観点からすると、本当に興味深いのは、それをすべてまとめることです。
ブラインドされた認証情報、再ランダム化可能な署名、選択的開示を組み合わせれば、パブで複数の「提示」(認証情報を使用)からユーザーのプライバシーを守ることができます。用心棒は、あなたがそこに行ったのはいつも初めてだと思うだろうし、パスポート当局は、あなたが使っているブラインドされた認証情報を彼らが発行したものとリンクさせる方法がありません。
ある属性を示し、他の属性を示さないことで選択的に開示できるという考えは単純化したもので、それよりも強力なものです。年齢を直接明かす代わりに、実際の年齢を明かすことなく「私は18歳以上です」と断言するゼロ知識証明を関連付けることができるのです。
7. 閾値発行(Threshold Issuance)
ブラインド署名、再ランダム化可能な認証情報、選択的開示は、いずれも何年も、あるいは何十年も前から暗号の文献に存在するものです。これまで見てきたように、これらをつなぎ合わせると、いくつかの興味深い性質があることが分かります。しかし、これまで、これらの方式には、署名が常に中央集権的である、という共通点がありました。
ココナッツの大きな進歩は閾値発行(threshold issuance)です。Coconutでは、署名を行う権威が1つではなく、複数の権威が(まとめて、あるいはm個のうち閾値n個の署名として)署名を行います。これにより、Coconutベースの署名を分散的に発行することが可能になり、以前は中央集権的なシステムでのみ利用可能だったプライバシーの良さをすべて得ることができます。
最後に
Nymのバリデーターはココナッツに基づいた署名を発行します。これにより、以下の4つの機能が追加され、強力なプライバシー保証を提供します:
- 鍵生成(Keygen)
- 検証(Verify)
- 署名(Sign)
- ブラインド発行
- 再ランダム化可能な署名
- 選択的開示
- 閾値発行
当初はアクセス認証情報やサービスプロバイダーへの支払いを匿名化するために使用され、将来的にはブロックチェーンシステム(Bitcoin、Ethereumなど)にオンチェーンのトランザクションプライバシーを追加するためにも利用可能です。