Secp256k1
secp256k1_ecmult_gen 和 secp256k1_ecmult 有什麼區別?
libsecp256k1 有兩個實現,
secp256k1_ecmult
inecmult.h
和secp256k1_ecmult_gen
inecmult_gen.h
,用於乘以橢圓曲線的點。
secp256k1_ecmult_gen
支持簡單的乘法,例如a*G
並secp256k1_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
獲取兩個標量和一個點作為輸入a
,b
然後P
計算aP + bG
. 此函式不能確保恆定時間計算。這種計算正是簽名驗證所必需的,並且該函式是合適的,因為驗證中不涉及秘密值。- 還有
secp256k1_ecmult_const
。它以標量a
和點作為輸入P
,並aP
以恆定時間計算。(所以就功能和安全性而言,它是一種更通用的變體secp256k1_ecmult_gen
,適用於任意點P
。因此它的效率較低,因為它不能依賴一些需要預先知道的預計算技術P
。)這被用作ECDH(Diffie-Hellman)模組,用於計算密鑰交換中的共享秘密。