比特幣密鑰空間有缺陷嗎?
伙計們需要你的專家指導我正在研究比特幣密鑰空間,我發現了一個神秘的東西,即實際上是生成點的第一個公鑰與最後一個公鑰相同,第二個公鑰和第二個最後一個公鑰密鑰是相同的,如果我們將範圍分為兩部分,第一個範圍最後一個公鑰與第二個範圍第一個公鑰相同,我在這些相似密鑰中發現的唯一區別是“02”和“03”或“04”校驗和。我不明白為什麼公鑰有相似之處?
這是橢圓曲線的特性。這是意料之中的,不會對安全性產生有意義的影響。
橢圓曲線上的點具有 X 和 Y 座標。在 的情況下
secp256k1
,這些座標必須服從方程y 2 = x 3 + 7 (mod p),其中p = 2 256 - 2 32 - 977。每當*(x,y)在曲線上時,(x,-y)也在曲線上(因為y是平方的,所以它的符號被忽略)。現在,這是一個否定mod p*;真正不存在“標誌”的地方;它們都是0和p-1之間的數字。否定對應於用py替換**y,因為p是奇數,這意味著每個 X 座標都有一個對應的偶數 Y 和一個奇數 Y。要對公鑰進行編碼,無需發送完整的 Y 座標。它們只有兩個,一個是奇數,一個是偶數。因此,編碼只發送 33 個字節。第一個字節指示 Y 是偶數 (0x02) 還是奇數 (0x03),然後是編碼完整 X 座標的 32 個字節。
這兩個點*(x,y)和(x,-y)也是彼此的否定。細節可能太詳細了,無法在這裡詳述,但橢圓曲線有一個“零”點(也稱為無窮遠點),當添加到任何點時,它會給出自身,並添加(x,y)和(x ,-y)彼此給出無窮大。所以在某種程度上,在橢圓曲線點加法運算中,(x,y)和(x,-y)*是彼此的否定。
這意味著當你否定一個私鑰時,你實際上會以否定相應的公鑰結束。私鑰是數字,但是mod n,而不是像曲線點係數那樣的mod p 。**n在
secp256k1
的情況下是n = 2 256 - 432420386565659656852420866394968145599。總體而言,這意味著對應於a和na的公鑰確實將具有相同的 X 座標和取反的 Y 座標。這是安全問題嗎?不,因為這是眾所周知的橢圓曲線屬性,在分析它們的安全性時,會考慮到這一點。最著名的打破橢圓曲線安全性(解決 ECDLP)的算法利用了這個屬性,並從中獲得了大約√2倍的加速。然而,即使有了這樣的加速,破解公鑰安全所需的時間仍然是天文數字。它還用於其他目的:隨著 2021 年 11 月即將到來的 Taproot 啟動,BIP340“Schnorr”簽名將在網路上啟用。這些只儲存X 座標,並且只有 32 個字節。Y 座標隱含地是偶數。
secp256k1
事實上已經相關屬性太:與78074008874160198520644763525212887401909906723592317393988542598630163514318導致X乘以私鑰時協調與55594575648329892869085402983802832744385952214688224221778511981742606582254乘以(和Y座標保持相同)。該屬性相當特殊(稱為 GLV 內同態),可以顯著加快某些加密算法(包括 ECDSA 驗證),但也會導致√3的攻擊加速。同樣,即使考慮到這種加速,曲線的安全性也是非常安全的。