有限体における高速乗算およびモジュラーリダクションアルゴリズムの実装

1 はじめに

有限体に関する基本的な知識については、以下を参照してください。

有限体は、暗号化におけるほぼすべての数学の基礎です。
ZKP 証明システムのすべての演算は有限体に基づいています。

  • AND、OR、NOT などのブール演算を使用するデジタル回路。
  • 加算、乗算、否定などの有限体演算を使用する算術回路。

ただし、実際のコンピュータには有限体回路デバイスはなく、次のものしかありません。

  • rax、rbxを追加
  • MULラックス
  • SHRラックス、CL

したがって、上記の演算に基づいて有限体演算を構築する必要があります。
次の理由により、有限フィールド演算の速度が重要です。

  • ZKP の使いやすさに対する最大の障害は、証明のオーバーヘッドです。
  • ほぼすべての証明時間は有限体の演算に費やされます。 ZKP プルーフ速度を改善するには:
    • 有限体演算の数を減らす (例: より効率的な NTT または MSM アルゴリズム)
    • 有限体の演算をより効率的にする (例: 最適化された有限体の表現を使用する)

この記事の主な内容は次のとおりです。

  • BigInts
  • BigInts の古典的な加算演算
  • BigInts の古典的な乗算演算
  • モジュラー リダクション (バレットのアルゴリズム): 数値表現を変更できない場合に最も役立ちます。
  • モンゴメリフォーム
  • 乗算と減算 (モンゴメリ アルゴリズム): 最も一般的に使用されるアルゴリズム。
  • 他の乗算アルゴリズム

そして、大きな整数の乗算演算の古典的なアルゴリズム、バレット アルゴリズム、およびモンゴメリ アルゴリズムを比較しました。
ここに画像の説明を挿入します

2. 大きな整数とその加算および乗算演算

多倍長整数。BigInt または多精度整数とも呼ばれます。
実際のコンピュータの演算子はワードベースです:

  • 最近のほとんどすべてのコンピューターは 64 ビット ワードを使用しています
  • ただし、32 ビット ワードが完全に廃止されたわけではありません。たとえばIoTの世界。

より大きなフィールド (256 ビットなど) の場合、フィールドは以下を表すワードに分割されます。

  • たとえば、256 ビットの数値は通常、4 つの 64 ビット ワードで表されます。
  • たとえば、8 桁の 10 進数は 4 つの 2 桁のワードで表すことができます。

大きな整数 27311837 を 10 進数で表すと、対応する値は次のようになります。
(27 31 18 37) 100 (27\ 31\ 18\ 37)_{100} (27311837 )   100

2.1 大きな整数の古典的な加算

に対応する大き​​な整数の加算演算。 (27 31 18 37) 100 + (88 68 97 89) 100 (27\ 31\ 18\ 37)_{ など100} + (88\ 68\ 97\ 89)_{100} (27311837 )   100+(88689789 )   100、計算ルールは次のとおりです:
ここに画像の説明を挿入します
詳細については、楕円曲線および超楕円曲線暗号化ハンドブックのアルゴリズムを参照してください 10.3 アルゴリズム:
ここに画像の説明を挿入します
ここに画像の説明を挿入します
ここに画像の説明を挿入します
ここに画像の説明を挿入します
ここに画像の説明を挿入します
ここに画像の説明を挿入します

2.2 大きな整数の古典的な乗算

( 54   12 ) 100 ∗ ( 36   29 ) 100 (54\ 12)_{100}*(36\ 29)_{100} (5412) 100(3629) 100 大きな整数の乗算を例に挙げます。詳細については、楕円曲線および超楕円曲線暗号化ハンドブックのアルゴリズム 10.8 アルゴリズムを参照してください。< /span>
ここに画像の説明を挿入します
各ステップに対応する計算データは次のとおりです。
ここに画像の説明を挿入します

3. モジュラー削減

上記の加算演算と乗算演算の結果はすべて大きな値であり、これらの大きな結果値は、次のような対応する正規表現に縮小する必要があることに注意してください。
ここに画像の説明を挿入します
一般的なモジュラー リダクション アルゴリズムは次のとおりです:

  • 1) バレット削減アルゴリズム: 数値表現を変更できない場合に最も役立ちます。
  • 2) モンゴメリ乗算およびリダクション アルゴリズム: 最も一般的に使用されるアルゴリズム。

関連するブログには次のようなものがあります。

3.1 バレット削減アルゴリズム

リダクションを実行する最も明白な方法は除算を実行することですが、除算演算はコストが高くつき、定数時間ではない可能性があります。単一ワードの除算演算 b = 1, R = 2 k b=1, R=2^k b=1R=2k 为例:

func reduce(a uint) uint {
    q:= a / n  // Division implicitly returns the floor of the result.
    return a - q * n
}

