溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

如何進(jìn)行Electrum比特幣錢包的Python代碼分析

發(fā)布時間:2021-12-04 16:43:51 來源:億速云 閱讀:201 作者:柒染 欄目:互聯(lián)網(wǎng)科技

如何進(jìn)行Electrum比特幣錢包的Python代碼分析,很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細(xì)講解,有這方面需求的人可以來學(xué)習(xí)下,希望你能有所收獲。

如果你仍然未對Python語言的強(qiáng)大功能感到驚訝,那么在這部分我們將學(xué)習(xí)如何在python中開發(fā)比特幣地址或錢包。我只是想說與你的計算機(jī)通信是多么容易,如果你通過python和Linux操作系統(tǒng),可以用它做多少有趣的項目。

我將分析Electrum的源代碼,這是純粹用Python編寫的比特幣錢包,它應(yīng)該適用于任何python 2.x,我相信即使使用python 3.x包,默認(rèn)情況下,所有依賴項該軟件使用的是默認(rèn)包。因此,不需要額外的軟件。

免責(zé)聲明:使用此代碼和信息需要你自擔(dān)風(fēng)險,對于因使用修改后的代碼而導(dǎo)致的任何損害,以及本文中提供的信息,我概不負(fù)責(zé)。如果你不知道自己在做什么,建議不要修改生成私鑰的代碼!

了解代碼

我從Github下載了最新版本的Electrum源代碼:

https://github.com/spesmilo/electrum/releases/tag/2.8.3

種子生成器文件基本上位于lib中,它名為mnemonic.py,函數(shù)是make_seed(),它是這段代碼:

如何進(jìn)行Electrum比特幣錢包的Python代碼分析

你也可以通過內(nèi)部命令從終端實際調(diào)用。所以,如果你安裝了Electrum,那么它是這樣的:

electrum make_seed --nbits 125

安裝Electrum后,將為你創(chuàng)建125位種子,但你也可以通過另一個python文件調(diào)用該助記符腳本,并自定義它(例如生成多個,或?qū)⑵渑c其他代碼集成)。

我們將創(chuàng)建一個名為testcall.py的新文件,我們將在其中調(diào)用此助記符代碼,但它必須位于同一個lib文件夾中。它看起來像這樣:

如何進(jìn)行Electrum比特幣錢包的Python代碼分析

如果我們使用python testcall.py命令從終端調(diào)用它:

如何進(jìn)行Electrum比特幣錢包的Python代碼分析

基本上我們從mnemonic.py文件中導(dǎo)入Mnemonic類,只是將其稱為助記符。我還沒有談過類,它們位于Python語言的更高級部分,基本上它們是將函數(shù)綁定在一起的對象。這里的make_seed()函數(shù)包含在Mnemonic類中,并通過它與其他依賴于其他函數(shù)的函數(shù)一起調(diào)用。它只需要1個函數(shù)就可以完成,但是像這樣使用它更優(yōu)雅,更不容易出錯,因為它可以處理異常。我不是一個很好的Classes專家,所以我就這樣吧。

Mnemonic類中,可以定義1個參數(shù),即語言,它具有以下值:

  • None =英語

  • en =英語

  • es =西班牙語

  • zh =中文

  • ja =日語

  • pt =葡萄牙語

你可以在i18n.py文件中看到國家/地區(qū)代碼,但只有這些代碼列表現(xiàn)在可用,在wordlist文件夾中可見。如果你創(chuàng)建中文種子,只需用國家代碼替換該參數(shù):

print Mnemonic('zh').make_seed('standard', 132, 1)

你還可以生成多種類型的種子,你可以在version.py文件中看到:

  • standard:普通錢包。

  • segwit:支持即將推出的基于Segregated Witness softfork的比特幣地址。

  • 2fa:基于雙因素身份驗證的錢包。

  • 下一個參數(shù)是num_bits變量,它使用nbits命令從命令行調(diào)用,基本上只是你的種子將擁有的位數(shù)熵(建議安全性最小值為128)

  • 最后一個參數(shù)是custom_entropy,基本上只是一個整數(shù),可以使用該整數(shù)乘以種子數(shù),以防你的RNG不好,這將用你自定義生成的數(shù)字替換密碼的一部分,具有相同的熵大小。

