一類退化三次曲線及其在離散域的應用

模p整數(shù)域中橢圓曲線上的加法群

我們通常使用的橢圓曲線加密算法,都是建立在模p整數(shù)域\mathrm{F}_p中橢圓曲線上的加法群上的,其主要使用的特點,是這個加法群中計算P = n G, G \in \mathrm{F}_p \land n \in N是相對很簡單的,但如果知道P和G要反過來求n則非常困難。它是循環(huán)群上離散對數(shù)問題(應用它的加密算法是ElGamal加密算法)在橢圓曲線加法群上的推廣。

我們這里就來簡要介紹一下這個群是什么樣的。

橢圓曲線及其上的加法

橢圓曲線是形如下式的曲線:

y^2 = x^3 + a x + b

其中為了避免奇點,我們要求 4 a^3 + 27 b^2 \neq 0

下面就是一個橢圓曲線的示例:

橢圓曲線

接下來,我們過曲線上兩點來做一條直線,顯然由于橢圓曲線是三次曲線而直線是一次,最后交點方程是一個三次方程,它有三個解,其中兩個是我們已知的兩點,而第三個解就是直線與橢圓曲線相交的第三點。也即,任意一條直線最多與橢圓曲線相交與三點,我們將其記為A、B、C。

接著,我們定義上述三個交點滿足橢圓曲線上的加法:A + B + C = 0

注意,這里的加法并不是通常意義上我們在實數(shù)域上所定義的加法,而是橢圓曲線上的加法,只不過依然用“+”這個符號來表示而已。

由于直線與橢圓曲線相交最多只有三個交點,最少可以沒有交點,所以我們?yōu)闄E圓曲線補上無窮遠點,這樣如果發(fā)現(xiàn)在通常的無限大平面上直線與橢圓曲線的交點不足三個,那我們可以說還有一到三個交點在無窮遠處,即都是無窮遠點。

這樣的橢圓曲線稱為“射影橢圓曲線”,但我們一般直接稱它為橢圓曲線就足夠了,只是大家要記住這里要補上了一個無窮遠點。

因此,我們現(xiàn)在可以說:任何一條直線與橢圓曲線的交點都有三個。

實際上我們可以說必然有四個,因為等式右邊的0也可以視為無窮遠點,而實際上無窮遠點并不是真的只是一個點,直線的兩端都會在無窮遠點上和橢圓曲線“相交”。

而加法運算也就可以通過直線與橢圓曲線的交點來給出。

比如,如果我們已知橢圓曲線上兩點A和B,過它們的直線與橢圓曲線還會有第三個交點C',那么C'關于x軸的對稱點C就是A和B在橢圓曲線加法操作下的結(jié)果,如下圖:

image

我們下面來手算一下這樣定義的加法的結(jié)果:

\begin{cases} y^2 = x^3 + a x + b\\ y = k x + m \end{cases} \Rightarrow\\ x^3 - k^2 x + (a - 2 k m) x + b - m^2 = 0\\ \because \left( x- x_A \right) \left( x- x_B \right) \left( x- x_C \right) = 0\\ \therefore \begin{cases} x_A + x_B + x_C = k^2\\ x_A x_B + x_B x_C + x_C x_A = a - 2 k m\\ x_A x_B x_C = m^2 - b \end{cases}\\ \therefore \begin{cases} x_C = \left( \frac{y_A - y_B}{x_A - x_B} \right)^2 - \left( x_A + x_B \right)\\ y_C = \frac{ \left( x_A - x_C \right) \left( y_A - y_B \right) }{ x_A - x_B } - y_A \end{cases}

上述結(jié)果是在A和B的x坐標不相等時成立的,因此我們還需要補充考慮兩個例外情況。

首先,如果A和B關于x軸對稱,那結(jié)果直線與y軸平行,結(jié)果是第三交點為無窮遠點,答案就是0(體現(xiàn)在x坐標上就是無窮大)。

而如果A和B是同一個點,那此時直線與橢圓曲線相切,結(jié)果便調(diào)整為:

\begin{cases} x_C = \left( \frac{3 x_A^2 + a}{2 y_A} \right)^2 - 2 x_A\\ y_C = \frac{ \left( x_A - x_C \right) \left( 3 x_A^2 + a \right) }{ 2 y_A } - y_A \end{cases}

這么一來,加法的定義就完成了,下面來看它是否構成群。

群是滿足如下四條定義的帶二元運算“+”的集合G:

  • 封閉性:如果a和b都是G的元素,那a+b也必須是G的元素;
  • 單位元:存在單位元e,使a+e=e+a=a
  • 可逆性:必然存在唯一的元素b使a+b=b+a=e
  • 結(jié)合律:(a+b)+c=a+(b+c)

如果還滿足交換律a+b=b+a,那這樣的群就被稱為阿貝爾群。

我們前面在橢圓曲線上定義的加法運算,封閉性、單位元和可逆性是顯然滿足的,甚至交換律也是顯然滿足的,關鍵就是是否滿足結(jié)合律。所以我們下面用一個“巧妙”的方式來證明這點。

