Secp256k1

secp256k1_ecmult_gen 和 secp256k1_ecmult 有什麼區別?

  • February 26, 2021

libsecp256k1 有兩個實現,secp256k1_ecmultinecmult.hsecp256k1_ecmult_genin ecmult_gen.h,用於乘以橢圓曲線的點。

secp256k1_ecmult_gen支持簡單的乘法,例如a*Gsecp256k1_ecmult支持涉及加法的乘法,例如a*P + bG. 但是,secp256k1_ecmult可以通過設置 來進行簡單的乘法運算b=0,實際上,它在 中就是這樣使用的eckey_impl.h#secp256k1_eckey_pubkey_tweak_mul

這兩個功能應該如何正確使用?性能有什麼區別嗎?

這兩個功能應該如何正確使用?

一個簡單的答案是“根本沒有”。這些函式沒有在 libsecp256k1 的公共 API 中公開,這就是它們沒有面向使用者的文件的原因。相反,它們被用作內部子程序,主要用於 ECDSA 和 Schnorr 簽名的實現。

請注意,密碼學應由專家實施。如果你不知道自己在做什麼(事實上,即使你知道自己在做什麼),很容易讓自己在腳下開槍。

話雖如此,這裡有一個高級概述:

  • secp256k1_ecmult_gen獲取一個標量作為輸入並使用標準生成器a計算乘法。該函式在標量中是恆定時間的,即,它確保計算的時間不會洩漏有關 的資訊。這就是為什麼當標量是秘密時使用它的原因,例如,在從秘密密鑰計算公鑰時生成密鑰,或者在從秘密標量計算隨機數時進行簽名。通常,對恆定時間實現的要求會使程式碼變慢(例如,您不能提前返回)。aG``G``a``a``xG``x``rG``r
  • secp256k1_ecmult獲取兩個標量和一個點作為輸入ab然後P計算aP + bG. 此函式不能確保恆定時間計算。這種計算正是簽名驗證所必需的,並且該函式是合適的,因為驗證中不涉及秘密值。
  • 還有secp256k1_ecmult_const。它以標量a和點作為輸入P,並aP以恆定時間計算。(所以就功能和安全性而言,它是一種更通用的變體secp256k1_ecmult_gen,適用於任意點P。因此它的效率較低,因為它不能依賴一些需要預先知道的預計算技術P。)這被用作ECDH(Diffie-Hellman)模組,用於計算密鑰交換中的共享秘密。

引用自:https://bitcoin.stackexchange.com/questions/103060