因此,如果我這樣稱呼它,我選擇了一個自定義熵數(shù),這將以這種方式生成種子,當(dāng)然熵數(shù)也必須是一個秘密:

print Mnemonic('en').make_seed('standard', 132, 2349823353453453459428932342349489238)

我真的不建議使用這個代碼,它看起來有點奇怪,我不是加密專家,但我只是不喜歡這如何將熵插入你的數(shù)字。我聽說乘數(shù)會減少熵,所以我不確定代碼的這一部分。事實上,我將向開發(fā)者發(fā)送關(guān)于此問題的信息,看看他對此有何回應(yīng)。但是不用擔(dān)心,默認(rèn)錢包生成不會調(diào)用自定義熵部分,因此如果你通過GUI在Electrum中生成錢包,或者將其保留設(shè)置為1,那么無需擔(dān)心。

分析種子生成器

好了,現(xiàn)在我們知道如何生成種子,讓我們看看種子生成器究竟做了什么。畢竟使用Electrum的所有人都必須依賴此代碼的安全性和完整性,否則如果這些代碼被寫得很糟糕,你可能會損失所有的錢。因此,如果我們想在Electrum中存儲大量比特幣,我們必須100%信任此代碼。那么讓我們分析吧。

那么讓我們分析一下make_seed()函數(shù),這就是動作的位置,首先我會在其中放入許多打印代碼,以便在每一步打印出每個變量:

如何進(jìn)行Electrum比特幣錢包的Python代碼分析

基本上我只是在每一步打印出每個變量。好的,我們使用python testcall.py命令從testcall.py文件中調(diào)用make_seed()函數(shù)。testcall文件是這樣的:

print Mnemonic('en').make_seed('standard', 132, 1)

只是一個標(biāo)準(zhǔn)的種子生成,它打印出來:

如何進(jìn)行Electrum比特幣錢包的Python代碼分析

好吧,讓我們一步一步來。

  • 首先導(dǎo)入version.py,其中文件的代碼是,它基本上將該standard參數(shù)轉(zhuǎn)換為01,后者將成為種子的前綴。所以它將前綴設(shè)置為01字符串。

  • 然后bwp(每個字的位數(shù))變量取字列表長度的log2值,我的意思是那里有多少個單詞,在這種情況下是英文列表:english.txt。英語列表中有2048個單詞,其中l(wèi)og2為11。

  • 然后將num_bits除以bwp并向上舍入,轉(zhuǎn)換為整數(shù)并再次乘以bwp。我不知道為什么這是必要的,因為它給出了相同的值,我想這只是某種預(yù)防措施。

  • 如果我們將custom_entropy保留為默認(rèn)值1,則n_custom將變?yōu)?,因此不會添加額外的熵。

  • n如果沒有添加自定義熵,它仍然與num_bits輸入相同。

  • 所以基本上如果你生成一個沒有額外熵的默認(rèn)錢包,那么n變量就會成為主數(shù),其中包含你最初通過num_bits定義的熵量。因此,在我們的情況下它保持等價,因為我們不添加任何東西。

  • 然后my_entropy將只選擇0到2的n次方之間的隨機(jī)數(shù),其中n是同名的n,所以它將是一個很大的數(shù)字,這是種子的原型。

  • 然后我們進(jìn)入while循環(huán)來搜索以01開頭的隨機(jī)數(shù),它將作為種子的校驗和。

  • 如果自定義熵為0,那么基本上我們只需將my_entropy數(shù)加1,直到前2位變?yōu)?code>0和1.實際上它的前2位是hash格式。所以發(fā)生的是它用mnemonic_encode(i)對其進(jìn)行編碼,并在用mnemonic_decode(seed)對其進(jìn)行解碼之后,我猜測是否可以用單詞編碼,否則會產(chǎn)生一些錯誤。這就是assert命令所做的,它會測試錯誤。

  • 然后它進(jìn)入is_new_seed()函數(shù),如果你現(xiàn)在生成一個種子,如果你以舊格式導(dǎo)入舊種子然后它進(jìn)入舊函數(shù)。但是我上面執(zhí)行的這段代碼進(jìn)入了新功能。這就是奇跡發(fā)生的地方。is_new_seed()函數(shù)實際位于bitcoin.py文件中:

