
シリーズ: Zcashから第一原理へ . 第1回. 有限体 対象読者: 新規参入者。通常の学校で習う算数(加減乗除)のみを仮定し、暗号技術や高度な数学の知識は不要。 得られるもの: 有限体に対する直感的かつ正確な理解、暗号技術者がなぜこれを用いるのか、そしてZcash内でどこに使われているか。
記事0では5つのキャラクターに出会いました: ノート、コミットメント、ノートコミットメントツリー、ヌリファイア、ゼロ知識証明。未解決の疑問がありました:すべての鍵や秘密のレシピはどこから来るのか? それらは数値から来ます。しかし、あなたが育ってきた普通の数値ではありません。特殊で自立した数体系、有限体というものです。Zcashにあるほぼすべての暗号技術はこれに構築されています。
この記事ではそのアイデアをゆっくりと説明します。約束通り、直感から始めます。公式はそれ自身が価値を証明するまで使わないでしょう。
暗号技術にとって普通の数値には問題があります: 無限に存在し、情報が漏れてしまうからです。
ある数値が大きくなるときに何が起こるか想像してください。もし私が秘密の計算が8,142,067を生み出したと伝えたなら、あなたはすでに多くのことを知っています: それは七桁の数値で、奇数であり、「ある程度大きい」ものです。大きさはヒントです。そしてヒントはプライバシー系システムが与えてはいけないものです。
暗号技術は以下のような数体系を望んでいます:
この希望リストには名前があります。それは有限体です。1文字も書く前に、その直感を構築しましょう。
あなたは毎日使っている有限体です。それは壁にある時計です。
12時間の時計では数値が巻き戻る。10時から5時間を加えると、「15時」にはなりません。「3時」になります。時計には12つの位置しかなく、上にカウントしすぎるとスタートに戻ります。

この3つが起こったことで、この記事の要点が明らかになりました:
この巻き戻し算には公式的な名前があります: モジュラ算術。時計は「mod 12」で動作し、「mod 12」と書かれます。数学者たちは0からカウントを開始するのが好きなので、実際の「mod 12」の時計は0, 1, 2, ..., 11の位置を持っています。mod 7の時計なら0から6です。
唯一のルール:
pで計算するときは、普通の算術を行い、その後pで割り、余りだけを保持します。 mod 7の例:5 + 4 = 9,9は7で割ると余りが2になるので、5 + 4 = 2 (mod 7)。
時計では加算できます。体はそのアップグレード: 加減乗除すべてが動作する数体系です。特に難しい除算も可能です。
非公式に、体とは「数」の任意の集合で、**加算、減算、乗算、除算(ゼロ以外で)**が可能であり、すべての慣れ親しんだルールが依然として成り立つものです: 加算や乗算の順序は関係ない、括弧を再グループ化できる、0と1があり、それぞれの数には負数と(ゼロ以外では)逆数がある。
有理数は体です。実数も体です。我々が望むのは有限なものです。
ここに主要な結果があります、そしてそれは美しいものです:
すべての整数
0, 1, ..., p-1を取って、すべての算術を modpで行う。もしpが素数なら、その結果は有限体になる。それをF_p(「F サブ p」と読む)と書く。
したがって、mod 7 の時計風算術を使った F_7 = {0, 1, 2, 3, 4, 5, 6} は本物の有限体です。実際に見てみましょう。
各行の要素は (行 x 列) mod 7:
| x | 0 | 1 | 2 | 3 | 4 | 5 | 6 |
|---|---|---|---|---|---|---|---|
| 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 1 | 0 | 1 | 2 | 3 | 4 | 5 | 6 |
| 2 | 0 | 2 | 4 | 6 | 1 | 3 | 5 |
| 3 | 0 | 3 | 6 | 2 | 5 | 1 | 4 |
| 4 | 0 | 4 | 1 | 5 | 2 | 6 | 3 |
| 5 | 0 | 5 | 3 | 1 | 6 |
1から6の行を見てください: 各行は非ゼロ値 1..6 をそれぞれ一度だけ含んでいます。この「繰り返し無く、欠けもしない」パターンが体の指紋です。
除算とは「逆数をかけること」です。F_7では、数値 a の逆数(または逆元)は a^(-1) で、a x a^(-1) = 1 を満たします。表から直接読み取れます:
a | 1 | 2 | 3 | 4 | 5 | 6 |
|---|---|---|---|---|---|---|
a⁻¹ | 1 | 4 | 5 | 2 | 3 | 6 |
一つ確認: 2 x 4 = 8 = 1 (mod 7)。したがって、F_7での「2で除算」は「4をかける」ということです。すべての非ゼロ要素にパートナーがあります。それがF_7が体である理由です。
これは記事で最も重要なアイデアなので、抽象的なものではなく具体的なものにしてみましょう。
mod 6(6は素数ではない)を使って「体」を無理やり作ってみた場合に何が破綻するか見てください:
2 x x = 1 (mod 6)を満たすようなxは存在しますか? 全てをチェック:2x0=0, 2x1=2, 2x2=4, 2x3=0, 2x4=2, 2x5=4. 答え1は一度も現れない。したがって、2にはmod 6での逆数がない。さらに悪いことに、2 x 3 = 6 = 0 (mod 6):二つの非ゼロの数値をかけてゼロになる。
この第二文は算術にとって大惨事です。二つの非ゼロの数値がゼロに(零因子と呼ばれる)なって除算が破綻し、除算が破綻したシステムは体ではありません。これは6が2 x 3というように因数分解できるから起こります。
素数とは定義上このような因数を持たないものです。したがって、mod 素数では零因子は現れず、すべての非ゼロ要素に明確な逆数があり、構造は適切な体になります。