首先要介紹一下Cayley-Bacharach定理

Cayley-Bacharach定理:射影平面內(nèi),任意兩條不同的平面三次曲線會相交于9點(相切算兩點),那么如果第三條不同的平面三次曲線經(jīng)過了其中任意8點,則它必然經(jīng)過第九點。

接著,我們用A \circ B表示通過A和B的直線與給定橢圓曲線E相交的第三點,因此就有A + B = O \circ (A \circ B),這里O為無窮遠點,它還能給出一個很有用的性質(zhì):O \circ (O \circ A) = A

于是,我們可以構造這么三條直線:

\begin{cases} L_1 = \overline{A, B, A \circ B}\\ L_2 = \overline{C, A + B, C \circ (A + B)}\\ L_3 = \overline{B + C, B \circ C, O} \end{cases}

用這三條直線可以構造一個很“奇特”的三次曲線,一條退化三次曲線:

C_1: \left( y - k_1 x - m_1 \right) \left( y - k_2 x - m_2 \right) \left( y - k_3 x - m_3 \right) = 0

這里三個括號中的就是上述三條直線的標椎方程。

顯然,退化三次曲線C_1與原橢圓曲線E相交于9個點(這九個點記錄\left< C_1, E \right>):C \circ (A + B)ABCA \circ BA + BB + CB \circ C以及無窮遠點O

接下來,我們再構造三條直線:

\begin{cases} \Gamma_1 = \overline{C, B, C \circ B}\\ \Gamma_2 = \overline{A, C + B, A \circ (C + B)}\\ \Gamma_3 = \overline{B + A, B \circ A, O} \end{cases}

它們一樣可以構成一條退化三次曲線C_2,它和E一樣相較于九個點\left< C_2, E \right>,和\left< C_1, E \right>可知有8個點是相同的,差別在于第九個點,之前是C \circ (A + B)而現(xiàn)在是A \circ (C + B)

根據(jù)上面提到的Cayley-Bacharach定理,我們可以斷定C \circ (A + B) = A \circ (C + B)。再結(jié)合A + B = O \circ (A \circ B)O \circ (O \circ A) = A,就可以得到我們所要的結(jié)合律(別忘了橢圓曲線上的加分滿足交換律):(A + B) + C = A + (B + C)

那如果A、B、C中有點相同怎么辦?別忘了Cayley-Bacharach定理中切點算兩個點,所以一樣可以用。

至此,我們就證明了上面所定義的橢圓曲線上的加分可以構成群。

附帶一提,除了很少的幾個例外,幾乎所有平面三次曲線都可以通過坐標變換變成橢圓曲線。其中有幾類很有趣的特例:三條直線(一次曲線)的并(也就是我們上面構造的兩條退化曲線),以及,一條圓錐曲線與一條直線的并,都被歸類為“退化橢圓曲線”。

實數(shù)域子域上的橢圓曲線

從前面關于橢圓曲線的定義可以看出,雖然我們將其定義在實數(shù)域的射影平面上,但實際上可以定義在各類域上,比如最常見的復數(shù)域。

我們可以先看有理數(shù)域上的橢圓曲線,即只考慮一條橢圓曲線上的所有有理點(x和y都是有理數(shù)),按照之前得到的結(jié)果,其加法結(jié)果為:

\begin{cases} x_C = k^2 - \left( x_A + x_B \right)\\ y_C = k \left( x_A - x_C \right) - y_A \end{cases}\phantom{wwwwwww}\\ k = \begin{cases} \frac{y_A - y_B}{x_A - x_B} \phantom{www} x_A \neq x_B\\ \infty \phantom{wwwaaa} x_A = x_B \land y_A \neq y_B\\ \frac{3 x_A^2 + a}{2 y_A} \phantom{wwai} x_A = x_B \land y_A = y_B \end{cases}

很顯然,只要A和B本身是有理點、曲線E的參數(shù)a和b也都是有理數(shù),那A+B也必然是有理點。

Mordell-Weil定理告訴我們:有理數(shù)域上的任意(非退化)橢圓曲線加法群都是有限生成阿貝爾群:E(\mathbb{Q}) = \mathbb{Z}^r \oplus T,r被稱為E的秩,T是E的撓點集

也就是說,我們只需要有限個有理點,然后通過橢圓曲線加法就可以找出它的所有有理點——當然,要找到所有這些基點(用來生成其它有理點的初始有理點)本身是非常困難的,但我們至少知道它數(shù)量有限。

我們可以將數(shù)域做進一步限制:如果是整數(shù)域呢?

Siegel定理告訴我們:任意(非退化)橢圓曲線的整點,或者x與y之一為整數(shù)的點,只有有限多個

如果我們再將數(shù)域進一步壓縮,壓縮到有限域,那就有另一個定理了——

Hasse定理:有q個元素的有限域上任意(非退化)橢圓曲線的點的數(shù)量N滿足|N - (q + 1)| \leq 2 \sqrt{q}

