Such曲線可能會這個樣子的:
如果在此曲線上任意一點P = (x,y)並將其加到曲線上另一點Q上,就會得到這個橢圓曲線上的點。可以在下面的圖中看到這一點的視覺化新增。
您也可以選擇曲線上的某個點P,並將其加上x倍——您仍然會得到位於橢圓曲線上的一個點。
P+P+…+P = xP = R.
在這種情況下,x只是一個任意的自然數。在橢圓曲線密碼學中,人們使用這樣一個事實,即僅透過已知點P和r來計算數字x在計算上是不可行的。這通常被描述為求解離散對數的問題。對於密碼學來說,在橢圓曲線上選擇一個合適的點P就會產生一個足夠高的隨機自然數x,這個數字被稱為私鑰。用選定的點P和私鑰計算曲線上的點R,然後將其定義為公鑰。所以公鑰和私鑰是緊密相連的!
使用這種方法,可以“簽名”任何想要的訊息。設M為任意訊息,pub為傳送方的公鑰,priv為傳送方的私鑰。然後根據M和priv兩個引數計算簽名: 簽名=簽名(M,priv)
在上式中,函式符號()生成簽名。任何接收到訊息M的人都可以驗證簽名——證明傳送方公鑰確實也持有私鑰: 驗證= Ver(簽名,M, pub)
接收方只需要簽名本身、訊息和傳送方的公鑰。這就是橢圓曲線密碼學的基本原理。現在讓我們來編寫一些程式碼!
編碼密碼學
在python中,上述方法可以使用fastecdsa庫實現。然而,有更多的庫編寫用於橢圓曲線密碼學。首先,您需要使用“pip安裝”命令在您的終端。
pip install fastecdsa
安裝完成後,我們可以開啟python IDE並開始編碼。
從fastecdsa匯入按鍵,曲線,ecdsa
priv_key, pub_key = keys.gen_keypair(curve.P256)
列印(priv_key)
首先,我們從fastecdsa庫匯入一些類。CLASS金鑰包含一個使用橢圓曲線數學生成金鑰對的函式。CLASS曲線包含許多不同的橢圓曲線,您可以從中選擇一個來生成鍵。CLASSecdsa稍後用於生成和驗證簽名。在第二行中,使用curve P256生成一對公鑰和一個私鑰。然後,我們列印私鑰和公鑰。私鑰的結果應該是這樣的:20053020608649230331723442089943129241597707800309205888496491961204729412316
你看,私鑰是一個相當大的數字,有很多數字!我們來看看公鑰是什麼樣子的:
X: 0 xf8781fc1967637b0fe3e43cbd750051672fad09d0fd8f18d2d49ed1f84ebb5c9
Y: 0 x26a617f3fc7b1c34bf00b21445201299f9730bc7838994751ead5ddff511c622
(在曲線<P256>上)可以看到,公鑰是曲線P256上點的x座標和y座標的組合。讓我們繼續生成和驗證一些訊息的簽名。只需在上面的程式碼中新增以下幾行:
message = ' I am a message '
(r, s) = ecdsa.sign(訊息,priv_key)
print((r,s))
我們將一些字串定義為訊息,然後使用匯入的CLASS ecdsato生成簽名(r,s)。在這之後,我們列印它,應該得到類似如下的東西:
(5051796304674036363589800321627720065390968951281733524730, 24429916353425477548863857007437472287804761347218109)
現在我們可以繼續驗證這個簽名了。同樣,只需新增以下幾行程式碼:
valid = ecdsa.verify((r,s),message,pub_key)
print(valid)
我們再次使用CLASS ecdsa並從該類呼叫verify()函式,它依賴於三個引數簽名、訊息和生成訊息的那個引數的公鑰。然後,我們列印有效的變數,如果一切正常,應該會得到如下輸出: True
祝賀您!您剛剛瞭解了在區塊鏈網路中使用的公鑰加密的基礎知識。您可以進一步建立您自己的加密貨幣。
更多數字貨幣資訊:www.qukuaiwang.com.cn/news