私は楕円曲線暗号の小さなプロジェクトを書いています。このプログラムは、アフィン座標系を使用するとうまく機能します。つまり、各点は2つの座標(x'、y')で表されます。
ここで、アフィン座標系を、各点が3つの座標(x、y、z)、x'= x /z²、y' =y/z³で表されるジャコビアン座標系に置き換えようとしています。
アフィン座標をジャコビアン座標に変換する方法を知りたい**。一部のチュートリアルでは、次の式を使用します。(x、y)=(x、y、1)これは、z座標が常に1に設定されることを意味します。しかし、それが正しいかどうかはわかりません。
次に、楕円曲線上の点の追加について、P(x1、y1、z1)+ Q(x2、y2、z2)= R(x3、y3、z3)を計算します。プログラムでは次の式を使用しました。
u1 = x1.z2²
u2 = x2.z1²
s1 = y1.z2³
s2 = y2.z1³
h = u2 - u1
r = s2 - s1
x3 = r² - h³ - 2.u1.h²
Y3 = r. (U1.h² - x3) - s1.h³
z3 = z1.z2.h
しかし、プログラムをテストすると、たとえば(-2854978200、-5344897546224,578)などの負の座標が得られます。そして、結果を式(x'= x /z²、y' = y /z³)を使用してアフィン座標系に変換しようとすると、(-8545、-27679)が得られ、実際にはx座標は-8545.689です。 ...ジャコビアンのx座標はz²で割り切れません。
座標が整数でない場合はどうすればよいですか?そして、彼らが否定的であるならば?曲線のフィールドサイズでMODを試みましたが、結果も正しくありません。
したがって、ジャコビアン座標を使用するポイント(x,y,1)
は正しいですが、一意ではありません。満足するすべてのポイント(a^2.x,a^3.y,a)
は同等です。そして私のプログラムでは、曲線は素体で定義されているので、計算するときにu1, u2, s1, s2 ...
各変数にMOD pを適用する必要がありますか?
そして、最終結果をアフィン座標に戻すために、たとえばx座標、実際には除算ではなく、モジュラ逆数ですか?たとえば、私の曲線は有限の素体で定義されてp=11
おり、ジャコビアン座標を使用してポイントがあり、(15,3,2)
ジャコビアンx座標をアフィンx座標に変換するには、を計算する必要があります。したがって、アフィネx2^2 = 4 => x = 4^-1 mod p => x = 3
座標15.3 mod p = 1
は1です。 ?
ジャコビアン座標の目的は、加算中の分割を回避することです。しかし、Thomas Porninが言ったように、私たちが計算するとき、P1 + P2 = P3
処理するいくつかの特別なケースがあります。
- P1とP2は両方とも無限です:
P3=infinite
。 - P1は無限です:
P3=P2
。 - P2は無限です:
P3=P1
。 - P1とP2のx座標は同じですが、y座標が異なるか、両方のy座標が0に等しくなります
P3=infinite
。 - P1とP2のx座標は異なります
Addition formula
。 - P1とP2の座標は同じです:
Doubling formula
。
そして、これが私のC関数のプロトタイプです。
jac_addition(jacobian *, point *, jacobian *);
jac_doubling(jacobian *, jacobian *);
point
jacobian
アフィン座標系およびジャコビアン系で定義された点を表す構造体です。
問題は、これらの特殊なケース、特に4番目のケースを処理するときに、両方のポイントをアフィン座標に変換し直しているか、それらの座標を比較できないため、除算を計算する必要があることです。