在橢圓曲線密碼學中,我們所使用的就是一類特定的有限域:\mathbb{F}_p,即整數(shù)模p域,p是一個素數(shù)。

所謂整數(shù)模p域,其實很好理解,就是只考慮從0到p-1這p個整數(shù)所構成的域。對于橢圓曲線而言,就是將其做模運算:

y^2 \mod p = x^3 + a x + b \mod p

我們一般可以將左側(cè)的(mod p)省略。

我們可以先考慮實數(shù)模p域,此時橢圓曲線其實等價于這么一組:

y^2 = x^3 + a x + b + n p \ \ \ \ n \in \mathbb{Z}, \ \ x \in [0, p), \ \ y \in [0, p)

我們可以來看一個簡單的例子:

y^2 = x^3 - 7 x + 10 (mod 3)

當然,對我們實際使用來說最有意義的是所謂的“整點”(即xy坐標都是整數(shù)的點)的分布,所以我們下面來看同一條橢圓曲線在不同模下的整點分布情況:

y^2 = x^3 - 7 x + 10 (mod p), p = 19, 97, 127, 487

同樣的,現(xiàn)在連接曲線上兩點A和B的直線其實可以視為一組直線而不是一條:

y \mod p = k x + m \mod p \Rightarrow\\ y = k x + m + n' p \ \ \ \ n' \in \mathbb{Z}, \ \ x \in [0, p), \ \ y \in [0, p)

接著,我們依然使用和實數(shù)域上橢圓曲線相同的方式來定義\mathbb{F}_p上的橢圓曲線的加法,從而會發(fā)現(xiàn)其實結(jié)果在形式上是一樣的,只需要加上mod p即可:

\begin{cases} x_C = k^2 - \left( x_A + x_B \right) \mod p\\ y_C = k \left( x_A - x_C \right) - y_A \mod p \end{cases}\phantom{wwwwwww}\\ k = \begin{cases} \frac{y_A - y_B}{x_A - x_B} \mod p \phantom{www} x_A \neq x_B\\ \infty \phantom{wwwwwwwwaaa} x_A = x_B \land y_A \neq y_B\\ \frac{3 x_A^2 + a}{2 y_A} \mod p \phantom{wwai} x_A = x_B \land y_A = y_B \end{cases}

這里需要注意的是除法。在實數(shù)模p域中,其結(jié)果是非唯一的,\frac{1}{x}\frac{1 + p}{x}\frac{1 + n p}{x} 都可以是x的逆。在整數(shù)模p域中,x的逆定義為x \times y = 1 \mod p。因此上面計算斜率時,實際上是我們先求出x_A - x_B2 y_A的逆,然后再做其余的運算。

下面是一個簡單的例子:

y^2 = x^3 - x + 3 (mod 127) 上整點的加法

當然還有更復雜的情況,比如:

y^2 = x^3 + 2 x + 3 (mod 97) 上整點的加法

這個是不是看上去很“過分”?

整數(shù)模p域中橢圓曲線有一個很有趣的性質(zhì),那就是對每個點P,都存在一個自然數(shù)n,使得nP=0,我們將這個n稱為點P的階(滿足這個條件的自然數(shù)n可以無限多,我們?nèi)∽钚〉哪莻€)。另一方面,現(xiàn)在這條橢圓曲線上總共有多少點N,被稱為這條橢圓曲線的階。根據(jù)Lagrange定理有:N = \prod_P n(P)

下面才到最有趣的部分:假定我們知道了G = n P中的P和G,是否可以反推出自然數(shù)n?

推當然是可以推的,但這個計算幾乎沒有任何捷徑可走,只能不斷暴力求解(當然,諸如“Baby step, Big step”和“Pollard rho”算法可以將求解次數(shù)做一個降低,但本質(zhì)上也算是暴力求解了)。

這就是著名的“離散對數(shù)難題”。

之所以說是離散“對數(shù)”而不是離散“除數(shù)”,是因為它形式上與循環(huán)群上的ElGamal算法中的對數(shù)很像,所以習慣上沿用了ElGamal算法中的“離散對數(shù)”的稱呼。

ElGamal算法中,我們從q階循環(huán)圈Q中選擇一個群元P,然后再從1到q-1中選擇一個自然數(shù)n,計算G = P^n。現(xiàn)在如果你知道了P和G,要反推n,那將非常困難。

利用有限域上橢圓曲線加法群的加密算法

假定,端點星要將一個數(shù)據(jù)M傳遞給索拉里星,但川陀會進行攔截,那它應該怎么辦?

如果使用RSA加密算法,一個簡單流程是這樣的:

  1. 索拉里星找到兩個大素數(shù)p和q,并計算N=pqr=(p-1)(q-1)
  2. 選小于r且與r互質(zhì)的自然數(shù)e,及e的模r逆d:ed=1 \mod r
  3. (N,e)是公鑰公開廣播給全宇宙,而(N,d)是私鑰,只有索拉里星人自己知道
  4. 端點星人計算C=M^e \mod N,并全宇宙廣播
  5. 索拉里星人計算M=C^d \mod N

