一:產(chǎn)業(yè)鏈頻道:小飛機(jī)搜索"BRUTE_FORCE_CRYPTO_WALLET"
2、github項(xiàng)目(有成熟的工具)
GitHub - Houzich/CUDA-GPU-Brute-Force-Mnemonic-Old-Electrum-V1: CUDA-GPU-Brute-Force-Mnemonic-Old-Electrum-V1
3、揭秘以太坊 Vanity 生成器 Profanity 私鑰破解漏洞
二:案例如下:
近日,Wintermute 錢(qián)包遭攻擊損失約 1.6 億美元,被盜原因是 Wintermute 為了節(jié)省 Gas 費(fèi)使用了 Profanity 來(lái)創(chuàng)建 Vanity 錢(qián)包(開(kāi)頭 0x0000000),此前去中心化交易所聚合器 1inch 發(fā)布了一份安全披露報(bào)告,聲稱(chēng)通過(guò)名為 Profanity 的工具創(chuàng)建的某些以太坊地址存在嚴(yán)重漏洞。慢霧安全團(tuán)隊(duì)對(duì)此事件進(jìn)行了深入分析,并分享給大家。
橢圓曲線(xiàn)加密(ECC)是區(qū)塊鏈領(lǐng)域最常用的加密算法,ECC 是一個(gè)加密算法大類(lèi),它包含了多種不同的曲線(xiàn)和加密算法,例如 secp256k1/secp256r1/ed25519/schnorr 等,比特幣和以太坊都是使用 secp256k1 加密。
在使用以太坊時(shí),我們首先會(huì)生成一個(gè)私人賬號(hào)(以 0x 開(kāi)頭 + 40 字母),具體過(guò)程如下:
(1)生成一個(gè)不可預(yù)測(cè)的隨機(jī)數(shù)種子,通?;谙到y(tǒng)的 /dev/urandom 隨機(jī)發(fā)生器;
(2)利用隨機(jī)種子生成一個(gè)私鑰(256 位,32 字節(jié))
(3)通過(guò)私鑰生成公鑰(64 字節(jié))
(4)公鑰使用 keccak-256 哈希算法,取哈希值十六進(jìn)制字符串后 40 個(gè)字母,開(kāi)頭加上 0x 生成最終的以太坊地址。
特別記一下這些公私鑰的大小,因?yàn)樗P(guān)乎我們后面要做的計(jì)算量。
這里需要提的一個(gè)關(guān)鍵公式:
Q = kG
這是私鑰推導(dǎo)出公鑰的核心算法,私鑰推出公鑰計(jì)算很簡(jiǎn)單,但反向推導(dǎo)幾乎不可能。
Q 是公鑰,k 是私鑰,k 由有限域內(nèi)的大整數(shù)構(gòu)成,相當(dāng)相當(dāng)大,以致于幾乎不可能去猜測(cè),G 是橢圓曲線(xiàn)上的一個(gè)點(diǎn),默認(rèn)是一個(gè)固定的值,kG 就是 k 個(gè) G 點(diǎn)相加(橢圓曲線(xiàn)的點(diǎn)相加不是簡(jiǎn)單的實(shí)數(shù)相加,計(jì)算方法這里不展開(kāi)討論)。
如果我們想要窮舉以太坊賬號(hào),找到 Vitalik 的私鑰,那么在知道他的公鑰后,最多需要進(jìn)行 2^256 (2 的 256 次方)次的 Q = kG 計(jì)算,對(duì)大數(shù)字我們天然不敏感,所以我把它換算成工作量,就是目前一臺(tái)蘋(píng)果 M1 電腦大概 40M/s 的速率,那么大概需要的年份是 8 后面跟上 62 個(gè)零。一萬(wàn)年太久,只爭(zhēng)朝夕。
有一些錯(cuò)誤的私鑰生成方法,會(huì)導(dǎo)致私鑰的取值范圍變成更小范圍內(nèi)的數(shù)值,變得可猜解。常見(jiàn)的原因有:
(1)隨機(jī)數(shù)種子不夠隨機(jī),例如使用了時(shí)間戳做為隨機(jī)數(shù)種子,那么我們只要窮舉過(guò)去一段時(shí)間所有的時(shí)間戳就能找到生成公鑰所用的種子和私鑰;
(2)軟件算法存在缺陷,導(dǎo)致隨機(jī)強(qiáng)度不夠(Profanity 正是存在這樣的缺陷);
Profanity 的設(shè)計(jì)目的,是幫助人們生成一個(gè)具有特殊視覺(jué)效果的賬號(hào),比如以特殊字符開(kāi)頭或者結(jié)尾的賬號(hào),另一方面,一些開(kāi)發(fā)者使用它來(lái)生成開(kāi)頭為很多個(gè) 0 的賬號(hào),如 0x00000000ae347930bd1e7b0f35588b92280f9e75,它可以在調(diào)用智能合約時(shí)達(dá)到節(jié)省 Gas 的效果。
Profanity 為了更快地爆破出 Vanity Address,只在程序的開(kāi)頭獲取了一次隨機(jī)數(shù),后續(xù)所有的私鑰都是基于這個(gè)隨機(jī)數(shù)迭代擴(kuò)展而來(lái),我們來(lái)看一下它的隨機(jī)數(shù)生成算法:
這里使用了 random_device 來(lái)獲取系統(tǒng)提供的隨機(jī)數(shù),這個(gè)隨機(jī)數(shù)源是滿(mǎn)足加密所需要的強(qiáng)度的。但是當(dāng)我們注意到變量類(lèi)型時(shí),我們發(fā)現(xiàn) rd() 返回的是一個(gè) 32 位長(zhǎng)度的隨機(jī)值,上文我們提到一個(gè)私鑰是 256 位長(zhǎng)度,那么一次獲取隨機(jī)數(shù)的過(guò)程并不能填充整個(gè)私鑰,于是 Profanity 使用 mt19937_64 產(chǎn)生隨機(jī)數(shù)來(lái)填充整個(gè)私鑰。mt19937_64 和 random_device 的隨機(jī)算法有著本質(zhì)的區(qū)別,mt19937_64 是確定性的,它的隨機(jī)性依賴(lài)于輸入的隨機(jī)數(shù),并不產(chǎn)出新的隨機(jī)性。
也就是說(shuō),如果 rd() 傳遞給 mt19937_64 的值在某個(gè)范圍,那么 distr(eng) 的值也在對(duì)應(yīng)的某個(gè)范圍,createSeed 函數(shù)返回的 r 值自然也是在某一個(gè)范圍。
關(guān)鍵點(diǎn)來(lái)了: rd() 的所有可能性是 2^32,離私鑰的安全性(2^256)相差了 224 個(gè)數(shù)量級(jí),但是 2^32 這個(gè)數(shù)量級(jí)也挺大的,那么它需要多少計(jì)算量才能破解出私鑰?
Profanity 在獲取到第一個(gè)私鑰 SeedPrivateKey 以后,為了碰撞出需要的賬號(hào)地址,會(huì)通過(guò)一個(gè)固定的算法不斷跌代這個(gè)私鑰,最多 200 萬(wàn)次(數(shù)值來(lái)源于 1inch 披露的文章),這個(gè)公鑰的計(jì)算方式可表示為:
PublicKey = kG = (SeedPrivateKey + Iterator)*G
Iterator 是一個(gè)遞增的數(shù)字,當(dāng) PublicKey 已知時(shí),我們可以通過(guò)窮舉 SeedPrivateKey 和 Iterator 來(lái)得到 SeedPrivateKey,計(jì)算量大概為 2^32 乘以 200 萬(wàn)次,在 1 臺(tái) M1 電腦上需要 60 多年時(shí)間,看上去這輩子有希望 :D。如果我用大量算力更大的顯卡進(jìn)行并行計(jì)算,那么在幾天甚至幾個(gè)小時(shí)碰撞出想要的結(jié)果也完全可以。
剛好最近以太坊轉(zhuǎn) PoS 共識(shí),存在大量的閑置的顯卡算力,如果礦工拿顯卡來(lái)破解這個(gè)私鑰,那不是分分鐘就能成功?當(dāng)然這個(gè)陰謀論沒(méi)有意義,我們只想研究破解的可能性。我們更希望能用不那么暴力的方法來(lái)解開(kāi)私鑰。
我們稍微移動(dòng)一下等式兩邊,對(duì)上面的公式進(jìn)行變換,可得:
SeedPrivateKey*G = PublicKey - Iterator*G
我們可以思考另一種攻擊方法,如果首先預(yù)計(jì)算 SeedPrivateKey*G,需要最多 256 G 左右的內(nèi)存空間去存儲(chǔ)計(jì)算結(jié)果,在一臺(tái)普通的服務(wù)器上完全可以做到,所需要的計(jì)算是 2^32 次,大概幾十分鐘就可以完成。然后我們?cè)侔研枰平獾?PublicKey 代入等式右邊,然后對(duì) Iterator 跌代碰撞,所需要的計(jì)算量大概是 200 萬(wàn)次,還有 200 萬(wàn)次的查表,所需要的時(shí)間是秒級(jí)。這,就有意思了,原來(lái) 32 位的隨機(jī)數(shù)是這么的微不足道,任何人都有可能在幾十分鐘內(nèi)還原出私鑰。
至此,我們總結(jié)出了 Profanity 的漏洞成因,是由于未對(duì) 256 位私鑰進(jìn)行足夠隨機(jī)播種,導(dǎo)致私鑰取值范圍嚴(yán)重降低。同時(shí)也分析了對(duì)這類(lèi)隨機(jī)性問(wèn)題的破解可能性,希望能給大家一些啟發(fā)。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-439195.html
若有收獲,就點(diǎn)個(gè)贊吧文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-439195.html
到了這里,關(guān)于以太坊錢(qián)包私鑰爆破產(chǎn)業(yè)鏈和攻擊案例的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!