如何在保持預設Secp256k1參數的情況下將橢圓曲線的欄位更改為新值N?
我想將橢圓曲線的邊距更改為新的 N 值,同時我想保留參數 Standard G-point Generator Secp256k1 即我想替換:
N = 115792089237316195423570985008687907852837564279074904382605163141518161494337
到新值:
N = 115792089237316195423570985008687907853269978629958289035461602417822422574827
留下 Secp256k1 參數:
Gx = 55066263022277343669578718895168534326250603453777594175500187360389116729240 Gy = 32670510020758816978083085130507043184471273380659243275938904335757337482424 P = 115792089237316195423570985008687907853269984665640564039457584007908834671663
對於計算,我使用 Python 腳本:但最後我得到與標準 Secp256k1 參數相同的結果
也就是說,使用Private key 2,我得到
Public Key: 04C6047F9441ED7D6D3045406E95C07CD85C778E4B8CEF3CA7ABAC09B95C709EE51AE168FEA63DC339A3C58419466CEAEEF7F632653266D0E1236431A950CFE52A Public Key (compressed): 02C6047F9441ED7D6D3045406E95C07CD85C778E4B8CEF3CA7ABAC09B95C709EE5
結果與現場相同
N = 115792089237316195423570985008687907852837564279074904382605163141518161494337
因為我設置了一個新欄位,我到底做錯了什麼?
N = 115792089237316195423570985008687907853269978629958289035461602417822422574827
需要更改哪些內容以使公鑰與標準 Secp256k1 參數不同?
程式碼 :
Pcurve = 2**256 - 2**32 - 2**9 - 2**8 - 2**7 - 2**6 - 2**4 -1 # The proven prime Acurve = 0; Bcurve = 7 # These two defines the elliptic curve. y^2 = x^3 + Acurve * x + Bcurve Gx = 55066263022277343669578718895168534326250603453777594175500187360389116729240 Gy = 32670510020758816978083085130507043184471273380659243275938904335757337482424 GPoint = (Gx,Gy) # Generator Point N = 115792089237316195423570985008687907853269978629958289035461602417822422574827 privKey = 2 def modinv(a,b=Pcurve): #Extended Euclidean Algorithm/'division' in elliptic curves lm, hm = 1,0 low, high = a%b,b while low > 1: ratio = high/low nm, new = hm-lm*ratio, high-low*ratio lm, low, hm, high = nm, new, lm, low return lm % b def ECAdd(a,b): # Point addition, invented for EC. LambdaAdd = ((b[1] - a[1]) * modinv(b[0] - a[0],Pcurve)) % Pcurve x = (LambdaAdd * LambdaAdd - a[0] - b[0]) % Pcurve y = (LambdaAdd * (a[0] - x) - a[1]) % Pcurve return (x,y) def ECDouble(a): # Point Doubling, also invented for EC. LamdaDouble = ((3 * a[0] * a[0] + Acurve) * modinv((2 * a[1]), Pcurve)) % Pcurve x = (LamdaDouble * LamdaDouble - 2 * a[0]) % Pcurve y = (LamdaDouble * (a[0] - x) - a[1]) % Pcurve return (x,y) def ECMultiply(GenPoint,privKeyHex): #Double & add. Not true multiplication if privKeyHex == 0 or privKeyHex >= N: raise Exception("Invalid Private Key") privKeyBin = str(bin(privKeyHex))[2:] Q=GenPoint for i in range (1, len(privKeyBin)): Q=ECDouble(Q); if privKeyBin[i] == "1": Q=ECAdd(Q,GenPoint); return (Q) publicKey = ECMultiply(GPoint,privKey) print "Private Key:"; print privKey; print print "Public Key (uncompressed):"; print publicKey; print print "Public Key (compressed):"; if publicKey[1] % 2 == 1: # If the Y coordinate of the Public Key is odd. print "03"+str(hex(publicKey[0])[2:-1]).zfill(64) else: # If the Y coordinate is even. print "02"+str(hex(publicKey[0])[2:-1]).zfill(64)
我想將橢圓曲線的邊距更改為新的 N 值,同時我想保留參數 Standard G-point Generator Secp256k1
你所說的“保證金”是什麼意思?
你所要求的是一個矛盾。生成器階數 N 是曲線及其生成器的屬性。這不是可以獨立選擇的東西。
這是對“在將生成器添加到自身多少次後,我最終會得到無窮大點”這個問題的答案。它完全由曲線方程(secp256k1 的 Y^2=X^3+7)和生成器(必須在該曲線上)確定。N 使用 Schoof 算法計算。
如果您希望 N 不同,則需要選擇不同的生成器。在 secp256k1 的情況下,曲線階數為素數,每個點的階數相同,因此其他選擇將無濟於事(除了無窮遠處的點,其定義為階數為 1)。
所以,如果你想要一個生成器階數是你想要的 N 值的系統,你也需要一條不同的曲線。找到一條允許具有特定順序的生成器的曲線是一個非常重要的問題。我不知道這樣做的任何通用方式。
到新值:N = 115792089237316195423570985008687907853269978629958289035461602417822422574827
這個數字是從哪裡來的?它是否有一些特殊屬性讓您相信應該存在具有該順序的曲線?
對於計算,我使用 Python 腳本:但最後我得到與標準 Secp256k1 參數相同的結果
這是完全可以預料的,因為您沒有在計算中使用 N(也不能)。你只是在計算生成器+生成器。
橢圓曲線為 secp256k1: y 2 = x 3 + 7 (mod p)
欄位大小在哪裡
p = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2F
.secp256k1的曲線順序為:
n = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141
公鑰 P (point) 是通過將私鑰 d (scalar) 乘以生成器點 G (point) 來計算的,其中
P = d (mod n).G
您所說的 n (N) 不是欄位大小 p,它是曲線順序
n = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141
該曲線階數 n 使得 nG =無窮遠點。這是曲線的屬性,不能更改。
感謝 Pieter Wuille 的更正。