あなたの記事で使えるワンライナー: 素数モジュラスを入力すると、正確な除算が出力される。
F_7では逆数を表から読み取っていましたが、Zcashで使われる素数は数百桁あり、表は不可能です。古典的なショートカットがあります、そしてこれはこの記事に登場する唯一の公式です。
フェルマーの小定理は、素数 p と任意の非ゼロ a に対して以下を示します:
a^(p-1) = 1 (mod p)
これを変形(aの一つの因子を取り除く)すると逆数が無料で得られます:
a^(-1) = a^(p-2) (mod p)
F_7 (p = 7, p - 2 = 5) でテスト: 2の逆数は 2^5 = 32 = 4 (mod 7) です。実際、表では 2^(-1) = 4 と示されていました。コンピュータは巨大なべき乗を非常に高速に計算できるので、これにより「逆数を見つける」操作は、巨大な素数でも正確で迅速になります。
これを覚える必要はありません。有限体での除算は速くかつ正確な操作であることを知っていれば十分です。それが暗号技術者がこの上に構築する理由です。
直感を組み合わせて、以下のように一ページで説明します。
F_pの特性 | プライバシー系が望む理由 |
|---|---|
| 有限 | コンピュータは任意の要素を正確に保存でき、丸め誤差やオーバーフロー、浮動小数点の曖昧さがない |
| 巻き戻り | 「大きさ」を消去し、値がどのように生成されたかに関する情報を漏らさない |
| 四則演算すべてが動作 | 暗号技術のレシピ(鍵、コミットメント、証明)は実際の代数が必要で、単なるカウントでは済まされない |
| 選べるサイズ | 255ビットまたは381ビットの素数を選ぶと、有限体は観測可能な宇宙にある原子より多くの要素を持ち、推測は不可能になる |
| 正確かつ決定的 | 同じことを計算する二つの正直な当事者は常に同じ結果を得る。証明に依存している |
有限体とは一言で言えば、完璧に閉じた、完璧に正確な、完璧に巨大な算術の遊園地です。Zcashにあるすべてはこれの中から構築されています。
「Zcashは有限体を使用している」ということを信じる必要はありません。ここに具体的なマップがあります(より深い仕組みは後の記事で、ここでは指紋が実際に存在することを示すだけです)。

したがって、記事0の未解決の質問「秘密のレシピはどこから来るのか?」への答えはここから始まります: すべては有限体での算術から始まる。次の記事ではこの体を使って実際のオブジェクト、楕円曲線上の点(鍵やコミットメントになるもの)を構築します。
新規参入者に親しみやすいようにいくつかの真実を簡略化しました。有限体はF_pだけでなく、p^n個の要素を持つもの(拡張体と呼ばれる)も存在します。それらはSaplingの証明システムが依存する「ペアリング」に重要です。また、完全な体の公理リストや、この規模の素数を選ぶ方法や検証方法を省略しました。これらはあなたが持っている直感を変えません。それを精緻化します。後の記事が必要になったら、その精度を取り戻します。
0..p-1の数値を使って素数pでのmod算術を行うと、実際の体F_pが得られ、除算も可能になります。なぜならすべての非ゼロ要素に逆数があるからです。2 x 3 = 0 mod 6)を作り出し、除算を破綻させます。a^(-1) = a^(p-2))を使って逆数を高速に見つけ出します。| 項目 | 平易な意味 |
|---|---|
| Modular arithmetic | 固定値に達して巻き戻る算術、時計のように |
| mod p | pで割って余りだけを保持する |
| Field | 加減乗除すべてが動作する数体系 |
Finite field F_p | 数値 0..p-1 にモジュラ算術(素数 p)を適用した体系 |
| Inverse (reciprocal) | a x a^(-1) = 1 を満たす要素; 「aで除算」は「それをかけること」 |
| Zero divisor | 積がゼロになる二つの非ゼロ値; 合成モジュラスを破綻させるもの |
| Prime | 1より大きい整数で、因数が1とそれ自身だけのもの |
なぜ普通の整数や小数を使わないのか? 小数は丸められたり漂ったりする。整数は無限に大きく成長し、大きさを漏らす。有限体は正確、限定的、大きさに無関心であり、暗号技術が必要とする特性です。
「巻き戻り」は情報の損失を引き起こすのか? 意図的にそうしています。中間値の大きさを消去することはプライバシーにとって特徴であり、欠点ではありません。
より大きな素数は常に安全なのか? 概ね、より大きな体は多くの可能性があり、推測が困難になりますが、セキュリティは全体構造に依存し、体サイズだけでは決まりません。後の記事で詳しく説明します。
なぜZcashでは255ビットや381ビットの素数を使用しているのか? それらは証明システムに適した構造と効率を持つ曲線を構築するために選ばれています。その「適切な構造」について、次の二つの記事で説明します。
F_7では 5 - 6 は?(答え: {0,...,6} 内に残るように巻き戻すことを忘れないでください。)(下記に答えがあります。)
5 - 6 = -1, -1 を F_7 に巻き戻すと 6(なぜなら 6 + 1 = 7 = 0)。したがって、5 - 6 = 6 (mod 7)。引き算は体を離れない; ただ反対方向に巻き戻るだけです。
記事2 . 楕円曲線: 我々が構築した有限体を使って、点を「加える」ことができる奇妙な種類の曲線を描きます。それらの点はZcashの鍵やコミットメントになり、プライバシー系全体を可能にする片道トラップドアを隠します。いつものように、直感から始めます。
ZecHub向けの Zcash from First Principles シリーズの一部。CC BY-SA 4.0ライセンス。
| 4 |
| 2 |
| 6 | 0 | 6 | 5 | 4 | 3 | 2 | 1 |