Encryption

關於在 secp256k1 上使用內同態和否定結果的問題

  • April 8, 2019

我已閱讀“橢圓曲線密碼學指南”中的第 3.5 節(算法 3.7),並一直在嘗試在 secpt256k1 上實現自同態以加快計算速度 $ kP $ 通過將其更改為在 k 的半長位寬上的 2 點乘法運算,並帶有最後一個點加法。我首先嘗試在 Python 中實現這一點,以確保我的方程式是正確的。

我可以按照算法 3.7 來計算 $ k_1 $ 和 $ k_2 $ ,但是對於 k 輸入的某些值,我會得到一個負數 $ k_2 $ .

這是否意味著當我評估 $ kP = k_1P + k_2φ(P) $ , 在哪裡 $ φ(P) : (x, y) →(βx, y) $ ,我必須要麼轉換 $ k_2 $ 做事積極 $ k_2’ = n - k_2 $ 在哪裡 $ n $ 是曲線順序(這不像現在 $ k_2 $ 將是相同的位大小 $ k $ ), 還是我計算 $ k_2φ(P) $ 然後在將其添加到之前找到該點的倒數(只是否定 Y 座標) $ k_1P $ ?

這是我寫的程式碼(我也不確定所有這些操作是否應該是 mod n)。

我最後檢查一下這些值是否與教科書中的值相匹配( $ k = k_1 +k_2λ $ 模數)。

但是我也有不管的問題 $ k_2 $ 是負數(所以我會做最後的反轉),我計算的結果是 $ kP $ 當我不使用自同態時,結果與結果不匹配(我使用雙加算法進行兩點乘法,而不是點或 NAF,如果這有區別的話)。我想知道是否有人知道為什麼?

def decompose_mult(k):
       curve_n = 115792089237316195423570985008687907852837564279074904382605163141518161494337
       lam = 37718080363155996902926221483475020450927657555482586988616620542887997980018
       beta = 55594575648329892869085402983802832744385952214688224221778511981742606582254
       a1 = 64502973549206556628585045361533709077
       a2 = 367917413016453100223835821029139468248
       b2 = 64502973549206556628585045361533709077
       b1_neg = 303414439467246543595250775667605759171

       c1 = (b2*k) // curve_n
       c2 = (b1_neg*k) // curve_n

       c1_a1 = (c1*a1) % curve_n
       c2_a2 = (c2*a2) % curve_n

       c1_b1 = (c1*b1_neg) % curve_n
       c2_b2 = (c2*b2) % curve_n

       k1 = (k - (c1_a1) - (c2_a2)) 
       k2 = c1_b1 - c2_b2

       print ("k1 ", k1, " bits ", k1.bit_length())
       print ("k2 ", k2, " bits ", k2.bit_length())

       k_test = (k1 + k2*lam) % curve_n
       if (k_test == k):
               print("Values matched")
       else:
               print("Values MISMATCHED")
               print ("k_test ", k_test)
               print ("k ", k)

您是指第 3.77頁的算法嗎?129 ?

該算法有一個明確的案例是否 $ k_{j,i} > 0 $ 與否,在步驟 8.2 的循環中。顯然,如果天真地採用這樣的條件,對於快速恆定時間算術來說是個壞消息。但正如您所指出的,您可以簡單地在座標欄位中進行條件減法來否定該點,然後無條件地進行點加法。

引用自:https://crypto.stackexchange.com/questions/68629