整個過程中,川陀人如果想要破譯,就必須從N求解p和q,但這是非常困難的一件事。這個求解被稱為“素數(shù)分解問題”。

如果使用ElGamal算法,那過程是這樣的:

  1. 索拉里星人選擇一個q階循環(huán)群Q,Q的一個元素P,1到q-1的一個自然數(shù)n,并計算G=P^n,將(Q,P,G)作為公鑰全宇宙廣播
  2. 端點星人在1到q-1中隨機選擇一個自然數(shù)m,并計算C_1=P^mC_2=M G^m,這里M已經(jīng)被編碼為Q中元素,編碼方式公開透明,接著端點星人廣播(C_1,C_2)
  3. 索拉里星人計算M=C_2 \left( C_1^n \right)^{-1}

整個過程中,川陀人如果想要破譯,就必須求解G=P^n,這個“循環(huán)群上的離散對數(shù)問題”一樣非常困難。

最后,如果使用橢圓曲線加密算法,那過程和ElGamal算法的過程非常類似:

  1. 索拉里星人選擇一條橢圓曲線(a,b)與有限域的模參數(shù)q,并尋找曲線上的一個整點P,確保P的階l足夠大,選擇不大于l的自然數(shù)n,計算G=nP,將(a,b,q,P,G)作為公鑰全宇宙廣播
  2. 端點星人隨機選擇不大于l的自然數(shù)m,計算C_1=mPC_2=M+mG,這里M已經(jīng)被編碼為橢圓曲線上整點,編碼方式公開透明,接著端點星人廣播(C_1,C_2)
  3. 索拉里星人計算M=C_2-nC_1

是不是發(fā)現(xiàn)橢圓曲線加密算法和ElGamal算法幾乎一樣?事實上由于整數(shù)模p域上整點的階有限,所以它實際上也構成了一個循環(huán)群,因此和ElGamal算法一樣都是循環(huán)群上的離散對數(shù)問題,只不過橢圓曲線上的加法比ElGamal算法選用的循環(huán)乘法計算起來更復雜一點而已。

事實上,密碼學家早就發(fā)現(xiàn)ElGamal算法與RSA算法具有相似的數(shù)學結(jié)構,都可以用量子計算機上的經(jīng)典Shor算法予以破解。而橢圓曲線加密算法(ECC)在2015年時被Kirsch和Chow指出一樣可以用修改后的Shor算法來破解,而且由于ECDSA的密鑰空間相比RSA更小,所以破解起來很可能更快更方便。這點甚至早在2003年的時候就被Proos和Zalka證明過[^proof]:160比特的ECC可以用1000量子位的量子計算機來破解,而一般認為安全等級相同的1024位的RSA卻需要使用2000量子位的量子計算機才能破解。

[proof]: J. Proos and C. Zalka, “Shor’s Discrete Logarithm Quantum Algorithm for Elliptic Curves,” Quantum Info. Comput., vol. 3, no. 4, pp. 317–344, 2003.

PS:Proos和Zalka也給出了一些如何用Shor算法破解ECC的思路,但Kirsch和Chow給出了具體的算法,所以兩者工作雖然看上去很接近,但到底還是不一樣的。

換一個玩法

上面我們介紹了傳統(tǒng)有限域上橢圓曲線上加法群即用于加密的一些情況,但這不是我們這篇文章的重點。

我們希望討論這么一個問題:如果換一種曲線,會怎么樣?

而且,實際上我們最后在ECC中所用到的性質(zhì),實際上總結(jié)下來就一句:整點P在特定加法定義下可以構成循環(huán)群。

事實上,由于要做加法的話需要三個點,所以是不是只要一組曲線與一條直線有三個交點,就可以構造這樣的加法操作呢?而且三條直線的并本身就是一種退化了的橢圓曲線嘛,它顯然可以構造這種與一條直線有三個交點的情況。

10曲線上的加法群

我們將一根直線并上一個橢圓的形式,稱為“10曲線”。

我們先從最簡單的正圓開始:

\left( y^2 + x^2 - R^2 \right) (x - L) = 0

這樣的三次曲線當然可以通過恰當?shù)摹白鴺俗儞Q”變成一條橢圓曲線:
\begin{cases} z = y \sqrt{x - L}\\ w = x - \frac{1}{3} L \end{cases}\Rightarrow\\ z^2 + w^3 - \left( \frac{1}{3} L^2 + R^2 \right) w + \frac{2}{27} \left( 9 R^2 - L^2 \right) L = 0\\
但這樣的坐標變換存在一個問題,那就是當x<L時,z其實已經(jīng)是虛數(shù)了,因此在實空間它無法正確表達直線左側(cè)的圓部分的情況。而直線部分在坐標變換后完全退化到了\left( \frac{2L}{3}, 0 \right)這一個點上,顯然也不是什么好性質(zhì)。因此,10曲線這樣的三次曲線被稱為是一種退化橢圓曲線,而10曲線上也會有一些正常橢圓曲線上所沒有的性質(zhì)。