時間が一定でない場合、タイミング アタック アタックの問題が発生します。
バレット削減は 1 / n 1/n 1/n近似为 m / 2 k m/2^k m/2k,因 m / 2 k m/2^k m/2k の除算は実際には右シフト演算であり、はるかに安価です。 【近似可能 m m m值です m = ⌊ 2 k / n ⌋ m=\left \lfloor 2^k/n\right \rfloor < /span>メートル=2k/n]

func reduce(a uint) uint {
    q := (a * m) >> k // ">> k" denotes bitshift by k.
    return a - q * n
}

ただし、リダクション後の結果は [ 0 , 2 n ) [0,2n) [0,2n)、免费 [ 0 , n ) [0,n) [0,n) であるため、さらに削減する必要があります:

func reduce(a uint) uint {
    q := (a * m) >> k
    a -= q * n
    if a >= n {
        a -= n
    }
    return a
}

楕円曲線および超楕円曲線暗号化ハンドブックのアルゴリズム 10.17 アルゴリズムは、マルチワード バレット削減アルゴリズムに拡張され、reduce の最後のステップの前の結果は Yes ではなくなりました。 [ 0 , 2 n ) [0,2n) [0,2n) ただし、値の範囲がさらに大きくなる可能性があるため、アルゴリズム 10.17 のアルゴリズム ステップでは4 は while を使用します:
ここに画像の説明を挿入します
ここに画像の説明を挿入します
ここに画像の説明を挿入します
ここに画像の説明を挿入します
ここに画像の説明を挿入します
ここに画像の説明を挿入します
ここに画像の説明を挿入します
ここに画像の説明を挿入します
ここに画像の説明を挿入します
ここに画像の説明を挿入します

3.2 モンゴメリ乗算と減算算法

モンゴメリ形式は、乗算と削減を組み合わせた高速アルゴリズムをサポートするもう 1 つの有限体表現です。

以前は、有限体の要素は次のように表現されていました。
x ∈ [ 0 , N − 1 ] x\in [0,N-1] バツ[0,N1]

モンゴメリ形式の表現は次のように定義されます。
[ x ] = ( x R ) m o d N [x]=(xR)\mod N [x]=(xR)に対してN

Montgomery Reduction算法计算的是:
R E D C ( u ) = ( u R − 1 ) m o d    N REDC(u)=(uR^{-1})\mod N REDC(u )=(uR1)に対してバレット削減によって計算された値の代わりに N
u m o d N u\mod N に対してN

REDCREDCREDC は非常に多用途な式です。

  • 1) クラシックをモンゴメリに変換します: [ x ] = R E DC ( ( x R 2 ) mo d N ) [x]=REDC((xR^2)\mod N ) [x]=REDC((xR2)に対してN)
  • 2) モンゴメリをクラシックに変換: R E DC ( [ x ] ) = x REDC([x])=x REDC([x])=バツ
  • 3) モンゴメリ形式で表される乗算演算: ( ( x R mo d p ) ∗ ( y R mod d p ) ∗ R − 1 mo d p ) = ( x y R ) mod p ((xR\mod p)*(yR\mod p)*R^{-1}\mod p)=(xyR)\mod p ((xRに対してp)(yRに対してp)R1に対してp)=(xyR)に対してp楕円曲線および超楕円曲線暗号ハンドブックのアルゴリズム 11.3 アルゴリズムに対応実装:
    ここに画像の説明を挿入します

そのうち『楕円曲線および超楕円曲線暗号ハンドブック』のアルゴリズム 10.22 アルゴリズムに実装されているモンゴメリ削減アルゴリズムは次のとおりです。
ここに画像の説明を挿入します
ここに画像の説明を挿入します
ここに画像の説明を挿入します
ここに画像の説明を挿入します
ここに画像の説明を挿入します
ここに画像の説明を挿入します
ここに画像の説明を挿入します
ここに画像の説明を挿入します
ここに画像の説明を挿入します
ここに画像の説明を挿入します

4. その他の乗算アルゴリズム

乗算アルゴリズムの進化のプロセスは次のとおりです。

  • 乗算アルゴリズムの実行時間は、かつては約 O ( n 2 ) O(n^2) であると考えられていました。O(n2)
  • Karatsuba は、実行時間が O ( n 1.58 ) O(n^{1.58}) である分割統治アルゴリズムを発明しました。O(n1.58)
  • Toom-Cook 乗算アルゴリズムは Karatsuba アルゴリズムに似ていますが、パフォーマンスがわずかに優れています。
  • シェーンハーゲ シュトラッセンは、ランタイムが O ( n ⋅ log ⁡ n ⋅ log ⁡ log ⁡ n ) O(n\cdot \log n\ cdot \log である NTT アルゴリズムを発明しました。 \log n) O(ngnggn)
  • 4096 ビット RSA キーなどの大きな整数を乗算する場合はさらに遅くなります。

参考文献

[1] RISC Zero チーム 2023 年 2 月のビデオ有限体の実装: バレットとモンゴメリー[スライドを参照]< a i= 3>有限体の実装] [2] ウィキペディア バレット削減

RISC Zeroシリーズのブログ

おすすめ

転載: blog.csdn.net/mutourend/article/details/134224122