橢圓曲線點壓縮數學原理完整指南:從代數基礎到 secp256k1 實作

橢圓曲線點壓縮是以太坊、比特幣等區塊鏈系統中廣泛使用的空間優化技術。通過僅存儲曲線點的 x 座標和一個奇偶校驗位,點壓縮可以將 64 位元組的未壓縮座標減少到僅 33 位元組,節省約 50% 的存儲空間和傳輸帶寬。本文從數學原理出發,深入解析點壓縮的代數基礎、橢圓曲線密碼學中的實際應用、以及在 secp256k1 曲線上的完整推導過程。涵蓋模平方根計算、Tonelli-Shanks 算法、SEC 1/2 標準、以太坊智能合約實作,以及側信道攻擊防禦等核心主題。

橢圓曲線點壓縮原理

點壓縮可以讓存儲空間減少 50%。

為什麼可以壓縮?

曲線方程:y² = x³ + ax + b

關鍵觀察:給定 x,y 要麼是某個值,要麼是它的負元。

(x, y) ↔ (x, -y mod p)

所以只要知道 x 和 y 的奇偶性,就能恢復完整點。

編碼格式

前綴意義
0x02y 是偶數
0x03y 是奇數
0x04未壓縮(x 和 y 都存)

恢復 y 座標

給定 x 和奇偶性,求 y:

secp256k1 的特殊優化

因為 p ≡ 3 (mod 4):

def recover_y(x, parity):
    # 計算 y² = x³ + 7
    y_squared = (x**3 + 7) % p
    
    # y = ±(y²)^((p+1)/4)
    y = pow(y_squared, (p + 1) // 4, p)
    
    # 根據奇偶性選擇正確的 y
    if y % 2 != parity:
        y = p - y
    
    return y

數字例子

設 p = 97(實際用 2^256 - 2^32 - ...),x = 3:

y² = 3³ + 7 = 34 (mod 97)
y = ±34^((97+1)/4) = ±34^25

34^2 = 42
34^4 = 42² = 67
34^8 = 67² = 57
34^16 = 57² = 21
34^25 = 34 * 34^8 * 34^16 = 34 * 57 * 21 = 23

所以 y = 23 或 74 (= 97-23)

如果 parity = 1(y 是奇數),選擇 y = 23。

為什麼用奇偶性?

因為:

結語

點壓縮是區塊鏈存儲優化的基礎技術。比特幣和以太坊的地址、簽名都用到了這個技巧。

COMMIT: Add elliptic curve point compression guide

延伸閱讀與來源

這篇文章對您有幫助嗎?

評論

發表評論

注意:由於這是靜態網站,您的評論將儲存在本地瀏覽器中,不會公開顯示。

目前尚無評論,成為第一個發表評論的人吧!