下面,我們確保L^2 > R^2,這樣的曲線就不存在自相交點。接著,我們采取和橢圓曲線上加法一樣的操作方式,過這條10曲線上兩點做直線,該直線必與這條10曲線相交于第三點:如果前兩點都在圓上,除非垂直于x軸,否則必與一旁的直線有交點;而如果垂直于x軸,那可以認為與直線相交于無窮遠點O;如果一點在圓上一點在直線上,那要么圓上點正好是切點,要么必與圓有第二個交點。比較麻煩的是直線上兩點,這個我們暫不考慮。

從而,這樣的直線與10曲線的三個交點A、B、C就滿足加法關系A+B+C=0

我們來計算兩個情況下的加法結(jié)果。

第一種情況,A=\{ R \cos \theta, R \sin \theta \}B = \{ R \cos \phi, R \sin \phi \},且A和B的x坐標不相等,這樣C的y坐標值就是:

y_C = \frac{ ( x_B y_A - x_A y_B ) - L ( y_A - y_B ) }{x_A - x_B}

如果A和B垂直于x軸,那不用算了,結(jié)果就是無窮遠點O。如果A和B重合,那此時結(jié)果變?yōu)椋?/p>

y_C = \frac{ L x_A - R^2 }{ y_A }\\

而如果點B在直線上而點A在圓上,情況則變?yōu)椋?/p>

\begin{cases} x_C = 2 \frac{(x_A y_B - L y_A) (y_B - y_A)}{(y_B - y_A)^2 + (L - x_A)^2} - x_A\\ y_C = 2 \frac{(x_A y_B - L y_A) (L - x_A)}{(y_B - y_A)^2 + (L - x_A)^2} + y_A \end{cases}

我們來看一個示意圖:

L=10, R=5

那么,如果兩個點都落在直線部分,加法要怎么做呢?

我們可以去直線上點X為圓上輔助點A和B的合,而另一個直線上點Y是圓上點A和C的合,然后計算B+C(顯然落在直線上),再計算A+B+C(落在圓)上,最后計算2A+B+C(落在直線)上:

y_C = \frac{y_A y_B + R^2 - L^2}{y_A + y_B}

通過復雜的計算可以發(fā)現(xiàn),直線上兩點通過這種方式定義的和并不依賴于圓上輔助點A的選擇(這里一開始程序出了個小錯誤,居然還得出了依賴圓上輔助點A的結(jié)論,汗……)。至此,我們終于合理定義出了整個10曲線上的加法,而且由于10曲線是退化了的橢圓曲線,所以由Cayley-Bacharach定理可知這個加法在10曲線上的確構成加法群。

對于橢圓也會有類似的結(jié)果,事實上對于任意橢圓,我們總可以通過縮放與旋轉(zhuǎn)將其變換為10曲線,所以不會有什么特別的新結(jié)果出來。而且,這里的兩個參數(shù):圓半徑R和直線到圓距離L,也并不是都自由,我們可以將L固定為1,而R是一個0到1之間的值。

因此10曲線的實際特征自由度,只有1個(即便使用橢圓也是如此)。

10曲線雖然在很大程度上和普通橢圓曲線很是相近,但也有一些不同。

比如,如果我們將L與R取為無理數(shù),那整條10曲線上將沒有一個有理點,更不用說整點了。而另一方面,如果L取為整數(shù),那10曲線上的整點數(shù)顯然為無窮多。這兩個都是傳統(tǒng)橢圓曲線所沒有的特性。

我們下面再主要看一下直線上的點和圓上點P的和,特別是同一個點P的2n+1次自加的情況。

我們假定直線上的點的y值為Y,而圓上點則是x軸正向旋轉(zhuǎn)\theta_0后得到的,這樣兩者的和到x軸正向的角度為\theta_1,其值為:

\theta_1 = \pi + \theta_0 - 2 \arctan \left( \frac{Y - R \sin \theta_0}{L - R \cos \theta_0} \right)

這里岔開一下。
事實上,利用上面的結(jié)論,我們可以計算直線上兩點利用輔助點來做加法的結(jié)果,實際上并不依賴輔助點的選擇,這一結(jié)論。當然,證明過程會比較繁瑣,你可以考慮使用Mathematica。

另一方面,我們可以用將x和y坐標換用下面這種形式來表達:

x = R \frac{2 t}{1 + t^2};\ \ \ \ y = R \frac{1 - t^2}{1 + t^2}

因此就有如下關系:

\arctan t_1 = \frac{\pi}{2} + \arctan t_0 - \arctan \left( \frac{Y (1 + t_0^2) - 2 R t_0}{L (1 + t_0^2) - R (1 - t_0^2)} \right)

也即:

t_1 = \frac{L - R + Y t_0}{Y - (L + R) t_0}

這個結(jié)果可以推廣到如下形式:

