生成比特幣公鑰和私鑰
我設法編寫了以下程式碼,它將創建公鑰和私鑰
私鑰
$input = "satoshinakamoto"; $sha256 = hash("sha256", ($input)); echo "<strong>Private Key: </strong>".$sha256."<br/>";
公鑰
$step1 = hexStringToByteString("0450863AD64A87AE8A2FE83C1AF1A8403CB53F53E486D8511DAD8A04887E5B23522CD470243453A299FA9E77237716103ABC11A1DF38855ED6F2EE187E9C582BA6"); echo "<p><strong>Step 1:</strong> ".$step1."</p>"; $step2 = hash("sha256", $step1); echo "<p><strong>Step 2: </strong>".$step2."</p>"; $step3 = hash('ripemd160', hexStringToByteString($step2)); echo "<p><strong>Step 3: </strong>".$step3."</p>"; $step4 = '00'.$step3; echo "<p><strong>Step 4: </strong>".$step4."</p>"; $step5 = hash("sha256", hexStringToByteString($step4)); echo "<p><strong>Step 5: </strong>".$step5."</p>"; $step6 = hash("sha256",hexStringToByteString($step5)); echo "<p><strong>Step 6: </strong>".$step6."</p>"; $step7 = substr($step6,0,8); echo "<p><strong>Step 7: </strong>".$step7."</p>"; $step8 = $step4.$step7; echo "<p><strong>Step 8: </strong>".$step8."</p>"; $step9 = bc_hexdec($step8); echo "<p><strong>Step 9: </strong>".$step9."</p>"; $step10 = bc_base58_encode($step9); echo "<p><strong>Step 10: </strong>1".$step10."</p>"; return $step10;
為了生成公鑰,我參考了<https://en.bitcoin.it/wiki/Technical_background_of_version_1_Bitcoin_addresses>
在那個連結中,他們提供了一步一步的過程,我也遵循了相同的過程,如果我
Step 1 in the link
從那時開始輸入,我可以將程式碼轉換為公鑰,但我不知道如何轉換Step 0 to Step 1
IE
從:
18E14A7B6A307F426A94F8114701E7C8E774E7F9A47E2C2035DB29A206321725
到
0450863AD64A87AE8A2FE83C1AF1A8403CB53F53E486D8511DAD8A04887E5B23522CD470243453A299FA9E77237716103ABC11A1DF38855ED6F2EE187E9C582BA6
文件說
取用它生成的對應公鑰(65字節,1字節0x04,32字節對應X座標,32字節對應Y座標)
那是什麼意思?如何從私鑰生成此值。
編輯 1
這個問題說<https://stackoverflow.com/questions/17672696/generating-bitcoin-address-from-ecdsa-public-key>
加入了
Elliptic Public Key
,我仍然不明白他們是什麼。
比特幣使用橢圓曲線secp256k1上的點乘法從私鑰生成公鑰。基本上,這條曲線有一個定義的生成點 G,以及一種將兩個點“相加”在一起以獲得新點的方法(EC 點加法)。
您的私鑰只是一個數字,也就是一個標量,因此要獲得您的公鑰,您只需將生成器點添加到自身私鑰的次數 - 基本上是橢圓曲線上的標量乘法。最後,你會在曲線上得到一個點,有一個 X 和 Y 座標,這個點就是你的公鑰。您點的這兩個座標是您引用的文件所引用的,每個座標使用 32 個字節加上前綴。
使用的 0x04 前綴表示這是一個未壓縮的私鑰這一事實。您還可以通過僅使用帶有 0x02 或 0x03 前綴的 X 座標來形成壓縮版本,因為橢圓曲線對於每個 X 座標只有 2 個 Y 座標值(一個正值和一個負值),因此恢復如果您知道 X 座標和符號,則 Y 座標(基於您選擇的前綴)。
your priv = 18E14A7B6A307F426A94F8114701E7C8E774E7F9A47E2C2035DB29A206321725 X = priv x 79BE667E F9DCBBAC 55A06295 CE870B07 029BFCDB 2DCE28D9 59F2815B 16F81798 Y = priv x 483ADA77 26A3C465 5DA4FBFC 0E1108A8 FD17B448 A6855419 9C47D08F FB10D4B8
<https://en.bitcoin.it/wiki/Secp256k1>