比特幣/以太坊的關鍵機制——secp256k1

比特幣使用基於橢圓曲線加密的橢圓曲線數字簽名算法(ECDSA)。特定的橢圓曲線稱爲secp256k1,即曲線

y² = x³ + 7

有限域 (又名伽羅瓦域),以簡短描述。
在這裏插入圖片描述
在平面中的橢圓曲線上的加法在幾何上根據線截取曲線的位置來定義。我們不會在這裏討論幾何,除了說它歸結爲一組涉及實數的方程。但我們並沒有在實數域上去工作,而是在有限域。

有限場模量

我們的想法是採用由平面中的幾何體激發的方程式,然後使用這些方程式來定義當您不在實數上但在不同的場上工作時的加法。在的情況下secp256k1,該字段是整數模的有限域p,其中

p = 2 256 - 2 32 - 977

這裏選擇p相對接近2 256。它不是小於2 256的最大素數; p和2 256之間有很多素數。其他因素也同樣影響着選擇p。請注意,我們不是在整數mod p本身工作,而是在一個阿貝爾中,其加法法則由整數mod p上的橢圓曲線定義 。

基點

接下來,我們 在橢圓曲線上選擇一個基點g。定義secp256k1 的 標準說 g是

0279BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798

以“壓縮形式”或

040x79BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798483ADA7726A3C4655DA4FBFC0E1108A8FD17B448A68554199C47D08FFB10D4B8

以“未壓縮的形式”。

基點是橢圓曲線上特別選擇的點,因此它是一 對數字mod p,而不是單個數字。如何從這些壓縮或未壓縮的表單中提取 x和 y?

壓縮形式

該 壓縮的 形式只給 x,你就應該解決 y。在 未壓縮的 形式爲您提供了 x 和 y。但是,這些數字是略微編碼的。在壓縮形式中,字符串以“o2”或“o3”開頭,字符串的其餘部分是 x 的十六進制表示 。將滿足 y 的兩個值

y² = x³ + 7 mod p

並且“o2”或“03”告訴您選擇哪一個。如果壓縮形式以02開頭,則選擇最低有效位爲偶數的根。如果壓縮形式從03開始,則選擇其最低有效位爲奇數的根。(兩個根將添加到 p,而 p是奇數,因此其中一個根將是偶數,一個將是奇數。)

未壓縮的形式

未壓縮的表單將始終以04開頭。在此之後,按照 x 和 y 連接在一起的十六進制表示形式 。

無論哪種情況,我們都有

x = 79BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798

y = 483ADA7726A3C4655DA4FBFC0E1108A8FD17B448A68554199C47D08FFB10D4B8

我們可以使用一些Python代碼驗證這一點:

    x = 0x79BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798
    y = 0x483ADA7726A3C4655DA4FBFC0E1108A8FD17B448A68554199C47D08FFB10D4B8
    p = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2F
    assert((y*y - x*x*x - 7) % p == 0)

橢圓曲線上的指數

從我們的基點 g 開始,將 kg 定義爲 g 加到其自身 k 次。再次注意,這裏的“加法”意義是橢圓曲線中的加法,而不是整數域 p 中的加法。橢圓曲線密碼學的關鍵是可以有效地計算 kg,但是不能從 kg 乘積開始求解 k。您可以使用快速求冪算法計算 kg,但求解 k 需要計算離散對數。(這是ECDLP:橢圓曲線離散對數問題。)

爲什麼這稱爲“取冪”而不是“乘法”?橢圓曲線上的算術是可交換的,並且在交換(即阿貝爾)組中,組操作通常表示爲加法。重複添加稱爲乘法。

但在一般羣論中,羣操作表示爲乘法,並且羣操作的重複應用稱爲取冪。使用通用術語“取冪”是常規的,即使在阿貝爾羣體上,將其稱爲乘法更有意義。

通過取對數來撤消取冪,因此求解 k 的過程稱爲離散對數問題。橢圓曲線密碼學的安全性取決於計算離散對數的難度。

計算安全性

爲一組尺寸的解決離散對數問題的最佳算法 n 目前需要 O(√n) 操作。在我們的案例中,n 有多大 ?

選擇基點 g 具有大的順序,實際上它的順序大約是2 256。具體來說, 用十六進制寫的 g 的順序是

n = FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141。

這意味着我們得到大約256/2 = 128位的安全性,因爲√(2 256)= 2 128。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章