t_{n + 1} = \frac{L - R + Y t_n}{Y - (L + R) t_n}

而這里Y就是2P的y值:Y = \frac{L - R - (L + R) t_0^2}{2 t_0}

因此,如果存在某個n使\left| t_n \right| = \left| t \right|,那此時這兩個點要么相等,要么相加0,而如果是后者的話再和直上的點相加一次就可讓新點和原來的點相等。

對于直線上的點也有類似的結(jié)論。

我們?nèi)≈本€上點P為\{L, Y\},則它的n倍點的y坐標為:

Y_n = \frac{\sum_{i=0}^{n} (-1)^i C_n^{2i} Y^{n - 2i} (L^2 - R^2)^{i}}{\sum_{i=0}^{n-1} (-1)^i C_n^{2i+1} Y^{n-1-2i} (L^2 - R^2)^{i}}

Y_n = \frac{F_n}{H_n},則有:F_n + i \sqrt{L^2 - R^2} H_n = \left( Y + i \sqrt{L^2 - R^2} \right)^n,從而可以看出Y_n實際上就是復空間矢量Y + i \sqrt{L^2 - R^2}的幅角的余切乘上一個系數(shù)\sqrt{L^2 - R^2}

如果該矢量的幅角可以表達為圓周的有理數(shù)倍,那顯然點P的若干次自加后會回到自身,否則P的自加只會不斷填滿整條直線而不循環(huán)。

同樣的,由于任何直線外點P都可以表達為直線上一點Q和直線外一點C的和,我們?nèi)為\{-R,0\},其特點為2C=0(之所以選擇這個點的另一個原因,是將它寫為參數(shù)形式時,它對應的參數(shù)為正負無窮,即無窮遠點,從而可以和直線上的無窮遠點對應),因此P的偶數(shù)次自加就等于Q的同樣次數(shù)的自加,P的奇數(shù)次自加則等于Q的n-1次自加再加C,因此如果Q對應的復數(shù)的幅角不是圓周的有理數(shù)倍,那P就無法在有限次自加后回到自身,而只能不斷填充以“布滿”整個圓周部分。

這樣的映射關系并不是10曲線所獨有的,在橢圓曲線上也有。
比如,可以分解為一個閉合圓環(huán)加上一根無限長曲線的橢圓曲線,這樣的映射關系的存在是顯而易見的。而即便是沒有獨立閉合圓環(huán)的橢圓曲線,我們也總可以選擇那唯一一個自己是自己相反點的、橢圓曲線與x軸的交點,然后它和橢圓曲線自身有兩個切點,這兩個切點將橢圓曲線分割為三部分,其中中間的部分可以通過完全一樣的映射,映射到上下兩部分,從而構成完全一樣的一一映射。

所以說,10曲線上有可數(shù)無窮個點在自加有限次后會循環(huán),但剩余不可數(shù)無窮個點則無法通過自加來回到自身,不斷自加只能使其不斷“填充”并“布滿”整條10曲線,這個結(jié)論和Mordell-Weil定理也有所差異。

比如,當我們?nèi)?img class="math-inline" src="https://math.jianshu.com/math?formula=L%3D10" alt="L=10" mathimg="1">、R=5,初始點P為(4, 3)時,自加6次(直線上會有三點)后循環(huán)。而如果取初始點P為(-4, 3),自加10000次后的結(jié)果(沒有循環(huán))如下圖:

有趣的是我們可以看一下參數(shù)t的分布曲線(y值為自加次數(shù)):

顯然,存在一些有趣的周期性,我們將其轉(zhuǎn)成次數(shù)-角度圖來看會更明顯:

我們可以取R為無限小,那么此時角度的遞歸關系將變?yōu)椋?/p>

\theta_1 = \theta_0 + \pi - 2 \arctan \left( \frac{Y}{L} \right)

這就可以解釋上面我們所看到的周期性:每一次自加(其實是加2P)都近似等價于在當前轉(zhuǎn)角上加了\pi - 2 \arctan \left( \frac{Y}{L} \right),所以最后整體效果就等于是在不斷旋轉(zhuǎn)該點,從而可以呈現(xiàn)出周期性。但在R不是無窮小的實際情況中,每次的轉(zhuǎn)角并不固定,所以會出現(xiàn)并不是完全一樣的周期性——我們能看到一些短周期和一些長周期,比如下圖(取前100次自加):

可見,10曲線雖然是退化了的橢圓曲線,但兩者的性質(zhì)并不完全一樣,10曲線有很多好玩的東西。

有限域上的10曲線

雖然我們前面說過決定10曲線特性的參數(shù)只有一個(即\frac{R}{L}),但當我們考慮有限域的時候情況則可以有所不同。

比如我們可以如下形式的10曲線(還沒有窮盡所有可能的10曲線形式):

Q (x, y) = \left[ \left( P_x x \right)^2 + \left( P_y y \right)^2 - \left( P_x R \right)^2 \right] \left( x - L \right)

