關於 Curve25519-donna 實現的問題
我試圖了解以下功能的實現:請注意評論中的問題。
int curve25519_donna(u8 *mypublic, const u8 *secret, const u8 *basepoint) { limb bp[5], x[5], z[5], zmone[5]; // why 5 elements in each? uint8_t e[32]; int i; for (i = 0;i < 32;++i) e[i] = secret[i]; e[0] &= 248; e[31] &= 127; e[31] |= 64; fexpand(bp, basepoint); cmult(x, z, e, bp); crecip(zmone, z); fmul(z, x, zmone); fcontract(mypublic, z); return 0; }
- 為什麼所有函式都適用於數字的多項式形式?因此需要 fexpand 功能?據我了解 fcontract 做相反的事情。
- 和$$ 0 $$&= 248; e$$ 31 $$&= 127; e$$ 31 $$|= 64; - 我在白皮書中發現了這個建議,這樣做有什麼特別的原因嗎?
- 為什麼 cmult 執行兩次?crecip函式實現了什麼?
根據我在 Weierstrass 形式的曲線上讀到的內容,為了獲得公鑰 H,需要計算 H = dG(其中 G 是子組的基點)。那麼在 Ed25519 的情況下情況就完全不同了(我知道 Montgomery Curve25519 在雙理上等同於扭曲的 Edwards 曲線 Ed25519),其中公鑰的生成涉及散列並導致非線性密鑰空間。
- 對比 Ed25519,Curve25519 中的私鑰/公鑰是否可以說形成一個線性空間?我想知道在 Curve25519 的情況下是否可以使用公共索引獨立於相應的私鑰生成公鑰。
更新:除了 Lery 提供的出色答案;那些不熟悉投影座標的人可能會發現這很有用。
你有 5 個肢體,因為它基於 DJB 的論文,正如 Ed25519 論文提到的那樣,它使用 $ 2^{51} $ 出於性能原因的基數表示。
這樣做是為了在執行欄位乘法時避免進位。因為否則進位位需要通過後續加法來處理,這甚至會減慢現代 CPU 的速度。
所以根據論文,為了減少昂貴的 adc/subc 指令的數量,它們代表一個元素 $ x $ 的 $ \mathbb{F}{2^{255}−19} $ 作為 $ (x_0,x_1,x_2,x_3,x_4) $ 和 $ x =\sum{i=0}^{4} x_i 2^{51i} $ .
所以最後乘法應該接受每個肢體最多 54 位的輸入。
使用多項式形式可以有效地執行以欄位順序為模的計算。它允許簡化實現不同算術運算所需的程式碼,因此使用起來更舒適。多項式形式是表示整數模數的自然方式。
現在關於對密鑰進行的位操作,它們是為了將(隨機)32 個字節轉換為整數標量。
位操作用於將第一個字節的三個最低有效位和最後一個字節的最高有效位設置為零,將最後一個字節的第二個最高有效位設置為 1。這意味著結果整數的形式為 $ 2^{254} $ 加上八倍之間的值 $ 0 $ 和 $ 2^{251} - 1 $ (包括的)。
現在,至於為什麼要執行它們,清除低三位以防止小子組攻擊。現在關於 MSB,它被設置為 1 以避免時序洩漏。
關於
cmul
第一個和fmul
第二個乘法存在的原因,那是因為cmul
實際上是計算,對於一個整數 $ n $ 和一點 $ V $ 價值 $ Curve(nV)=x/z $ ,所以我們有 $ z\cdot Curve(nV) = x $ .因為我們不想要這個簡短形式的結果點的 x 座標 $ x/z $ ,我們需要將其轉換為實際的 x 座標值,因此
crecip
andfmul
呼叫。最後,是的,您應該能夠相互獨立地派生私鑰和公鑰,就像BIP32一樣。