如何理解加密貨幣和區(qū)塊鏈的密碼學(xué)
簡(jiǎn)介
由于大多數(shù)人自己可能有一些加密貨幣資產(chǎn),因此您可能聽(tīng)說(shuō)過(guò)“公鑰”和“私鑰”這兩個(gè)詞。在區(qū)塊鏈網(wǎng)絡(luò)中,公鑰相當(dāng)于你的地址。如果網(wǎng)絡(luò)中的其他人想給您發(fā)送一些資金,他或她會(huì)將其發(fā)送到您的公鑰。您的私鑰可以被視為您的簽名——無(wú)論何時(shí)您想進(jìn)行資金交易,您都需要證明您擁有屬于您的公鑰的私鑰,而無(wú)需向網(wǎng)絡(luò)中的任何人展示它。網(wǎng)絡(luò)的參與者檢查您的事務(wù),可以證明您使用您的公鑰是私鑰的所有者,甚至不知道私鑰是什么。很酷!但這在更基本的層面上是如何起作用的呢?我們來(lái)深入研究一下這個(gè)理論。
橢圓曲線(xiàn)密碼學(xué)
在這一部分中,我將簡(jiǎn)要介紹使用的加密系統(tǒng)背后的魔力。因?yàn)樗澈蟮臄?shù)學(xué)是相當(dāng)復(fù)雜的,沒(méi)有必要理解它的每一個(gè)方面。該密碼系統(tǒng)主要應(yīng)用于區(qū)塊鏈網(wǎng)絡(luò),它基于橢圓曲線(xiàn)的數(shù)學(xué)原理。但這條橢圓曲線(xiàn)到底是什么呢?用數(shù)學(xué)術(shù)語(yǔ)表示,它是滿(mǎn)足方程的所有點(diǎn)(x,y)的集合
y2= x3+ ax + b
Such曲線(xiàn)可能會(huì)這個(gè)樣子的:
如果在此曲線(xiàn)上任意一點(diǎn)P = (x,y)并將其加到曲線(xiàn)上另一點(diǎn)Q上,就會(huì)得到這個(gè)橢圓曲線(xiàn)上的點(diǎn)。可以在下面的圖中看到這一點(diǎn)的可視化添加。
您也可以選擇曲線(xiàn)上的某個(gè)點(diǎn)P,并將其加上x(chóng)倍——您仍然會(huì)得到位于橢圓曲線(xiàn)上的一個(gè)點(diǎn)。
P+P+…+P = xP = R.
在這種情況下,x只是一個(gè)任意的自然數(shù)。在橢圓曲線(xiàn)密碼學(xué)中,人們使用這樣一個(gè)事實(shí),即僅通過(guò)已知點(diǎn)P和r來(lái)計(jì)算數(shù)字x在計(jì)算上是不可行的。這通常被描述為求解離散對(duì)數(shù)的問(wèn)題。對(duì)于密碼學(xué)來(lái)說(shuō),在橢圓曲線(xiàn)上選擇一個(gè)合適的點(diǎn)P就會(huì)產(chǎn)生一個(gè)足夠高的隨機(jī)自然數(shù)x,這個(gè)數(shù)字被稱(chēng)為私鑰。用選定的點(diǎn)P和私鑰計(jì)算曲線(xiàn)上的點(diǎn)R,然后將其定義為公鑰。所以公鑰和私鑰是緊密相連的!
使用這種方法,可以“簽名”任何想要的消息。設(shè)M為任意消息,pub為發(fā)送方的公鑰,priv為發(fā)送方的私鑰。然后根據(jù)M和priv兩個(gè)參數(shù)計(jì)算簽名: 簽名=簽名(M,priv)
在上式中,函數(shù)符號(hào)()生成簽名。任何接收到消息M的人都可以驗(yàn)證簽名——證明發(fā)送方公鑰確實(shí)也持有私鑰: 驗(yàn)證= Ver(簽名,M, pub)
接收方只需要簽名本身、消息和發(fā)送方的公鑰。這就是橢圓曲線(xiàn)密碼學(xué)的基本原理。現(xiàn)在讓我們來(lái)編寫(xiě)一些代碼!
編碼密碼學(xué)
在python中,上述方法可以使用fastecdsa庫(kù)實(shí)現(xiàn)。然而,有更多的庫(kù)編寫(xiě)用于橢圓曲線(xiàn)密碼學(xué)。首先,您需要使用“pip安裝”命令在您的終端。
pip install fastecdsa
安裝完成后,我們可以打開(kāi)python IDE并開(kāi)始編碼。
從fastecdsa導(dǎo)入按鍵,曲線(xiàn),ecdsa
priv_key, pub_key = keys.gen_keypair(curve.P256)
打?。╬riv_key)
首先,我們從fastecdsa庫(kù)導(dǎo)入一些類(lèi)。CLASS密鑰包含一個(gè)使用橢圓曲線(xiàn)數(shù)學(xué)生成密鑰對(duì)的函數(shù)。CLASS曲線(xiàn)包含許多不同的橢圓曲線(xiàn),您可以從中選擇一個(gè)來(lái)生成鍵。CLASSecdsa稍后用于生成和驗(yàn)證簽名。在第二行中,使用curve P256生成一對(duì)公鑰和一個(gè)私鑰。然后,我們打印私鑰和公鑰。私鑰的結(jié)果應(yīng)該是這樣的:20053020608649230331723442089943129241597707800309205888496491961204729412316
你看,私鑰是一個(gè)相當(dāng)大的數(shù)字,有很多數(shù)字!我們來(lái)看看公鑰是什么樣子的:
X: 0 xf8781fc1967637b0fe3e43cbd750051672fad09d0fd8f18d2d49ed1f84ebb5c9
Y: 0 x26a617f3fc7b1c34bf00b21445201299f9730bc7838994751ead5ddff511c622
(在曲線(xiàn)《P256》上)可以看到,公鑰是曲線(xiàn)P256上點(diǎn)的x坐標(biāo)和y坐標(biāo)的組合。讓我們繼續(xù)生成和驗(yàn)證一些消息的簽名。只需在上面的代碼中添加以下幾行:
message = ‘ I am a message ’
(r, s) = ecdsa.sign(消息,priv_key)
print((r,s))
我們將一些字符串定義為消息,然后使用導(dǎo)入的CLASS ecdsato生成簽名(r,s)。在這之后,我們打印它,應(yīng)該得到類(lèi)似如下的東西:
(5051796304674036363589800321627720065390968951281733524730, 24429916353425477548863857007437472287804761347218109)
現(xiàn)在我們可以繼續(xù)驗(yàn)證這個(gè)簽名了。同樣,只需添加以下幾行代碼:
valid = ecdsa.verify((r,s),message,pub_key)
print(valid)
我們?cè)俅问褂肅LASS ecdsa并從該類(lèi)調(diào)用verify()函數(shù),它依賴(lài)于三個(gè)參數(shù)簽名、消息和生成消息的那個(gè)參數(shù)的公鑰。然后,我們打印有效的變量,如果一切正常,應(yīng)該會(huì)得到如下輸出: True
祝賀您!您剛剛了解了在區(qū)塊鏈網(wǎng)絡(luò)中使用的公鑰加密的基礎(chǔ)知識(shí)。您可以進(jìn)一步創(chuàng)建您自己的加密貨幣。