在實數(shù)域上我們總可以通過坐標旋轉(zhuǎn)、平移、縮放來將其轉(zhuǎn)換為標準形式,但在在\mathbb{F}_p上情況則可能很不一樣。

現(xiàn)在,10曲線的形式為:

\left[ \left( P_x x \right)^2 + \left( P_y y \right)^2 - \left( P_x R \right)^2 \right] \left( x - L \right) = 0 \mod p

我們可以看一些參數(shù)下現(xiàn)在的整點分布:

R=5,L=10,P_x=P_y=1,p=103

R=1,L=2,P_x=P_y=1,p=103

R=10,L=20,P_x=P_y=1,p=103

R=5,L=10,P_x=P_y=1,p=17

R=5,L=10,P_x=P_y=1,p=1009

R=5,L=10,P_x=1,P_y=10,p=103

可以發(fā)現(xiàn),雖然在完整的實數(shù)域上它們是同一條10曲線,但在整數(shù)模p域\mathbb{F}_p上卻可以很不一樣。

讓我們回到非病態(tài)的正常的10曲線Z。

很顯然現(xiàn)在10曲線可以拆分為直線部分x - L = 0\ (\mathrm{mod}\ p)與直線外部分\left( P_x x \right)^2 + \left( P_y y \right)^2 = \left( P_x R \right)^2\ (\mathrm{mod}\ p)。10曲線的階,也即其上所有的點的總數(shù),其實很容易計算:N(Z) = 2 p + 2,其中一個是無窮遠點,p個點在直線上,p+1個點在直線外,且這p+1個點中一個點為(p - R,0),另外p個點可用下式來表示:

\begin{cases} x = R \frac{1 - t^2}{1 + t^2}\mod p\\ y = R P_x P_y^{-1} \frac{2 t}{1 + t^2}\mod p \end{cases}

之所以(p - R,0)無法用上市表達,是因為在\mathbb{F}_p上無法表達無窮大。

當然,必須要強調(diào)的是:并不是所有參數(shù)組合都能在\mathbb{F}_p上構成合適的10曲線

在實數(shù)域,10曲線的直線部分與圓圈部分只要L>R就是彼此獨立的、從而也就是合理的。但在\mathbb{F}_p上情況將變得不同,現(xiàn)在直線部分依然是一條直線(準確地說是x=L而y為0到p-1的整數(shù)的p個點),但直線外部分并不是一個簡單的圓,從上式可以發(fā)現(xiàn)其實現(xiàn)在是一系列分布在“同心圓”上的整點,從而會從原來的正圓位置向內(nèi)外“擴散”出去。

因此,就會存在一個很極端的情況:擴散出去的圓上整點,同時恰好落在了直線上。

當發(fā)生這種情況的時候,我們就認為所選的參數(shù)組合是“病態(tài)”的,它會使得現(xiàn)在10曲線上的加法的定義遇到障礙。

病態(tài)的10曲線還有很多。比如某些參數(shù)組合下(比如取L=13、R=5、P_x=1、P_y=3、p=103)可能會出現(xiàn)兩個直線外點的連線與其中至少一個點相切這么一種詭異的情況(此時等于一根直線與10曲線相交于4點),這樣的10曲線顯然也是病態(tài)的。

所以,我們必須考慮選擇恰當?shù)膮?shù),使得10曲線的行為不病態(tài)。

\mathbb{F}_p中10曲線上的加法的定義,形式上與實數(shù)域上的情況完全相同,只不過要注意除法需要用取模來做。此時直線外兩點的和必然落在直線上,而直線外一點與直線上一點的和必然在直線外,直線上兩點可以通過直線外的輔助點來構造且結(jié)果不依賴于輔助點的選擇,這些結(jié)論都和實數(shù)域上10曲線的加法相同,且一樣可以構成加法群。

但當參數(shù)選擇是“病態(tài)”的時候,我們在那些導致病態(tài)的點上將無法定義合適的加法,這也是我們不選用病態(tài)10曲線的重要原因。

我們可以仿造\mathbb{F}_p上橢圓曲線的做法來定義10曲線上每個點P的“階”l(P)為能使n P = 0成立的最小自然數(shù)n。記C(P)=\left\{ nP | n \in [1, l(P)) \right\},因此如果C(P_2) \subseteq C(P_1),那我們就說P_2可由P_1生成。通過這種方式我們可以將10曲線的所有點都劃分為若干組,每一組都可以由一個元素通過有限次自加來遍歷。我們將能生成組中所有元素的數(shù)稱為“生成元”。

換一個角度來看,我們可以稱無窮遠點為零點,因為這是定義。然后,將兩倍為零的點稱為“半零點”,這樣的點有三個:\{R, 0\}\{p - R, 0\}\{L, 0\}

接著,如果一個點P可以表達為點Q的自加,即P = 2 Q,則稱Q是P的半點而P是Q的倍點。那,由于半零點有三個,我們很容易就可以得到結(jié)論:P的半點數(shù)是4的倍數(shù),且一半在直線上,一半在直線外,且它們四個一組可以通過半零點相互轉(zhuǎn)換。