如何進(jìn)行Electrum比特幣錢包的Python代碼分析

  • 這里發(fā)生的事情很有意思,首先使用mnenonic.py文件中的normalize_text()函數(shù)對種子進(jìn)行規(guī)范化,我認(rèn)為中文或其他奇怪的語言會被轉(zhuǎn)換成我認(rèn)為的ASCII文本。所以這個功能與英文單詞列表并不多。

  • 然后就是當(dāng)事情變得有趣時,它采用種子列表的HMAC-SHA512哈希,在它的英文文本版本中基本上就是我們的情況。它檢查前兩個字符是01,因為我們稱之為標(biāo)準(zhǔn)錢包。Electrum將標(biāo)準(zhǔn)錢包定義為種子,其種子版本的HMAC-SHA512以01開頭,一個Segwit錢包,其編碼種子版本的HMAC-SHA512以02開頭等等......所以基本上循環(huán)增加my_entropy變量1直到在我們的例子中,它給出的使用Seed版本編碼的HMAC-SHA512的單詞列表以01開頭。在找到該數(shù)字后,它退出循環(huán),并返回種子。

就是這樣,這就是Electrum生成種子的基本方式。這個種子的HMAC-SHA512總和將從01開始,你甚至可以自己檢查。所以在Linux中你可以安裝一個名為GTKHash的工具來計算哈希值,所以讓我演示一下,我們?nèi)》N子,然后添加HMAC消息種子版本,如該函數(shù)所定義:

如何進(jìn)行Electrum比特幣錢包的Python代碼分析

因此,可以看到我們是否將HMAC消息Seed版本與種子一起添加,它為我們提供了以01開頭的512位hash,因此在這種情況下,這是與Electrum兼容的有效默認(rèn)種子。

當(dāng)然HMAC系統(tǒng)是牢不可破的,特別是它的512位版本可能是量子計算機(jī)抗性的,因此沒有辦法對該系統(tǒng)的種子進(jìn)行逆向工程。

但是有一個問題,如果我們修復(fù)十六進(jìn)制格式的前兩個字符,顯然HMAC-SHA512輸出是十六進(jìn)制格式,那么就會失去熵。

這就是為什么我們從132位的熵開始,因為我們丟失了大約4位的熵,因此最后的輸出只有128位的熵,這是我們想要的默認(rèn)情況,使用128位的安全熵,事實上,鑒于計算機(jī)的強(qiáng)大功能,建議現(xiàn)在使用120位以上。

所以我們從132位開始,由于修復(fù)了前2個字符,我們丟失了一些位,然后我們保持128位,這在計算上是安全的。為了暴力破解這需要超級計算機(jī)通過2128種組合,這幾乎是不可能的,因為地球上沒有足夠的能量來經(jīng)歷那么多組合,事實上有些人說你甚至不能算到這個數(shù)字范圍,更不用說hash和其他內(nèi)存密集型操作。

看起來Electrum可以安全使用。它已通過我的審核,雖然我不是加密專家,但從我研究和學(xué)習(xí)它看起來對我來說是安全的。

我仍然對custom_entropy事情持懷疑態(tài)度,我應(yīng)該問一下dev究竟做了什么,但除此之外,默認(rèn)錢包生成是完美無缺的。我認(rèn)為沒有后門。

畢竟成千上萬的人都使用Electrum,特別是那些持有大量的人,所以最好安全使用,而且在我看來是這樣。

我分析了它的主要種子生成代碼。當(dāng)然代碼遠(yuǎn)不止這些,但是我們已經(jīng)知道如果你在離線計算機(jī)上使用它生成種子,它應(yīng)該是安全的?,F(xiàn)在我沒有查看它的網(wǎng)絡(luò)相關(guān)部分,但我相信它們是安全的。

看完上述內(nèi)容是否對您有幫助呢?如果還想對相關(guān)知識有進(jìn)一步的了解或閱讀更多相關(guān)文章,請關(guān)注億速云行業(yè)資訊頻道,感謝您對億速云的支持。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI