使用 ecc 從私鑰生成公鑰,並明確描述 k=k*g
根據這個答案:https ://bitcoin.stackexchange.com/a/63996/100526 當他想從 中生成一個
public key
時private key
,他使用了K=k*G
. 但我無法理解它的結果。如果我們假設我們private key
是(根據答案):0F479245FB19A38A1954C5C7C0EBAB2F9BDFD96A17563EF28A6A4B1A2A764EF4
根據
Secp256k1
G
點是:- Compressed form (prefix 02) 02 79BE667E F9DCBBAC 55A06295 CE870B07 029BFCDB 2DCE28D9 59F2815B 16F81798 - Uncompressed form (prefix 04) 04 79BE667E F9DCBBAC 55A06295 CE870B07 029BFCDB 2DCE28D9 59F2815B 16F81798 483ADA77 26A3C465 5DA4FBFC 0E1108A8 FD17B448 A6855419 9C47D08F FB10D4B8
所以為了計算我使用這個網站的公鑰:https ://www.boxentriq.com/code-break/big-number-calculator
我用過
compressed form
和private key
:0279BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798
*0F479245FB19A38A1954C5C7C0EBAB2F9BDFD96A17563EF28A6A4B1A2A764EF4
結果是:
25d355ebb23e6ce0fd5463bf40e6da2ccc4e2e8ce654db6a8a8e5a275f0d2266005569112cfda60d14f9b6d0c0218cc072047a3b2fcf97aee95a437b4bb6cce0
但在那個答案中,結果是:
02E8445082A72F29B75CA48748A914DF60622A609CACFCE8ED0E35804560741D29
怎麼了?
It was my fault.
G
是橢圓曲線上的一個點。這意味著G
有一個數字 forX
和另一個 forY
。所以未壓縮的 G inSecp256k1
是G(x,y)
:- Uncompressed form (prefix 04) 04 79BE667E F9DCBBAC 55A06295 CE870B07 029BFCDB 2DCE28D9 59F2815B 16F81798 483ADA77 26A3C465 5DA4FBFC 0E1108A8 FD17B448 A6855419 9C47D08F FB10D4B8 X = 79BE667E F9DCBBAC 55A06295 CE870B07 029BFCDB 2DCE28D9 59F2815B 16F81798 Y = 483ADA77 26A3C465 5DA4FBFC 0E1108A8 FD17B448 A6855419 9C47D08F FB10D4B8
為了
04
證明這是一個未壓縮的G
.這一點是
Base point
或Generator point
它用於k=K*G.
*
不像是*
在數學裡似的2*2 = 4
。它是a sign
在曲線上顯示運算符之一。我們在一條曲線上有 3 個運算符:
-Addition -Negation -Doubling
加法是加兩點。根據我們有一個點like
P1(x1,x2)
,還有一個點likeQ1(x2,y2)
,所以不能用2+2 = 4
,需要另外計算,P+Q.
結果P+Q
是曲線上的另一個點,我們可以稱之為R
。
Doubling
是曲線上一個點的兩倍,結果也是曲線上的一個點。所以P+P=R.
當我們說
k*G
,我們要multiple
我們private key
的a point on the curve
。我們需要做這些: 將我們的轉換
private key
為binary base
.對於所有位,我們開始檢查:對於每個位,我們做一些
doublePoint
和addPoints
。這是一個預定義的角色,我們必須遵循它。但是我們如何計算
addition
兩個點的 a 呢?λ = ( yq – yp ) / ( xq – xp) xR = λ2 – xp – xq yR = λ(xp – xR) – yP
有了這個。首先我們需要計算
λ
,它是我們的slope
。然後我們可以計算新點的 x 和 y。結果是我們的
p+q = R
那麼
doubling
呢?:λ = (3x2) +a / (2y) xR = λ2 - 2x yR = λ(x - xR) – y
有了這些,現在我們可以計算
K=k * G
.還有許多其他的計算技巧
Public key
。Private key
這是一個很好的實現
PHP
: https ://github.com/BitcoinPHP/BitcoinECDSA.php/blob/master/src/BitcoinPHP/BitcoinECDSA/BitcoinECDSA.php#L350
當使用曲線談論數學時,當我們使用加法和乘法等術語時,我們並不是指正常的加法和乘法。我們指的是曲線上具有類似於加法和乘法的性質的操作。為了得到正確的結果,你必須使用曲線上的實際操作,而不是正常的加法和乘法。