當然,另一個更加直接的結(jié)論是:直線外點沒有半點,而直線上點有的有半點有的沒有。

n倍點的問題其實可以在上述由生成元生成的循環(huán)組中來考慮。

假定點P屬于組C(Q),生成元為Q,從而有P = n Q,那么P的x倍就是\mathrm{mod}(n x, l(Q)) P。所以一個點是否有x分之一點就取決于是否存在整數(shù)m使下式成立:

m x = n \mod l(Q)

這樣我們不用做具體的計算就能判斷一個點是否存在n分之一點,以及有幾個n分之一點。

直線上的n倍點,利用實數(shù)域上的結(jié)論可以寫為:

Y_n = \frac{\sum_{i=0}^{n} (-1)^i C_n^{2i} Y^{n - 2i} (L^2 - R^2)^{i}}{\sum_{i=0}^{n-1} (-1)^i C_n^{2i+1} Y^{n-1-2i} (L^2 - R^2)^{i}}\mod p

由于當n \ge p時,C_n^m除了m=0和m=n外別的值模p后都為0,因此不難發(fā)現(xiàn)Y_{p+1}=\infty,即(p+1)P=0。也因此,如果nP=0,那么n必然是p+1的因子。

我們總可以取直線上一個特定的生成元E_0,它可以通過p次自加來遍歷直線上所有點,這個點就變得非常重要了。

另一方面,直線外一點總可以表達為\{-R,0\}加上直線上某一點的形式,我們將\{-R,0\}記為E_1,則任何一個點都可以表達為n E_0 + d E_1的形式,其中n \in [0, p)d \in \{0,1\}

形式上說,我們可以由此來定義\mathbb{F}_p上10曲線的乘法:

P_1 = n_1 E_0 + d_1 E_1;\ \ E_2 = n_2 E_0 + d_2 E_1\ \Rightarrow\\ P_3 = P_1 \times P_2 = \mathrm{mod}(n_1 n_2, p) E_0 + d_1 d_2 E_1

這里第二部分不用寫取模的理由倒也是很簡單:它的結(jié)果要么是0要么是1,沒有取模的必要。

這種定義的好處,便是它天然具備乘法環(huán)的所有要素,但缺點就是我們?nèi)绻鲇嬎悖鞘紫纫鉀Q如何用生成元的倍點來表達指定點這一離散對數(shù)問題,難度頗高。當然,從形式上說這樣的定義一點問題都沒有。

同樣的,這個定義也可以用在\mathbb{F}_p的至少部分橢圓曲線上,因為前面已經(jīng)提過,只要橢圓曲線包含一個y值為0的點,那么我們總可以通過橢圓曲線加法將整條橢圓曲線分割為彼此一一對應的兩部分(如果橢圓曲線可以分解為一個閉環(huán)加一條曲線,則這種分割很顯然;如果是一條完整的曲線,前面也介紹過,可以分解為兩個切點之間的部分與兩個切點之外的部分),從而可以寫為n E_0 + d E_1的形式。

容易證明,這樣定義的乘法結(jié)合之前定義的加法,可以在\mathbb{F}_p上的10曲線和橢圓曲線上構成一個交換除環(huán),即一個域。且這個域有一個子域,它是10曲線的直線部分,也是橢圓曲線的非閉合曲線或非中段曲線部分,因此整個10曲線與橢圓曲線作為一個域,是直線域(橢圓曲線就是非閉合曲線域或非中段曲線域)的單擴張域,\{-R,0\}(橢圓曲線就是前面提到的那個與x軸的交點)就是該擴張的本原元。

和橢圓曲線可以用倍點分解很困難這個特性來構造ECC一樣,10曲線也可以利用倍點分解很困難這個特性來構造加密算法,我們可以將之稱為OZCC。OZCC和ECC其實都用到了域上的乘法,但其保密安全性來源于倍點分解而不是乘積分解的難度。因此ECC和OZCC本質(zhì)上和ElGamal算法是相同的,都是模冪難題,只不過用加法來自然構造出了完整的循環(huán)群而已。

如果要進一步拓展10曲線,我們可以將R^2用一個整數(shù)R來取代,這樣\mathbb{F}_p上的點分布還能有更多的變化(比如此時直線外部分很可能沒有y值為0的點,從而上面那種直線內(nèi)外一一對應的做法將不再適用),也可以用雙曲線提到圓而將直線放在y軸上從而構造“川”形曲線,也能得到很多相近但又不完全相同的性質(zhì),也可以構建域。

我們可以發(fā)現(xiàn),10曲線雖然是退化的三次曲線,很多性質(zhì)相對橢圓曲線有了不少的簡化,但在其上構建加法群甚至一個域的方法和橢圓曲線是相同的,我們也可以拿來做很多有趣的事。

至少,用來造一個循環(huán)群然后仿ElGamal或ECC的方法來構造一個加密算法,問題不是很大。

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內(nèi)容