Private-Key

如何在保持預設Secp256k1參數的情況下將橢圓曲線的欄位更改為新值N?

  • October 9, 2020

我想將橢圓曲線的邊距更改為新的 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 的更正。

引用自:https://bitcoin.stackexchange.com/questions/99411