楕円曲線演算 (GMP)
GNUプロジェクトの多倍長精度整数演算ライブラリ (GMP:GNU Multiple Precision Arithmetic Library)を使った楕円曲線演算のサンプルプログラムです.
楕円曲線演算(加算,スカラー倍算)
- 概要
GMP を用いて 楕円曲線演算 (加算とスカラー倍算) を行うプログラム (関数ライブラリ) です.ソースプログラムは,eccalc.c です.
楕円曲線演算の詳細については,楕円曲線の加算と減算を参照.
楕円曲線を E: y2 = x3 + ax + b mod p とします.ここで,a と b は法 p での整数であり,楕円曲線を決定するパラメータです.
楕円曲線演算は,アフィン座標系とプロジェクティブ座標系で実装されています.
関数における注意点は,以下です.
- 戻り値は特に断らない限り,正常終了時 0,それ以外は 1 である.
- 関数 ecpAdd, ecpMul は,コンパイル時にコンパイルオプション -DECP_2D を指定するとアフィン座標系,-DECP_3D を指定するとプロジェクティブ座標系の関数になります.
- アフィン座標系では,z座標は常に 1 として扱われます.
- 関数仕様
以下の関数が実装されています.
- int ecpAdd (mpz_ptr px, mpz_ptr py, mpz_ptr pz, mpz_ptr p1x, mpz_ptr p1y, mpz_ptr p1z, mpz_ptr p2x, mpz_ptr p2y, mpz_ptr p2z, mpz_ptr a, mpz_ptr p)
楕円点 P1 (p1x, p1y, p1z) と楕円点 P2 (p2x, p2y, p2z) の加法点 P (px, py, pz) = P1 + P2 を求める.
コンパイル時に -DECP_2D を指定するとアフィン座標系,-DECP_3D を指定するとプロジェクティブ座標系での関数になる.
- int ecpMul (mpz_ptr px, mpz_ptr py, mpz_ptr pz, mpz_ptr k, mpz_ptr p1x, mpz_ptr p1y, mpz_ptr p1z, mpz_ptr a, mpz_ptr p)
楕円点 P1 (p1x, p1y, p1z) のスカラー倍点 P (px, py, pz) = k P1 を求める.
コンパイル時に -DECP_2D を指定するとアフィン座標系,-DECP_3D を指定するとプロジェクティブ座標系での関数になる.
- int ecpAdd_2D (mpz_ptr px, mpz_ptr py, mpz_ptr pz, mpz_ptr p1x, mpz_ptr p1y, mpz_ptr p1z, mpz_ptr p2x, mpz_ptr p2y, mpz_ptr p2z, mpz_ptr a, mpz_ptr p)
アフィン座標系において楕円点 P1 (p1x, p1y, p1z) と楕円点 P2 (p2x, p2y, p2z) の加法点 P (px, py, pz) = P1 + P2 を求める.
- int ecpMul_2D (mpz_ptr px, mpz_ptr py, mpz_ptr pz, mpz_ptr k, mpz_ptr p1x, mpz_ptr p1y, mpz_ptr p1z, mpz_ptr a, mpz_ptr p)
アフィン座標系において楕円点 P1 (p1x, p1y, p1z) のスカラー倍点 P (px, py, pz) = k P1 を求める.
- int ecpAdd_3D (mpz_ptr px, mpz_ptr py, mpz_ptr pz, mpz_ptr p1x, mpz_ptr p1y, mpz_ptr p1z, mpz_ptr p2x, mpz_ptr p2y, mpz_ptr p2z, mpz_ptr a, mpz_ptr p)
プロジェクティブ座標系において楕円点 P1 (p1x, p1y, p1z) と楕円点 P2 (p2x, p2y, p2z) の加法点 P (px, py, pz) = P1 + P2 を求める.
- int ecpMul_3D (mpz_ptr px, mpz_ptr py, mpz_ptr pz, mpz_ptr k, mpz_ptr p1x, mpz_ptr p1y, mpz_ptr p1z, mpz_ptr a, mpz_ptr p)
プロジェクティブ座標系において楕円点 P1 (p1x, p1y, p1z) のスカラー倍点 P (px, py, pz) = k P1 を求める.無限遠点の場合の戻り値は 1 である.
- int toAffine (mpz_ptr px, mpz_ptr py, mpz_ptr pz, mpz_ptr p)
楕円点 P (px, py, pz) をプロジェクティブ座標系からアフィン座標系に変換する.
z 座標の値は 1 になる.