所有貨幣都需要一些方法來控制供應(yīng),并強(qiáng)制執(zhí)行各種安全屬性以防止作弊。在法定貨幣方面痴施,像中央銀行這樣的組織控制貨幣供應(yīng)量,并對(duì)實(shí)體貨幣增加防偽功能究流。這些安全功能提高了對(duì)攻擊者的防范能力辣吃,但是他們不可能不賺錢地進(jìn)行偽造。最終芬探,執(zhí)法對(duì)于阻止人們違反制度規(guī)則是必要的神得。
加密數(shù)字貨幣也必須采取安全措施,防止人們篡改系統(tǒng)狀態(tài)偷仿,并避免對(duì)不同的人造成不一致的陳述循头。如果Alice說服Bob,她給他一個(gè)數(shù)字貨幣炎疆,例如,她不應(yīng)該說服卡羅爾国裳,向卡羅爾支付同一個(gè)數(shù)字貨幣形入。與法定貨幣不同的是,加密貨幣的安全規(guī)則需要純粹在技術(shù)上執(zhí)行缝左,而不依賴于中央機(jī)構(gòu)亿遂。
顧名思義,加密貨幣大量使用加密技術(shù)渺杉。在加密數(shù)字貨幣系統(tǒng)本身的機(jī)制上蛇数,密碼學(xué)提供了一個(gè)安全的編碼規(guī)則體系。我們可以用它來防止篡改和避免模棱兩可的陳述是越,以及將數(shù)字協(xié)議用于創(chuàng)建編碼新貨幣單位的規(guī)則耳舅。在我們可以正確理解加密貨幣之前,我們需要深入研究密碼學(xué)賴以依賴的基礎(chǔ)。
密碼學(xué)是一個(gè)深入的學(xué)術(shù)研究領(lǐng)域浦徊,它利用許多先進(jìn)的數(shù)學(xué)技術(shù)馏予,以巧妙而微妙的方式理解。幸運(yùn)的是盔性,比特幣只依賴于一些相對(duì)簡(jiǎn)單和知名的加密結(jié)構(gòu)霞丧。在本章中,我們將專門研究加密散列和數(shù)字簽名冕香,證明對(duì)構(gòu)建加密貨幣非常有用的兩個(gè)原語蛹尝。未來章節(jié)將介紹更復(fù)雜的加密方案,例如零知識(shí)證明悉尾,用于比特幣擴(kuò)展和修改的提議突那。
一旦我們學(xué)習(xí)了必要的加密原語,我們將討論一些用來構(gòu)建加密貨幣的方式焕襟。我們將在本章中介紹一些簡(jiǎn)單的加密貨幣示例陨收,演示我們需要處理的一些設(shè)計(jì)挑戰(zhàn)。
1.1加密Hash函數(shù)
我們需要理解的第一個(gè)加密原語是加密散列函數(shù)(Hash function)鸵赖。一個(gè)加密散列函數(shù)(Hash function)具有以下三個(gè)屬性:
·它的輸入可以是任意大小的字符串务漩。
·它產(chǎn)生一個(gè)固定大小的輸出。為了使本章中的討論具體化它褪,我們將假設(shè)它是一個(gè)256位大小的輸出饵骨。然而,我們的討論適用于任何輸出大小茫打,只要它足夠大居触。
·這意味著對(duì)于給定的輸入字符串,可以在合理的時(shí)間內(nèi)計(jì)算哈希函數(shù)的輸出老赤。從技術(shù)上講轮洋,計(jì)算一個(gè)n位字符串的散列應(yīng)該有一個(gè)O(n)的運(yùn)行時(shí)間。
這些屬性定義了一個(gè)通用哈希函數(shù)抬旺,一個(gè)可用于構(gòu)建數(shù)據(jù)結(jié)構(gòu)(如哈希表)的函數(shù)弊予。我們將專注于加密散列函數(shù)(Hash functions)。對(duì)于密碼安全的哈希函數(shù)开财,我們將要求它具有以下三個(gè)附加屬性:(1)防撞汉柒;(2)隱匿;(3)友好的謎題责鳍。
我們將更仔細(xì)地研究每一個(gè)屬性碾褂,以了解為什么有這樣一個(gè)函數(shù)的行為是有用的。研究密碼學(xué)的讀者應(yīng)該意識(shí)到历葛,本書中哈希函數(shù)的處理與標(biāo)準(zhǔn)加密教科書有點(diǎn)不同正塌。特別是謎題友好的屬性不是對(duì)加密哈希函數(shù)的一般要求,而是對(duì)特定加密貨幣的有用屬性。
防碰撞性:如果不可能找到兩個(gè)值x和y传货,使得x ≠ y屎鳍,而H(x)= H(y),哈希函數(shù)H被認(rèn)為是防碰撞的问裕。
屬性1:防碰撞性逮壁。我們從加密哈希函數(shù)中需要的第一個(gè)屬性就是它的防碰撞。當(dāng)兩個(gè)不同的輸入產(chǎn)生相同的輸出時(shí)粮宛,會(huì)發(fā)生碰撞窥淆。如果沒有人可以發(fā)現(xiàn)碰撞,哈希函數(shù)H(.)則具有防碰撞性巍杈。正式地:
圖1.1哈希碰撞忧饭。x和y是不同的值,但是當(dāng)輸入到哈希函數(shù)H中時(shí)筷畦,它們產(chǎn)生相同的輸出词裤。
請(qǐng)注意,我們說沒有人可以找到碰撞鳖宾,但是我們沒有說沒有碰撞存在吼砂。實(shí)際上,我們確實(shí)知道碰撞存在的事實(shí)鼎文,我們可以通過一個(gè)簡(jiǎn)單的計(jì)數(shù)參數(shù)來證明這一點(diǎn)渔肩。哈希函數(shù)的輸入空間包含所有長(zhǎng)度的所有字符串,但輸出空間只包含特定且固定長(zhǎng)度的字符串拇惋。因?yàn)檩斎肟臻g大于輸出空間(實(shí)際上周偎,輸入空間是無窮大的,而輸出空間是有限的)撑帖,所以必須有輸入字符串映射到相同的輸出字符串蓉坎。事實(shí)上,根據(jù)“鴿子原則”胡嘿,映射到任何特定輸出的可能輸入必然將是非常大的袍嬉。
圖1.2由于輸入數(shù)量超過輸出數(shù)量,我們保證必須至少有一個(gè)輸出灶平,能讓哈希函數(shù)映射到多個(gè)輸入。
現(xiàn)在箍土,為了使事情變得更糟逢享,我們說它不可能發(fā)現(xiàn)碰撞。然而吴藻,有些方法可以保證發(fā)現(xiàn)碰撞瞒爬。考慮以下簡(jiǎn)單的方法來查找具有256位輸出大小的哈希函數(shù)的碰撞:挑選2的256次方加1個(gè)不同的值,計(jì)算它們中每一個(gè)的hash值侧但,并檢查是否有兩個(gè)一樣的輸出矢空。由于我們選擇了比可能輸出更多的輸入,所以當(dāng)應(yīng)用哈希函數(shù)時(shí)禀横,它們中的一些必須發(fā)生碰撞屁药。
上面的方法保證會(huì)找到碰撞。但是柏锄,如果我們選擇隨機(jī)輸入并計(jì)算哈希值酿箭,那么在檢查2的256次方加1個(gè)輸入之前,我們會(huì)高概率的發(fā)現(xiàn)碰撞趾娃。事實(shí)上缭嫡,如果我們隨機(jī)選擇2的130次方加1個(gè)輸入,結(jié)果會(huì)有99.8%的概率至少有兩個(gè)會(huì)碰撞抬闷。事實(shí)上妇蛀,我們可以通過只是粗略地檢查可能的輸出數(shù)量的平方根來找到?jīng)_突,這現(xiàn)象在概率上被稱為第二天悖論笤成。在本章末尾家庭作業(yè)的問題中评架,我們將對(duì)此進(jìn)行更詳細(xì)的研究。
這種碰撞檢測(cè)算法適用于每個(gè)哈希函數(shù)疹启。但是古程,問題在于這需要很長(zhǎng)很長(zhǎng)的時(shí)間。對(duì)于具有256位輸出的哈希函數(shù)喊崖,在最壞的情況下挣磨,您必須計(jì)算哈希函數(shù)2的256次方加1次,平均大約2的128次方次荤懂。這當(dāng)然是一個(gè)天文數(shù)字 ——如果一臺(tái)計(jì)算機(jī)每秒計(jì)算10,000次hash值茁裙,那么需要超過一千萬(10的27次方)年的時(shí)間來計(jì)算2的128次方個(gè)hash值!以另一方式來思考這個(gè)問題节仿,我們可以這樣說晤锥,如果人類制造的每一臺(tái)計(jì)算機(jī)從宇宙誕生以來都開始計(jì)算,到目前為止廊宪,他們發(fā)現(xiàn)沖突的幾率仍然是非常渺小的矾瘾。如此之小,比地球在接下來的兩秒鐘內(nèi)被一顆巨大的流星摧毀的幾率都要小得多箭启。
因此壕翩,我們看到了一種通用但不切實(shí)際的算法來找尋任意哈希函數(shù)的碰撞。一個(gè)更難的問題是:是否有其他方法可以在特定的哈希函數(shù)上使用傅寡,以便找到碰撞放妈?換句話說北救,雖然通用碰撞檢測(cè)算法是不可行的,但仍然可能有其他一些可以有效地找到特定哈希函數(shù)碰撞的算法芜抒。
例如珍策,考慮以下哈希函數(shù):
該函數(shù)滿足我們對(duì)散列函數(shù)的要求,因?yàn)樗邮苋魏伍L(zhǎng)度的輸入宅倒,返回一個(gè)固定大小的輸出(256位)攘宙,并且是有效可計(jì)算的。這個(gè)函數(shù)還有一個(gè)找到碰撞的有效方法唉堪。請(qǐng)注意模聋,此函數(shù)只返回輸入的最后256位。一個(gè)碰撞的值會(huì)是3和3加2的256次方唠亚。這個(gè)簡(jiǎn)單的例子說明链方,盡管我們的通用碰撞檢測(cè)方法在實(shí)踐中是不可用的,但至少存在一些確實(shí)有效的碰撞檢測(cè)方法的哈希函數(shù)灶搜。
然而對(duì)于其他哈希函數(shù)祟蚀,我們不知道是否存在這樣的方法。我們懷疑他們是抗碰撞的割卖。但是前酿,沒有任何哈希函數(shù)被證明是抗碰撞的。我們?cè)趯?shí)踐中依賴的加密哈希函數(shù)只是人們嘗試的功能鹏溯,真的很難找到碰撞罢维,且從未成功過。在某些情況下丙挽,如舊的MD5哈希函數(shù)肺孵,最終在多年的工作中發(fā)現(xiàn)了沖突,導(dǎo)致功能過時(shí)颜阐,被實(shí)用界逐步拋棄平窘。所以我們選擇相信那些是抗碰撞的。
應(yīng)用:消息摘要現(xiàn)在我們知道抗碰撞是什么凳怨,合乎邏輯的問題是:抗碰撞有什么用瑰艘?這里有一個(gè)應(yīng)用:這里有一個(gè)應(yīng)用:如果我們知道抗碰撞哈希函數(shù)H的兩個(gè)輸入x和y是不同的,那么可以安全地假定它們的hash值H(x)和H(y)是不同的肤舞,如果有人知道一個(gè)x和y是不同的紫新,但是具有相同的hash值,這將違反我們的假設(shè)李剖,這樣的H是抗碰撞的弊琴。
這個(gè)論據(jù)允許我們使用hash輸出作為消息摘要≌人考慮SecureBox敲董,一個(gè)經(jīng)過身份驗(yàn)證的在線文件存儲(chǔ)系統(tǒng),允許用戶在下載文件時(shí)上傳文件并確保其完整性慰安。假設(shè)Alice上傳的文件很大腋寨,想要稍后能驗(yàn)證她下載的文件與上傳的文件是一樣的。一種方法是在將整個(gè)大文件保存在本地化焕,并直接將其與下載的文件進(jìn)行比較萄窜。雖然這樣做有效,但它在很大程度上違背了上傳它的目的撒桨;如果Alice需要訪問文件的本地副本以確保其完整性查刻,則可以直接使用本地副本。
無碰撞的哈希為這個(gè)問題提供了一個(gè)優(yōu)雅而高效的解決方案凤类。Alice只需要記住原始文件的hash值穗泵。當(dāng)她以后從SecureBox下載文件時(shí),她會(huì)計(jì)算下載的文件的hash值并將其與存儲(chǔ)的文件進(jìn)行比較谜疤。如果哈希值是相同的佃延,那么她可以得出結(jié)論,文件確實(shí)是她上傳的夷磕,如果它們不同履肃,那么Alice可以斷定該文件已被篡改。因此坐桩,記住哈铣咂澹可以讓她在傳輸過程中或在SecureBox的服務(wù)器上檢測(cè)文件的意外損壞,而且還可以由服務(wù)器義務(wù)修改文件绵跷。面對(duì)其他實(shí)體潛在的惡意行為膘螟,這是加密技術(shù)為我們提供保證的核心。
Hash用作消息的固定長(zhǎng)度摘要或明確的摘要抖坪。這給了我們以一個(gè)非常有效的方式來記住我們以前看到的事情萍鲸,并再次認(rèn)出它們。而整個(gè)文件可能已經(jīng)是千兆字節(jié)長(zhǎng)擦俐,hash卻是固定的長(zhǎng)度脊阴,在我們的例子中hash函數(shù)有256位字節(jié)。這大大降低了我們的存儲(chǔ)需求蚯瞧。在本章后面和整本書中嘿期,我們將看到使用哈希作為消息摘要的有用應(yīng)用程序。
屬性2:隱匿性從哈希函數(shù)中得到想要的第二個(gè)屬性是隱匿埋合。隱匿屬性聲明如果我們給出hash函數(shù)y= H(x)的輸出备徐,則沒有可行的方法來確定輸入x是什么旗唁。問題是矩乐,該屬性不能以聲明的形式存在琳彩∈疗校考慮以下簡(jiǎn)單的例子:我們要做一個(gè)擲硬幣的實(shí)驗(yàn)。如果硬幣翻轉(zhuǎn)的結(jié)果是頭蹭睡,我們要宣布字符串的哈希值是“頭”衍菱。如果結(jié)果是尾,那么我們要宣布字符串的哈希值是“尾”肩豁。
然后我們問一個(gè)沒有看到硬幣翻轉(zhuǎn)脊串,只看到哈希輸出值的對(duì)手,讓他弄清楚字符串是散列的(我們很快就會(huì)知道為什么我們可能想玩這樣的游戲)清钥。作為回應(yīng)琼锋,他們將簡(jiǎn)單地計(jì)算字符串“頭”和字符串“尾”的哈希值,并且他們可以看到他們被給予了哪一個(gè)祟昭。所以缕坎,在短短幾步之后,他們可以弄清楚輸入的是什么从橘。
對(duì)手能夠猜出這個(gè)字符串是因?yàn)閤只有兩個(gè)可能的值念赶,對(duì)手很容易嘗試這兩個(gè)值。為了能夠?qū)崿F(xiàn)隱匿屬性恰力,需要注意的是沒有特別可能的x值叉谜,也就是說x必須在某種意義上從分散的集合中選擇。如果從這樣一個(gè)集合中選擇x踩萎,那么嘗試x值可能有幾個(gè)值的方法將不起作用停局。
最大的問題是:當(dāng)我們想要的值不像我們的“頭”和“尾”的實(shí)驗(yàn)?zāi)菢樱覀兛梢詫?shí)現(xiàn)隱匿的屬性嗎香府?幸運(yùn)的是董栽,答案是肯定的!所以我們或許可以隱藏企孩,甚至一個(gè)輸入可以不通過將其連接到另一個(gè)相關(guān)聯(lián)的輸入來傳播锭碳。我們現(xiàn)在可以稍微更精確地說明我們隱匿的意思(雙垂直條‖表示連接)。
隱匿?hash函數(shù)H是隱匿的勿璃,如果:從具有高的最小熵的概率分布中選擇秘密值r擒抛,當(dāng)給定H(r||x)時(shí),找到x是不可行的补疑。
在信息理論中歧沪,最小熵是衡量結(jié)果可預(yù)測(cè)性的一個(gè)指標(biāo),高最小熵捕捉到分布(即隨機(jī)變量)是非常分散的直觀思想莲组。這具體意味著诊胞,當(dāng)我們從分布中抽樣時(shí),沒有特定的值可能發(fā)生锹杈。所以撵孤,對(duì)于一個(gè)具體的例子迈着,如果從256位長(zhǎng)的所有字符串中均勻地選擇了r,然后選擇任何特定的字符串的概率為1/2的256次方邪码,這是一個(gè)無窮小的值寥假。
應(yīng)用:托管現(xiàn)在讓我們來看一下隱匿屬性的應(yīng)用。特別是我們想要做的就是所謂的托管霞扬。托管的是帶有值的數(shù)字模擬,把它密封在一個(gè)信封里枫振,然后把信封放在桌子上喻圃,每個(gè)人都可以看到它。當(dāng)你這樣做時(shí)粪滤,你已經(jīng)托管了信封里面的內(nèi)容斧拍。但是你沒有打開它,所以即使你托管了一個(gè)值杖小,這個(gè)值對(duì)于其他人仍然是秘密肆汹。稍后,你可以打開信封并顯示你先前提交的值予权。
托管方案托管方案由兩種算法組成:
com:=托管(msg昂勉,nonce)托管函數(shù)輸入消息和秘密的隨機(jī)值nonce,返回一個(gè)托管值
校驗(yàn)(com扫腺,msg岗照,nonce)驗(yàn)證函數(shù)將托管值、隨機(jī)數(shù)nonce和消息作為輸入笆环。如果com==commit(msg攒至,nonce)則返回True,否則返回False躁劣。
我們要求以下兩個(gè)安全屬性保持不變:
隱匿:給定com迫吐,找到msg是不可能的。
綁定:不可能找到兩對(duì)(msg账忘,nonce)和(msg’志膀,nonce’),這樣msg≠msg’但commit(msg,nonce)==commit(msg’,nonce’)
要使用托管方案闪萄,我們首先需要生成隨機(jī)數(shù)n梧却。然后,我們將commit函數(shù)與msg一起應(yīng)用到該隨機(jī)數(shù)n败去,該值被托管放航,并發(fā)布托管值com。這個(gè)階段類似于將密封的信封放在桌子上圆裕。稍后广鳍,如果我們想要揭示他們之前提交的值荆几,我們會(huì)發(fā)布我們用來創(chuàng)建這個(gè)托管的隨機(jī)數(shù)n,以及消息msg∩奘保現(xiàn)在吨铸,任何人都可以驗(yàn)證msg確實(shí)是早期托管的消息。這個(gè)階段類似于打開信封祖秒。
每次你托管一個(gè)值诞吱,重要的是您選擇一個(gè)新的隨機(jī)數(shù)n。 在密碼學(xué)中竭缝,術(shù)語“隨機(jī)數(shù)”用于指代只能使用一次的值房维。
這兩個(gè)安全屬性規(guī)定,算法實(shí)際上表現(xiàn)為密封和打開信封抬纸。首先咙俩,給定com和托管,只看信封的人無法弄清楚里面的信息是什么湿故。第二個(gè)屬性是它的綁定阿趁。這樣可以確保當(dāng)你托管信封中的內(nèi)容時(shí),你將不能再改變主意坛猪。也就是說脖阵,找到兩條不同的消息是不可行的,你不可以提交一個(gè)消息砚哆,然后再聲明你已經(jīng)提交另一個(gè)消息独撇。
那么,我們?cè)趺粗肋@兩個(gè)屬性呢躁锁?在我們回答之前纷铣,我們需要討論如何實(shí)際實(shí)施一個(gè)托管方案。我們可以使用加密哈希函數(shù)來做到這一點(diǎn)战转∷蚜ⅲ考慮以下托管方案:
commit(msg, nonce) := H(nonce ‖msg) n是一個(gè)256字節(jié)的隨機(jī)數(shù)
為了提交一個(gè)消息,我們生成一個(gè)256位的隨機(jī)數(shù)n槐秧。然后我們連接隨機(jī)數(shù)n和消息啄踊,并返回這個(gè)連接值的哈希作為托管。要驗(yàn)證刁标,有人要去計(jì)算與消息連接的隨機(jī)數(shù)的相同哈希值颠通。他們會(huì)檢查這是否等于他們看到的托管。
再看一下我們承諾計(jì)劃中需要的兩個(gè)屬性膀懈。如果我們替換實(shí)例化的托管顿锰,然后驗(yàn)證H(nonce||msg)是com,那么這些屬性將變?yōu)椋?/p>
隱匿:給定H(nonce||msg),不可能找到msg
綁定:不可能找到兩對(duì)(msg硼控,nonce)和(msg’刘陶,nonce’),這樣msg≠msg’但H(msg,nonce)==H(msg’,nonce’)
托管的隱匿屬性正是我們對(duì)哈希函數(shù)所需的隱匿屬性牢撼。如果密鑰被選擇為256位的隨機(jī)值匙隔,則隱匿屬性表示,如果我們對(duì)密鑰和消息一起進(jìn)行哈希熏版,那么從哈希的結(jié)果去恢復(fù)消息是不可能的纷责。事實(shí)證明,綁定屬性隱含了底層哈希函數(shù)的抗碰撞特性撼短。如果哈希函數(shù)是抗碰撞的碰逸,那么是不可能找到不同的msg和msg'的,使得H(nonce‖msg)= H(nonce’||“msg”)阔加,因?yàn)檫@些值確實(shí)是一個(gè)碰撞。
因此满钟,如果H是具有防碰撞和隱匿的哈希函數(shù)胜榔,則該托管方案將在其具有必要的安全屬性的意義上起作用。
屬性3:謎題友好性我們從哈希函數(shù)中需要的第三個(gè)安全屬性是謎題友好湃番。這個(gè)屬性有點(diǎn)復(fù)雜夭织。首先,我們將解釋這個(gè)屬性的技術(shù)要求吠撮,然后給出一個(gè)應(yīng)用程序尊惰,說明為什么這個(gè)屬性是有用的。
謎題友好?一個(gè)哈希函數(shù)H被稱為謎題友好——對(duì)于每個(gè)可能的n位輸出值y泥兰,如果從具有高最小熵的分布中選擇k弄屡,則不可能找到x使得H(k||x)=y最后明顯小于2的n次方。
直觀地說鞋诗,這意味著如果有人想要將哈希函數(shù)定位到一些特定的輸出值y膀捷,那么如果有一部分輸入以適當(dāng)?shù)碾S機(jī)方式選擇,則很難找到另一個(gè)值恰好命中該值削彬。
應(yīng)用:搜索謎題現(xiàn)在全庸,我們通過一個(gè)應(yīng)用來說明這個(gè)屬性的有用性。在這個(gè)應(yīng)用中融痛,我們將構(gòu)建一個(gè)搜索謎題壶笼,一個(gè)需要搜索非常大空間才能找到解決方案的數(shù)學(xué)問題。特別的是雁刷,這個(gè)搜索謎題沒有捷徑覆劈。也就是說,除了窮盡整個(gè)空間之外,沒有辦法找到有效的解決方案墩崩。
搜索謎題?搜索謎題包括
·一個(gè)哈希函數(shù)氓英,H
·一個(gè)值,id(我們稱之為謎題ID)鹦筹,從高最小熵分布中選擇的
·目標(biāo)集合Y
這個(gè)謎題的解決方案是一個(gè)值x铝阐,使得
H(id‖x)∈Y.
直覺是這樣的:如果H具有n位輸出,則可能是2的n次方個(gè)值中的任何一個(gè)铐拐。如果要解決謎題徘键,需要找到一個(gè)輸入,使得輸出落在遠(yuǎn)小于所有輸出集合的集合Y內(nèi)遍蟋。Y的大小決定了謎題的難度吹害。如果Y是所有n位串的集合,這個(gè)謎題是微不足道的虚青,而如果Y只有1個(gè)元素它呀,那么這個(gè)難題就是最難的。謎題ID具有高的最小熵的事實(shí)棒厘,確保這沒有捷徑纵穿。相反,如果ID的特定值很適合奢人,那么有人就可能會(huì)欺騙谓媒,比如通過使用該ID預(yù)先計(jì)算一個(gè)謎題的解決方案。
如果一個(gè)搜索謎題是謎題友好的何乎,這意味著這個(gè)謎題沒有解決策略句惯,這比只是嘗試x的隨機(jī)值更好。因此支救,如果我們想要構(gòu)建一個(gè)難以解決的謎題抢野,只要我們能以適當(dāng)?shù)碾S機(jī)方式生成謎題ID就可以了。稍后當(dāng)我們談?wù)摫忍貛砰_采時(shí)各墨,我們將使用這個(gè)想法蒙保,這是一種計(jì)算謎題。
SHA‐256欲主。我們已經(jīng)討論了哈希函數(shù)的三個(gè)屬性邓厕,并且每個(gè)屬性都有一個(gè)應(yīng)用實(shí)例。現(xiàn)在扁瓢,讓我們來討論一個(gè)將在本書中使用很多次的特定哈希函數(shù)详恼。哈希函數(shù)有很多,但是這個(gè)是Bitcoin主要使用的引几,一個(gè)相當(dāng)不錯(cuò)的使用昧互。這就是所謂的SHA-256挽铁。
回想一下,我們要求哈希函數(shù)適用于任意輸入長(zhǎng)度敞掘。幸運(yùn)的是叽掘,只要我們可以建立一個(gè)適用于固定輸入長(zhǎng)度的哈希函數(shù),用一個(gè)通用的方法將其轉(zhuǎn)換成適用于任意輸入長(zhǎng)度的哈希函數(shù)即可玖雁。這就是所謂的Merkle‐Damgard轉(zhuǎn)換更扁。SHA‐256是使用這種方法的常用哈希函數(shù)之一。在通用術(shù)語中赫冬,底層為固定長(zhǎng)度抗碰撞哈希函數(shù)被稱作壓縮函數(shù)浓镜。已經(jīng)證明,如果底層壓縮函數(shù)是抗沖擊的劲厌,那么整個(gè)哈希函數(shù)也具有抗沖擊性膛薛。
Merkle‐Damgard轉(zhuǎn)換非常簡(jiǎn)單。說的是壓縮函數(shù)取長(zhǎng)度為m的輸入补鼻,并產(chǎn)生一個(gè)較小長(zhǎng)度為n的輸出哄啄。對(duì)哈希函數(shù)的輸入,可以是任何規(guī)模风范,被分成長(zhǎng)度為m-n的塊增淹。結(jié)構(gòu)工作如下:將每個(gè)塊與前一塊的輸出一起傳遞到壓縮函數(shù)。注意乌企,輸入長(zhǎng)度將變?yōu)椋╩-n)+n=m,這也是壓縮函數(shù)的輸入長(zhǎng)度成玫。對(duì)于沒有先前塊輸出的第一個(gè)塊加酵,我改為使用初始化向量(IV)。這個(gè)數(shù)字被重復(fù)使用到哈希函數(shù)的每一個(gè)調(diào)用中哭当,實(shí)際上你可以在標(biāo)準(zhǔn)文檔中查找到猪腕。最后一個(gè)塊的輸出就是你想要返回的結(jié)果。
SHA-256采用一個(gè)壓縮函數(shù)钦勘,它需要768位輸入并產(chǎn)生256位的輸出陋葡,塊的大小為512位。有關(guān)SHA-256工作的圖形說明彻采,請(qǐng)參見圖1.3腐缤。
圖1.3:SHA-256哈希函數(shù)(簡(jiǎn)圖)SHA‐256使用Merkle-Damgard變換將固定長(zhǎng)度的抗碰撞壓縮函數(shù)轉(zhuǎn)換為接受任意長(zhǎng)度輸入的哈希函數(shù)。它的輸入是“填充”肛响,故其長(zhǎng)度為512位的倍數(shù)岭粤。
我們討論了哈希函數(shù),具有特殊屬性的加密哈希函數(shù)特笋,這些屬性的應(yīng)用以及我們?cè)诒忍貛胖惺褂玫奶囟ü:瘮?shù)剃浇。在下一屆中,我們將討論如何使用哈希函數(shù)來構(gòu)建更多復(fù)雜的數(shù)據(jù)結(jié)構(gòu),這些數(shù)據(jù)結(jié)構(gòu)用于像Bitcoin這樣的分布式系統(tǒng)虎囚。
補(bǔ)充部分:哈希函數(shù)建模哈希函數(shù)是加密領(lǐng)域的瑞士軍刀:他們?cè)诟鞣N各樣的應(yīng)用中找到了一個(gè)地方角塑。這種多功能性的另一面是,不同的應(yīng)用需要稍微不同的哈希函數(shù)屬性來確保安全性淘讥。眾所周知圃伶,很難確定一個(gè)哈希函數(shù)屬性的列表,這將導(dǎo)致整個(gè)系統(tǒng)的安全性證明适揉。
在本文中留攒,我們選擇了三中屬性,這些屬性對(duì)于比特幣和其他加密貨幣使用哈希函數(shù)的方式至關(guān)重要嫉嘀。即使在這個(gè)空間中炼邀,并不是所有這些屬性都是每次使用哈希函數(shù)所必需的。例如剪侮,我們將看到謎題友好只在比特幣挖礦中是重要的拭宁。
安全系統(tǒng)的設(shè)計(jì)者通常會(huì)拋出一個(gè)模型,將哈希函數(shù)建模為為每一個(gè)可能的輸入輸出獨(dú)立隨機(jī)值的函數(shù)瓣俯。在密碼學(xué)中杰标,使用這種“隨機(jī)語言模型”來證明安全性仍然存在爭(zhēng)議。不管人們對(duì)這個(gè)辯論的立場(chǎng)如何彩匕,論證如何將我們的應(yīng)用中所需的安全屬性降低到底層基元的基本屬性上腔剂,對(duì)于構(gòu)建安全系統(tǒng)是一個(gè)很有價(jià)值的智力練習(xí)。我們?cè)诒菊轮械年愂鲋荚趲椭銓W(xué)習(xí)這項(xiàng)技能驼仪。
1.2哈希指針和數(shù)據(jù)結(jié)構(gòu)
我在本節(jié)中掸犬,我們將討論哈希指針以及它的應(yīng)用。哈希指針是一種數(shù)據(jù)結(jié)構(gòu)绪爸,它在我們將討論的許多系統(tǒng)中非常有用湾碎。哈希指針只是一個(gè)指向一些信息與利用加密哈希的信息存儲(chǔ)在一起的指針。一個(gè)常規(guī)指針給你一種檢索信息的方法奠货,而一個(gè)哈希指針也提供了一種驗(yàn)證信息沒有改變的方法介褥。
圖1.4:哈希指針S哈希指針是一個(gè)指向數(shù)據(jù)在某個(gè)固定時(shí)間點(diǎn)與該數(shù)據(jù)的加密哈希值一起存儲(chǔ)的位置指針。
我們可以使用哈希指針來構(gòu)建各種數(shù)據(jù)結(jié)構(gòu)递惋。直觀地柔滔,我們可以采用一種熟悉的數(shù)據(jù)結(jié)構(gòu),它使用諸如鏈接列表或二叉搜索樹之類的指針萍虽,并用哈希指針來實(shí)現(xiàn)廊遍,而不是像通常那樣使用指針。
區(qū)塊鏈在圖1.5中贩挣,我們使用哈希指針構(gòu)建了一個(gè)鏈表喉前。我們將把這個(gè)數(shù)據(jù)結(jié)構(gòu)稱為區(qū)塊鏈没酣。而在具有一系列塊的常規(guī)鏈表中,每個(gè)塊都有數(shù)據(jù)卵迂,以及指向列表中先前一個(gè)塊的指針裕便,在塊鏈中,前一個(gè)塊指針將被替換為哈希指針见咒。因此偿衰,每個(gè)塊不僅告訴我們上一塊的值在哪里,而且還包含該值的摘要改览,允許我們驗(yàn)證值沒有改變下翎。我們存儲(chǔ)列表的頭,它只是一個(gè)指向最新數(shù)據(jù)塊的常規(guī)哈希指針宝当。
圖1.5區(qū)塊鏈 區(qū)塊鏈?zhǔn)且粋€(gè)使用哈希指針而不是指針構(gòu)建的鏈表视事。
區(qū)塊鏈的一個(gè)用例就是一個(gè)防篡改的日志。也就是說庆揩,我們要構(gòu)建一個(gè)存儲(chǔ)一堆數(shù)據(jù)的日志數(shù)據(jù)結(jié)構(gòu)俐东,并允許我們將數(shù)據(jù)附加到日志的末尾。但是订晌,如果有人改變了日志中較早的數(shù)據(jù)虏辫,我們將會(huì)檢測(cè)到它。
要了解為什么一個(gè)區(qū)塊鏈可以實(shí)現(xiàn)這個(gè)篡改的屬性锈拨,讓我們來看一看砌庄,如果對(duì)手想篡改鏈中間的數(shù)據(jù)會(huì)發(fā)生什么。具體來說奕枢,對(duì)手的目標(biāo)是以這樣的方式進(jìn)行的娄昆,只記住區(qū)塊鏈頭部的哈希指針的人將無法檢測(cè)到篡改。為了實(shí)現(xiàn)這個(gè)目標(biāo)验辞,對(duì)手改變了一些區(qū)塊k的數(shù)據(jù)。由于數(shù)據(jù)已經(jīng)被改變喊衫,區(qū)塊k+1中的哈希值是整個(gè)區(qū)塊k的哈希值跌造,因此不會(huì)匹配。請(qǐng)記住族购,我們?cè)诮y(tǒng)計(jì)上保證壳贪,由于哈希函數(shù)具有抗碰撞性,故新哈希將不會(huì)與更改后的內(nèi)容相匹配寝杖。因此违施,我們將檢測(cè)區(qū)塊k中的新數(shù)據(jù)與區(qū)塊k+1中的哈希指針之間的不一致。當(dāng)然瑟幕,對(duì)手可以繼續(xù)嘗試通過改變下一個(gè)區(qū)塊的哈希來掩蓋這個(gè)變化磕蒲。對(duì)手可以繼續(xù)這樣做留潦,但是當(dāng)他到達(dá)名單的頭部時(shí),這個(gè)策略就會(huì)失敗辣往。具體來說兔院,只要我們將哈希指針列表的頭部存儲(chǔ)在對(duì)手不能改變的地方,對(duì)手將不能在不被檢測(cè)的情況下改變?nèi)魏螀^(qū)塊站削。
這樣做的結(jié)果是坊萝,如果對(duì)手想要在整個(gè)鏈中的任何地方篡改數(shù)據(jù),為了保持故事的一致性许起,他將不得不篡改哈希指針直到它開始的地方十偶。而且他最終會(huì)遇到障礙,因?yàn)樗麩o法篡改列表的頭部园细。因此出現(xiàn)的是惦积,通過記住這個(gè)單獨(dú)的哈希指針,我們基本上記住了一個(gè)防篡改哈希的整個(gè)列表珊肃。因此荣刑,我們可以構(gòu)建一個(gè)像這樣的區(qū)塊鏈,它包含了我們想要的區(qū)塊伦乔,在列表的開始追溯到的一些特殊的區(qū)塊厉亏,我們將其稱之為起源區(qū)塊。
您可能已經(jīng)注意到烈和,這個(gè)區(qū)塊鏈結(jié)構(gòu)類似于上一節(jié)中我們看到的Merkle-Damgard結(jié)構(gòu)爱只。實(shí)際上,它們是非常相似的招刹,同樣的安全論據(jù)也適用于他們恬试。
圖1.6防篡改日志?如果對(duì)手在區(qū)塊鏈中的任何位置修改數(shù)據(jù),則會(huì)導(dǎo)致以下區(qū)塊中的哈希指針不正確疯暑。如果我們存儲(chǔ)列表的頭部训柴,那么即使對(duì)手將所有指針修改為與修改后的數(shù)據(jù)一致,頭指針也將不正確妇拯,我們會(huì)檢測(cè)到篡改幻馁。
Merkle樹。我們可以使用哈希指針構(gòu)建的另一個(gè)有用的數(shù)據(jù)結(jié)構(gòu)是二叉樹越锈。具有哈希指針的二進(jìn)制樹被稱為Merkle樹仗嗦,其發(fā)明人是Ralph Merkle。假設(shè)我們有一些包含數(shù)據(jù)的區(qū)塊甘凭,這些區(qū)塊包括我們樹的葉子稀拐。我們將這些數(shù)據(jù)塊分成兩組,然后對(duì)于每一對(duì)丹弱,我們構(gòu)建一個(gè)具有兩個(gè)哈希指針的數(shù)據(jù)結(jié)構(gòu)德撬,每個(gè)指向其中之一的區(qū)塊铲咨。這些數(shù)據(jù)結(jié)構(gòu)成為樹的下一個(gè)級(jí)別。我們反過來將它們分成兩組砰逻,每對(duì)都創(chuàng)建一個(gè)包含每個(gè)哈希的新數(shù)據(jù)結(jié)構(gòu)鸣驱。我們繼續(xù)這樣做,直到我們到達(dá)一個(gè)單一的區(qū)塊蝠咆,樹的根踊东。
圖1.7 Merkle樹?在Merkle樹中,數(shù)據(jù)塊成對(duì)分組刚操,并且這些塊中的每一個(gè)的哈希存儲(chǔ)在父節(jié)點(diǎn)中闸翅。父節(jié)點(diǎn)依次成對(duì)分組,并將其哈希存儲(chǔ)在樹的上一級(jí)菊霜。這一直延續(xù)到樹上坚冀,直到我們到達(dá)根節(jié)點(diǎn)。
像以前一樣鉴逞,我們只記得樹的頭部的哈希指針记某。我們現(xiàn)在有能力向下遍歷哈希指針到列表中的任何一點(diǎn)。這樣我們就可以確保數(shù)據(jù)沒有被篡改构捡,因?yàn)檎缥覀冇脜^(qū)塊鏈所看到的那樣液南,如果一個(gè)對(duì)手在樹底部篡改一些數(shù)據(jù)塊,這將導(dǎo)致一個(gè)級(jí)別的哈希指針不匹配勾徽,即使他繼續(xù)篡改該區(qū)塊滑凉,更改將最終傳播到樹的頂部,在那里他將無法篡改我們存儲(chǔ)的哈希指針喘帚。再來一次畅姊,任何篡改任何數(shù)據(jù)的嘗試都將通過記住頂部的哈希指針來被檢測(cè)。
會(huì)籍證明Merkle樹的另一個(gè)很好的特征是吹由,與之前建立的區(qū)塊鏈不同若未,它允許一個(gè)簡(jiǎn)明的會(huì)籍證明姨谷。有人想證明某個(gè)數(shù)據(jù)塊是Merkle Tree的成員赁还。像往常一樣堂淡,我們只記得根源忘衍。然后他們需要向我們顯示這個(gè)數(shù)據(jù)區(qū)塊,以及從數(shù)據(jù)區(qū)塊到根的路徑上的區(qū)塊倘感。我們可以忽略樹的其余部分,因?yàn)樵撀窂缴系膲K足以允許我們一直驗(yàn)證散列到樹的根部。有關(guān)如何工作的圖形描述玫荣,請(qǐng)參見圖1.8。
如果樹中有n個(gè)節(jié)點(diǎn)大诸,則只需要顯示大約log(n)個(gè)項(xiàng)目捅厂。并且由于每個(gè)步驟只需要計(jì)算子塊的哈希值贯卦,所以需要大約log(n)時(shí)間來驗(yàn)證它。所以即使Merkle樹包含了大量的塊焙贷,我們?nèi)匀豢梢栽谙鄬?duì)較短的時(shí)間內(nèi)證明成員資格撵割。驗(yàn)證因此在時(shí)間和空間上運(yùn)行,數(shù)目是樹中節(jié)點(diǎn)數(shù)的對(duì)數(shù)辙芍。
圖1.8會(huì)籍證明?為了證明樹中包含一個(gè)數(shù)據(jù)塊啡彬,只需要顯示從該數(shù)據(jù)區(qū)塊到根的路徑中的區(qū)塊。
一個(gè)分類的Merkle樹只是一個(gè)我們?cè)诘撞坎杉瘏^(qū)塊故硅,使用一些排序函數(shù)進(jìn)行排序的Merkle樹庶灿。這可以是字母順序,字典順序吃衅,數(shù)字順序或其他一些約定的順序往踢。
非會(huì)籍證明Merkle樹的另一個(gè)很好的特征是,與之前建立的區(qū)塊鏈不同徘层,它允許一個(gè)簡(jiǎn)明的會(huì)籍證明峻呕。
使用排序的Merkle樹,我們可以在時(shí)間和空間的對(duì)數(shù)上驗(yàn)證非會(huì)員資格趣效。也就是說瘦癌,我們可以證明一個(gè)特定的區(qū)塊不在Merkle樹中 。而我們這樣做的方式只是簡(jiǎn)單通過顯示一個(gè)項(xiàng)目的路徑英支,這個(gè)項(xiàng)目恰好在所討論項(xiàng)目之前佩憾,并顯示該項(xiàng)目的路徑。如果這兩個(gè)項(xiàng)目在樹中是連續(xù)的干花,那么這可以作為證明該項(xiàng)目不包括在內(nèi)的證據(jù)妄帘。因?yàn)槿绻话ǎ鼘⑿枰陲@示的兩個(gè)項(xiàng)目之間池凄,但因?yàn)樗鼈兪沁B續(xù)的抡驼,故它們之間沒有空格。
我們已經(jīng)討論過在鏈表和二叉樹中使用哈希指針肿仑,但更普遍的是致盟,只要數(shù)據(jù)結(jié)構(gòu)沒有循環(huán),我們就可以在任何基于指針的數(shù)據(jù)結(jié)構(gòu)中使用哈希指針尤慰。如果數(shù)據(jù)結(jié)構(gòu)中有循環(huán)馏锡,那么我們將無法使所有的哈希值相匹配。如果你考慮一下伟端,在一個(gè)非循環(huán)的數(shù)據(jù)結(jié)構(gòu)中杯道,我們可以在葉子附近開始,或者靠近沒有任何指針出來的東西责蝠,計(jì)算它們的哈希值党巾,然后回到起始點(diǎn)萎庭。但是在一個(gè)有循環(huán)的結(jié)構(gòu)中,沒有一個(gè)地方是頭齿拂,也沒有一個(gè)地方是尾驳规,我們無法從頭開始并從中計(jì)算出來。
所以署海,考慮到另一個(gè)例子吗购,我們可以從哈希指針中構(gòu)建一個(gè)有向無環(huán)圖。我們將能夠非常有效地驗(yàn)證該圖表中的成員資格砸狞,而且它很容易計(jì)算巩搏。以這種方式使用哈希指針是一般的技巧,您將在分布式數(shù)據(jù)結(jié)構(gòu)和本章后面的整個(gè)本書中討論的算法中一次又一次地看到趾代。
1.3數(shù)字簽名
在本節(jié)中贯底,我們將看看數(shù)字簽名。這是第二個(gè)加密原語撒强,和哈希函數(shù)一樣禽捆,我們后續(xù)會(huì)把它作為加密的構(gòu)建區(qū)塊來討論。數(shù)字簽名應(yīng)該是手寫在紙上簽名的模擬數(shù)字飘哨。我們希望數(shù)字簽名中的兩個(gè)屬性與手寫簽名類比很好胚想。首先,只有你可以簽名芽隆,但任何看到它的人都可以驗(yàn)證它是否有效浊服。其次,我們希望將簽名與特定文件相關(guān)聯(lián)胚吁,以便簽名不能用于表示你的協(xié)議或認(rèn)可其他文檔牙躺。對(duì)于手寫簽名,后一個(gè)屬性類似于確保有人不能將您的簽名從一個(gè)文檔中刪除腕扶,并將其粘貼到另一個(gè)文檔的底部孽拷。
數(shù)字簽名方案數(shù)字簽名方案由以下三種算法組成:
·(sk,pk):=generateKeys(keysize)The generateeys的方法獲取一個(gè)密鑰的大小半抱,并生成一個(gè)密鑰與之配對(duì)脓恕。秘密密鑰sk被保密起來,用于簽署消息窿侈。Pk是你向每個(gè)人提供的公開驗(yàn)證密鑰炼幔,任何擁有此密鑰的人都可以驗(yàn)證你的簽名。
·sig:=sign(sk史简,message)符號(hào)方法將消一個(gè)消息和一個(gè)秘密密鑰sk作為輸入乃秀,并在sk下輸出簽名消息
·isValid:=verify(pk,message,sig)驗(yàn)證方法將消息环形、簽名和公鑰作為輸入。它返回一個(gè)布爾值isValid衙傀,如果sig是公鑰pk下的有效簽名消息則為true抬吟,否則為false。
我們要求以下兩個(gè)屬性:
·必須驗(yàn)證有效的簽名
verify(pk统抬,message火本,sign(sk,message))==ture
·簽名存在且不可偽造
我們?nèi)绾问褂脭?shù)字加密技術(shù)來搭建它聪建?首先钙畔,讓我們將以前直觀的討論稍微具體一些。這將使我們更好地理解數(shù)字簽名方案金麸,并討論其安全屬性擎析。
我們注意到,generateKeys和sign可以是隨機(jī)算法挥下。事實(shí)上揍魂,generateeys最好被隨機(jī)分配,因?yàn)樗鼞?yīng)該為不同的人生成不同的鑰匙棚瘟。另一方面现斋,驗(yàn)證將永遠(yuǎn)是確定性的。
現(xiàn)在讓我們更詳細(xì)地研究我們要求的數(shù)字簽名方案的兩個(gè)屬性偎蘸。第一個(gè)屬性是直接的——有效的簽名必須驗(yàn)證庄蹋。如果我使用密鑰sk簽名一個(gè)消息,某人稍后嘗試使用我的公鑰pk驗(yàn)證該簽名迷雪,該簽名必須正確驗(yàn)證限书。這個(gè)屬性是簽名有用的基本要求。
不可偽造性章咧。第二個(gè)要求是偽造的簽名在計(jì)算上是不可行的蔗包。也就是說,一個(gè)知道你的公鑰并在其他信息上看到你簽名的對(duì)手不能在沒有看到你簽名的消息上偽造你的簽名慧邮。這種不可偽造性的屬性通常是以我們與對(duì)手一起玩游戲的形式來展現(xiàn)的调限。在加密安全性證明中,使用游戲是很常見的误澳。
在不可偽造的游戲中耻矮,有一個(gè)對(duì)手聲稱他可以偽造簽名,還有一個(gè)挑戰(zhàn)者會(huì)測(cè)試這個(gè)聲明忆谓。我們首先做的是使用generateKeys來生成一個(gè)秘密簽名密鑰和一個(gè)相應(yīng)的公開驗(yàn)證密鑰裆装。我們給挑戰(zhàn)者提供秘鑰,我們把公鑰提供給挑戰(zhàn)者和對(duì)手。所以對(duì)手只知道公開的信息哨免,他的使命是試圖偽造信息茎活。挑戰(zhàn)者知道密鑰,所以他可以簽名琢唾。
直觀地载荔,這個(gè)游戲的設(shè)置符合現(xiàn)實(shí)世界的條件。現(xiàn)實(shí)生活中的攻擊者很可能會(huì)看到他們的受害者在許多不同文件上的有效簽名采桃。也許攻擊者甚至可以操縱受害者簽署無害的文件懒熙,如果這對(duì)攻擊者有用。
為了在我們的游戲中建模普办,我們將允許攻擊者在他選擇的一些文檔上獲得簽名工扎,只要他想要,只要猜測(cè)的數(shù)量是合理的衔蹲。為了直觀地了解我們所指的合理猜測(cè)數(shù)肢娘,我們將允許攻擊者嘗試100萬次猜測(cè),而不是2的80次方次猜測(cè)舆驶。(在漸近的術(shù)語中蔬浙,我們?cè)试S攻擊者嘗試一些密鑰大小的多項(xiàng)式的函數(shù)的猜測(cè),但沒有更多(例如贞远,攻擊者無法以指數(shù)方式嘗試許多猜測(cè))畴博。)
一旦攻擊者確信他已經(jīng)看到足夠的簽名,那么攻擊者會(huì)選擇一些消息蓝仲,M俱病,他們將嘗試偽造一個(gè)簽名。對(duì)M的唯一限制是它必須是攻擊者以前沒有看到簽名的消息(因?yàn)楣粽唢@然可以發(fā)回他被給予的簽名8そ帷)亮隙。挑戰(zhàn)者運(yùn)行驗(yàn)證算法,以確定攻擊者生成的簽名是否是公共驗(yàn)證密鑰下的M上的有效簽名垢夹。 如果成功驗(yàn)證溢吻,攻擊者將贏得比賽。
圖1.9不可偽造的游戲對(duì)手和挑戰(zhàn)者玩不可偽造的游戲果元。 如果攻擊者能夠在他以前沒有看到的消息上成功輸出一個(gè)簽名促王,他就勝出了。如果他不能而晒,挑戰(zhàn)者勝利蝇狼,則數(shù)字簽名計(jì)劃是不可偽造的。
我們認(rèn)為倡怎,當(dāng)且僅當(dāng)對(duì)手無論對(duì)手使用什么算法時(shí)迅耘,簽名方案都是不可偽造的贱枣,他成功偽造信息的機(jī)會(huì)非常小——這么小,以至于我們可以假定它在實(shí)踐中永遠(yuǎn)不會(huì)發(fā)生颤专。
實(shí)際問題纽哥。有一些實(shí)際的事情,我們需要做的是將算法思想變成可以在實(shí)踐中實(shí)現(xiàn)的數(shù)字簽名機(jī)制栖秕。例如春塌,許多簽名算法是隨機(jī)的(特別是比特幣中使用的),因此我們需要一個(gè)很好的隨機(jī)源累魔。這個(gè)真正的重要性不能低估,因?yàn)椴缓玫碾S機(jī)性將使您的否則安全的算法不安全够滑。
另一個(gè)實(shí)際的問題是消息大小垦写。實(shí)際上,您可以簽署的郵件大小有一個(gè)限制彰触,因?yàn)閷?shí)際的方案將在有限長(zhǎng)度的位串上運(yùn)行梯投。有一個(gè)簡(jiǎn)單的方法來解決這個(gè)限制:簽名消息的哈希,而不是消息本身况毅。如果我們使用具有256位輸出的加密哈希函數(shù)分蓖,那么只要我們的簽名方案可以簽署256位消息,我們就可以有效地簽名任何長(zhǎng)度的消息尔许。如前所述么鹤,由于哈希函數(shù)具有抗沖突性,所以以這種方式將消息的哈希作為消息摘要是安全的味廊。
稍后我們將使用的另一個(gè)技巧是你可以簽署哈希指針蒸甜。如果您簽署了一個(gè)哈希指針,那么簽名將覆蓋或保護(hù)整個(gè)結(jié)構(gòu)——而不僅僅是哈希指針本身余佛,而是哈希指針鏈所指向的一切柠新。例如,如果你要在區(qū)塊鏈結(jié)尾簽署哈希指針辉巡,則結(jié)果是你將有效地對(duì)該整個(gè)塊鏈進(jìn)行數(shù)字簽名恨憎。
ECDSA。現(xiàn)在讓我們進(jìn)入堅(jiān)果和螺栓郊楣。比特幣使用一種稱為橢圓曲線數(shù)字簽名算法(ECDSA)的特定數(shù)字簽名方案憔恳。ECDSA是美國(guó)政府標(biāo)準(zhǔn),更新了適用于使用橢圓曲線的早期DSA算法净蚤。這些算法多年來已經(jīng)得到了相當(dāng)多的加密分析喇嘱,并且通常被認(rèn)為是安全的。
更具體地說塞栅,比特幣在標(biāo)準(zhǔn)橢圓曲線“secp256k1”上使用了ECDSA者铜,該曲線被估計(jì)為128以提供128位的安全性(即腔丧,像執(zhí)行2個(gè)對(duì)稱密鑰加密操作(如調(diào)用哈希函數(shù))一樣難以打破此算法)。雖然這個(gè)曲線是一個(gè)已發(fā)布的標(biāo)準(zhǔn)作烟,但它很少在比特幣之外使用愉粤,其他使用ECDSA的應(yīng)用程序(如用于安全網(wǎng)頁瀏覽的TLS中的密鑰交換)通常使用更常見的“secp256r1”曲線。這只是Bitcoin的一個(gè)怪癖拿撩,因?yàn)镾atoshi在系統(tǒng)的早期規(guī)范中選中衣厘,現(xiàn)在很難改變。
我們不會(huì)詳細(xì)介紹ECDSA的工作原理压恒,因?yàn)樯婕暗揭恍?fù)雜的數(shù)學(xué)問題影暴,理解這本書并不必需了解它。如果你對(duì)細(xì)節(jié)感興趣探赫,請(qǐng)參閱本章末尾的進(jìn)一步閱讀部分型宙。但是,對(duì)于各種數(shù)量的大小有個(gè)了解伦吠,這可能是有用的:
Private key: 256bit
Public key, uncompressed: 512bit
Public key, compressed: 257bit
Message to be signed: 256bit
Signature:512bit
請(qǐng)注意妆兑,雖然ECDSA技術(shù)上只能在256位長(zhǎng)的時(shí)間內(nèi)簽署消息,但這并不是一個(gè)問題:消息在被簽名前總是散列毛仪,因此可有效地對(duì)任何大小的消息進(jìn)行有效的簽名搁嗓。
使用ECDSA,一個(gè)很好的隨機(jī)來源是至關(guān)重要的箱靴,因?yàn)橐粋€(gè)壞的隨機(jī)源可能會(huì)泄露你的鑰匙腺逛。直觀地說,如果您在生成密鑰時(shí)使用不良隨機(jī)衡怀,則生成的密鑰可能不會(huì)安全屉来。但是,ECDSA(對(duì)于那些熟悉DSA的人來說狈癞,這是DSA中的一個(gè)普遍現(xiàn)象茄靠,而不是橢圓曲線變體獨(dú)有的)的一個(gè)奇怪之處在于,即使你只在簽名時(shí)使用不良隨機(jī)蝶桶,使用完美的鑰匙慨绳,也會(huì)泄露您的私鑰。然后是游戲結(jié)束;如果你泄露你的私鑰真竖,對(duì)手可以偽造你的簽名脐雪。因此,我們需要特別小心在實(shí)踐中使用良好的隨機(jī)性恢共,使用不良隨機(jī)源是其他安全系統(tǒng)的常見缺陷战秋。
邊欄:加密貨幣和加密。 如果你一直在等待Bitcoin中使用哪種加密算法讨韭,抱歉讓你失望了脂信。如我們看到的癣蟋,Bitcoin沒有加密,因?yàn)闆]有什么需要加密的狰闪。加密只是現(xiàn)代加密技術(shù)成為可能的一套豐富的技術(shù)之一疯搅。他們中的許多,比如承諾方案埋泵,都會(huì)以某種方式隱藏信息幔欧,但他們與加密不同。
自此丽声,完成了我們對(duì)加密原語數(shù)字簽名的討論礁蔗。在下一節(jié)中,我們將討論數(shù)字簽名的一些應(yīng)用雁社,這將被用于構(gòu)建加密貨幣浴井。
1.4公鑰作為身份
我們來看看一個(gè)與數(shù)字簽名相伴的好招。這個(gè)想法是把一個(gè)公鑰歧胁,一個(gè)數(shù)字簽名方案中的公開驗(yàn)證密鑰之一滋饲,等同于系統(tǒng)中一個(gè)人或一個(gè)演員的身份厉碟。如果你看到一個(gè)帶有簽名的消息在一個(gè)公共密鑰PK下正確地驗(yàn)證喊巍,那么你可以想象成pk在說這則消息。你可以將一個(gè)公鑰看作一個(gè)演員箍鼓,或一個(gè)系統(tǒng)中可以通過簽署這些聲明來發(fā)表聲明的一個(gè)派對(duì)崭参。從這個(gè)角度來說,公鑰是一種身份款咖。為了讓某人為身份pk證明何暮,他們必須知道相應(yīng)的秘密密鑰sk。
將公鑰作為身份處理的結(jié)果是铐殃,您可以隨時(shí)創(chuàng)建一個(gè)新的身份——你只需創(chuàng)建一個(gè)新的密鑰對(duì)海洼,SK和PK,通過generatekeys運(yùn)行在我們的數(shù)字簽名方案富腊。pk是您可以使用的新公開身份坏逢,而sk是相應(yīng)的秘密密鑰,只有您知道赘被,并允許您代表身份pk發(fā)言是整。因?yàn)楣€很大,你可以使用pk的哈希作為你的身份民假。 如果你這樣做浮入,那么為了驗(yàn)證一個(gè)消息是否來自你的身份,我們必須檢查(1)該pk確實(shí)混編了你的身份羊异,(2)該消息在公鑰pk下驗(yàn)證事秀。
此外彤断,默認(rèn)情況下,你的公鑰基本上看起來是隨機(jī)的秽晚,沒有人能夠通過檢查pk(當(dāng)然瓦糟,一旦你開始使用這個(gè)身份進(jìn)行陳述,這些陳述可能會(huì)泄漏信息赴蝇,讓人們可以將pk連接到你的真實(shí)世界身份菩浙。我們將在稍后進(jìn)行詳細(xì)討論。)來發(fā)現(xiàn)你的真實(shí)世界身份句伶。 你可以產(chǎn)生一個(gè)看起來很隨機(jī)的新鮮身份劲蜻,看起來像人群中的臉,只有你可以控制考余。
分權(quán)身份管理先嬉。這給我們帶來了分權(quán)身份管理的想法。你可以為你自己注冊(cè)一個(gè)用戶楚堤,而不是搭建一個(gè)中央集權(quán)的機(jī)構(gòu)疫蔓,以便在這系統(tǒng)中注冊(cè)為用戶。你不需要發(fā)布用戶名身冬,也不需要通知某人你將要使用特定的名稱衅胀。如果你想要一個(gè)新的身份,你可以隨時(shí)生成一個(gè)酥筝,想要多少有多少滚躯。如果你喜歡被五個(gè)不同的名字所知,沒問題嘿歌!只要做五個(gè)身份掸掏。如果你想在某一段時(shí)間匿名,你可以創(chuàng)建一個(gè)新的身份宙帝,使用一段時(shí)間后把它丟棄丧凤。所有這些都可以通過分權(quán)身份管理來實(shí)現(xiàn),而事實(shí)上步脓,比特幣也是這樣做的愿待。這些身份在比特幣術(shù)語中被稱為地址。你會(huì)經(jīng)常在上下文中聽到Bitcoin和加密幣中使用術(shù)語地址沪编,這只是一個(gè)公鑰的哈希值呼盆。作為這種分權(quán)式身份管理計(jì)劃的一部分,這是一種憑空形成的身份蚁廓。
邊欄:如果沒有中央授權(quán)访圃,你可以產(chǎn)生一個(gè)身份的想法似乎是違反直覺的。畢竟相嵌,如果有人幸運(yùn)與你產(chǎn)生了相同的密鑰腿时,他們能竊取你的比特幣嗎况脆?
答案是,別人生成相同的256位密鑰的可能性太小了批糟,我們?cè)趯?shí)踐中就不用擔(dān)心了格了。我們所有的意圖和目的都保證這永遠(yuǎn)不會(huì)發(fā)生。
更普遍的是徽鼎,與初學(xué)者的直覺相比盛末,概率系統(tǒng)是難以理解且不可預(yù)知的,往往是相反的——統(tǒng)計(jì)理論允許我們精確量化我們感興趣的事件的機(jī)會(huì)否淤,并自信地?cái)嘌赃@種系統(tǒng)的行為悄但。
但有一個(gè)微妙之處:只有當(dāng)密鑰是隨機(jī)生成的時(shí)候,概率保證才是真的石抡。隨機(jī)性的產(chǎn)生通常是實(shí)際系統(tǒng)中薄弱的一個(gè)環(huán)節(jié)檐嚣。如果兩個(gè)用戶的計(jì)算機(jī)使用相同的隨機(jī)來源或者使用可預(yù)測(cè)的隨機(jī)性,則理論保證不再適用啰扛。所以在生成密鑰時(shí)要使用一個(gè)很好的隨機(jī)源嚎京,來確保實(shí)際的保證與理論上的匹配是至關(guān)重要的。
乍一看隐解,分權(quán)身份管理可能會(huì)導(dǎo)致很大的匿名性和隱私性鞍帝。畢竟,你可以自己創(chuàng)建一個(gè)隨機(jī)的身份厢漩,而不是告訴任何人你的真實(shí)身份膜眠。但這并不那么簡(jiǎn)單岩臣。隨著時(shí)間的推移溜嗜,你創(chuàng)建的身份會(huì)產(chǎn)生一系列陳述。人們看到這些陳述架谎,因此知道擁有這個(gè)身份的人做了一系列的行動(dòng)炸宵。他們可以開始連接點(diǎn),使用這一系列的動(dòng)作來推斷關(guān)于你真實(shí)身份的事情谷扣。一個(gè)觀察者可以隨著時(shí)間的推移將這些東西聯(lián)系在一起土全,并作出推論,導(dǎo)致他們得出結(jié)論会涎,如“哎裹匙,這個(gè)人的行為很像喬。也許這個(gè)人是喬末秃「乓常”
換句話說,在比特幣的世界你不需要明確地登記或揭示你的真實(shí)身份练慕,但你的行為模式本身可能就是識(shí)別惰匙。這是一個(gè)如比特幣一樣的加密貨幣的基本隱私問題技掏,實(shí)際上我們將把第6章整體付諸實(shí)踐它。
1.5簡(jiǎn)單的密碼學(xué)
現(xiàn)在我們從密碼學(xué)轉(zhuǎn)移到加密貨幣项鬼。吃我們的加密蔬菜將開始在這里付清哑梳,我們將逐漸看到這些片段如何合并在一起,為什么加密操作如哈希函數(shù)和數(shù)字簽名實(shí)際上是有用的绘盟。在本節(jié)中鸠真,我們將討論兩種非常簡(jiǎn)單的加密貨幣。當(dāng)然龄毡,這需要本書剩下的大部分內(nèi)容來詳細(xì)講解Bitcoin本身是如何運(yùn)作的含義弧哎。
GoofyCoin
第一個(gè)是GoofyCoin,它是關(guān)于我們可以想象的最簡(jiǎn)單的加密機(jī)制稚虎。GoofyCoin只有兩個(gè)規(guī)則撤嫩。第一個(gè)規(guī)則是,指定的實(shí)體蠢终、愚人序攘,都可以創(chuàng)造新的硬幣,只要他想要寻拂,這些新創(chuàng)造的硬幣都屬于他程奠。
為了創(chuàng)建一個(gè)硬幣,Goofy生成一個(gè)獨(dú)特的硬幣ID uniqueCoinID祭钉,他以前從未生成過瞄沙,并構(gòu)造了字符串“CreateCoin [uniqueCoinID]”。然后他用他的秘密簽名鑰匙計(jì)算這個(gè)字符串的數(shù)字簽名慌核。該字符串與Goofy的簽名一起距境,是一枚硬幣。任何人都可以驗(yàn)證包含Goofy有效簽名的CreateCoin語句的硬幣垮卓,因此它是有效的硬幣垫桂。
GoofyCoin的第二條規(guī)則是,擁有硬幣的人可以將其轉(zhuǎn)讓給其他人粟按。 轉(zhuǎn)移硬幣不僅僅是將硬幣的數(shù)據(jù)結(jié)構(gòu)發(fā)送給收件人——它是使用加密操作來完成的诬滩。
讓我們說,Goofy想把他創(chuàng)造的硬幣轉(zhuǎn)給Alice灭将。為了做到這一點(diǎn)疼鸟,他創(chuàng)建了一個(gè)新的聲明,說“付給Alice”庙曙,其中“這”是一個(gè)哈希指針空镜,引用了所討論的硬幣。正如我們先前所看到的那樣,身份確實(shí)只是公鑰姑裂,所以“Alice”是指Alice的公鑰馋袜。最后,Goofy簽署代表該聲明的字符串舶斧。由于Goofy是最初擁有該硬幣的人欣鳖,他必須簽署任何花費(fèi)硬幣的交易。一旦代表Goofy的這筆交易簽署的數(shù)據(jù)結(jié)構(gòu)存在茴厉,Alice就擁有這個(gè)硬幣泽台。她可以向任何人證明她擁有硬幣,因?yàn)樗梢杂肎oofy的有效簽名來提供數(shù)據(jù)結(jié)構(gòu)矾缓。此外怀酷,它指向由Goofy擁有的有效硬幣。 所以硬幣的有效性和所有權(quán)在系統(tǒng)中是不言而喻的嗜闻。
一旦Alice擁有硬幣蜕依,她可以輪流使用。為了做到這一點(diǎn)琉雳,她創(chuàng)造一個(gè)聲明样眠,說:“把這個(gè)硬幣付給Bob的公鑰”,其中“這”是一個(gè)哈希指針翠肘,指向由她擁有的硬幣檐束。當(dāng)然,Alice簽署了這聲明束倍。當(dāng)任何人提供這個(gè)硬幣時(shí)被丧,都可以驗(yàn)證Bob是業(yè)主。他們將跟隨哈希指針鏈回到硬幣的創(chuàng)建绪妹,并驗(yàn)證每一步甥桂,合法的所有者簽署一個(gè)聲明說“把這個(gè)硬幣付給[新主人]”。
圖1.10 GoofyCoin貨幣 這里展示的是一個(gè)硬幣(底層)喂急,花了兩次(中間和頂部)
總而言之格嘁,GoofyCoin的規(guī)則是:
·Goofy可以通過簡(jiǎn)單地簽署聲明來創(chuàng)建新的硬紙笛求,且他創(chuàng)造的新硬幣擁有唯一的硬幣ID
··擁有硬幣的人可以通過簽署一份聲明“將此硬幣兌換給X”(X指定為公鑰)的聲明將其傳遞給其他人員
·任何人都可以通過跟隨哈希指針鏈回到Goofy的創(chuàng)建,驗(yàn)證一路上所有的簽名,來證明硬幣的有效性
當(dāng)然怀挠,GoofyCoin有一個(gè)基本的安全問題琢蛤。讓我們說,Alice把她的硬幣交給了Bob蜂嗽,同時(shí)把簽名的聲明發(fā)送給Bob苗膝,但沒有告訴任何人。她可以創(chuàng)建另一個(gè)簽名的聲明植旧,向查克支付相同的硬幣辱揭。對(duì)于查克來說离唐,似乎是完美有效的交易,現(xiàn)在他是硬幣的所有者问窃。Bob和查克都有有效的索賠聲稱是這個(gè)硬幣的所有者亥鬓。這被稱為雙花攻擊——Alice花費(fèi)同一枚硬幣兩次。直觀地域庇,我們知道硬幣不應(yīng)該這樣工作嵌戈。
事實(shí)上,雙花攻擊是任何一個(gè)密碼學(xué)必須解決的關(guān)鍵問題之一听皿。GoofyCoin并沒有解決雙重支出攻擊熟呛,因此不安全。GoofyCoin是簡(jiǎn)單的尉姨,它的轉(zhuǎn)移機(jī)制實(shí)際上與比特幣非常類似庵朝,但是因?yàn)樗遣话踩模覀儾粫?huì)把它作為一個(gè)加密貨幣又厉。
ScroogeCoin
為了解決雙花問題偿短,我們將設(shè)計(jì)另一種加密貨幣,我們稱之為ScroogeCoin馋没。ScroogeCoin是由GoofyCoin構(gòu)建的昔逗,但在數(shù)據(jù)結(jié)構(gòu)方面卻有點(diǎn)復(fù)雜。
第一個(gè)關(guān)鍵想法是篷朵,一個(gè)稱為Scrooge的指定實(shí)體只發(fā)布一個(gè)包含所有發(fā)生過的歷史交易記錄的分類賬勾怒。附加屬性確保寫入此分類帳的任何數(shù)據(jù)將永遠(yuǎn)保留。如果分類帳是唯一的声旺,我們可以使用它來防止雙花問題笔链,通過要求所有交易在被接受之前都寫入分類帳。這樣腮猖,如果硬幣以前被發(fā)送到不同的所有者鉴扫,它將公開可見。
為了實(shí)現(xiàn)這個(gè)附加功能澈缺,Scrooge可以構(gòu)建一個(gè)區(qū)塊鏈(我們之前討論的數(shù)據(jù)結(jié)構(gòu))坪创,他將進(jìn)行數(shù)字簽名。它是一系列數(shù)據(jù)塊姐赡,每個(gè)數(shù)據(jù)塊都有一個(gè)交易(實(shí)際上莱预,作為優(yōu)化,我們真的把多個(gè)交易放在同一個(gè)區(qū)塊中项滑,像Bitcoin那樣)依沮。每一個(gè)區(qū)塊都有交易的ID、交易的內(nèi)容以及前一個(gè)區(qū)塊的哈希指針。Scrooge對(duì)最終的哈希指針進(jìn)行數(shù)字簽名危喉,該指針將綁定整個(gè)結(jié)構(gòu)中的所有數(shù)據(jù)宋渔,并將與該區(qū)塊鏈一起發(fā)布簽名。
圖1.11 ScroogeCoin區(qū)塊鏈
在ScroogeCoin中辜限,只計(jì)算在Scrooge簽署的區(qū)塊鏈中的交易傻谁。任何人都可以通過檢查Scrooge在其出現(xiàn)的區(qū)塊上的簽名來驗(yàn)證交易是否被Scrooge認(rèn)可。Scrooge確保他不支持一個(gè)試圖雙重支付一個(gè)已經(jīng)交易的硬幣的交易列粪。
為什么我們需要一個(gè)帶有哈希指針的區(qū)塊鏈审磁,除了每個(gè)區(qū)塊都有Scrooge的簽名?這確保了附加屬性岂座。如果Scrooge嘗試向歷史記錄添加或刪除交易态蒂,或更改現(xiàn)有交易,由于哈希指針费什,它將影響所有下面的區(qū)塊钾恢。只要有人正在監(jiān)控Scrooge發(fā)布的最新哈希指針,這個(gè)變化將是顯而易見的鸳址。在一個(gè)Scrooge單獨(dú)簽名的系統(tǒng)中瘩蚪,您必須跟蹤Scrooge發(fā)行的每個(gè)簽名。區(qū)塊鏈?zhǔn)沟萌魏蝺蓚€(gè)人都很容易驗(yàn)證他們是否觀察到與Scrooge簽署的完全相同的歷史交易記錄稿黍。
在ScroogeCoin中疹瘦,有兩種交易。第一種是CreateCoins巡球,就像操作者Goofy可以在GoofyCoin中做一個(gè)新的硬幣一樣言沐。在ScroogeCoin中,我們將擴(kuò)展語義酣栈,以允許在一個(gè)交易中創(chuàng)建多個(gè)硬幣险胰。
圖1.12 CreateCoins交易此CreateCoins交易創(chuàng)建多個(gè)硬幣。每個(gè)硬幣在交易中都有一個(gè)序列號(hào)矿筝。每枚硬幣也有價(jià)值;它值一定數(shù)量的ScroogeCoins起便。最后,每個(gè)硬幣都有一個(gè)收件人窖维,它是創(chuàng)建時(shí)獲得硬幣的公鑰榆综。所以CreateCoins創(chuàng)建一堆不同價(jià)值的新硬幣,并將它們分配給作為初始所有者的人陈辱。我們指的是CoinIDs的硬幣奖年。一個(gè)CoinID是一個(gè)交易中該交易ID和硬幣序列號(hào)的組合。
如果由Scrooge簽名沛贪,一筆CreateCoins交易總是有效的。我們不用擔(dān)心Scrooge什么時(shí)候有權(quán)創(chuàng)造硬幣或創(chuàng)造多少,就像我們沒有擔(dān)心在GoofyCoin中利赋,Goofy是如何被選為允許創(chuàng)建硬幣的實(shí)體水评。
第二種交易是PayCoins。它消耗一些硬幣媚送,也就是銷毀它們中燥,并創(chuàng)建相同總價(jià)值的新硬幣。新的硬幣可能屬于不同的人(公鑰)塘偎。這筆交易必須由所有付錢的人簽字疗涉。因此,如果你是這筆交易中將要使用該硬幣的所有者之一吟秩,那么你需要對(duì)這筆交易進(jìn)行數(shù)字簽名咱扣,以表明這枚硬幣真的很好用。
ScroogeCoin的規(guī)則說涵防,如果下面四件事情是真實(shí)的闹伪,PayCoins的交易則是有效的:
··消費(fèi)的硬幣是有效的,也就是說它們是在以前的交易中創(chuàng)建的壮池。
·消費(fèi)的硬幣在以前的交易中沒有被消耗掉偏瓤。也就是說這不是雙重支付。
·從這筆交易中出來的硬幣總價(jià)值等于流入的硬幣總價(jià)值椰憋。也就是說厅克,只有Scrooge可以創(chuàng)造新的價(jià)值。
·交易由所有消費(fèi)硬幣的所有者有效簽署橙依。
圖1.13一個(gè)PayCoins的交易
如果滿足所有這些條件已骇,則此PayCoins交易有效,Scrooge將會(huì)接受票编。他會(huì)將其寫入歷史褪储,附加到區(qū)塊鏈中,之后每個(gè)人都可以看到這個(gè)交易發(fā)生了慧域。只有在這一點(diǎn)上鲤竹,參與者可以接受交易實(shí)際發(fā)生了。直到它發(fā)布昔榴,即使前三個(gè)條件有效辛藻,它也可能被雙重支出交易搶占。
這個(gè)系統(tǒng)中的硬幣是不可變的——它們永遠(yuǎn)不會(huì)改變互订、細(xì)分或組合吱肌。每個(gè)硬幣在一次交易中創(chuàng)建一次,然后在某些其他交易中被消耗仰禽。但是氮墨,通過使用交易纺蛆,我們可以獲得與細(xì)分或組合硬幣相同的效果。例如规揪,為了細(xì)分硬幣桥氏,Alice創(chuàng)建一個(gè)新的交易來消耗那個(gè)硬幣,然后生產(chǎn)兩個(gè)相同總價(jià)值的新硬幣猛铅。這兩個(gè)新的硬幣可以分配給她字支。所以盡管硬幣在這個(gè)系統(tǒng)中是不可變的,但它具有那些不一成不變的硬幣系統(tǒng)的全部靈活性奸忽。
現(xiàn)在堕伪,我們來到ScroogeCoin的核心問題。ScroogeCoin將會(huì)以這種意義工作栗菜,人們可以看到哪些硬幣是有效的欠雌。它可以防止雙重支出,因?yàn)槊總€(gè)人都可以查看區(qū)塊鏈苛萎,并看到所有的交易都是有效的桨昙,且每個(gè)硬幣只消耗一次。但問題是Scrooge——他的影響力太大腌歉。他不能偽造交易蛙酪,因?yàn)樗荒軅卧靹e人的簽名。但他可以停止批準(zhǔn)一些用戶的交易翘盖,否認(rèn)他們的服務(wù)桂塞,使他們的硬幣不可用。如果Scrooge是貪婪的(正如他的同名漫畫暗示的)馍驯,他可以拒絕發(fā)布交易阁危,除非他們向他轉(zhuǎn)移了一些授權(quán)的交易費(fèi)用。當(dāng)然汰瘫,Scrooge也可以為自己創(chuàng)造盡可能多的新硬幣狂打。或者Scrooge可能會(huì)厭倦整個(gè)系統(tǒng)混弥,并全然停止更新區(qū)塊鏈趴乡。
這里的問題是集權(quán)。雖然Scrooge對(duì)這個(gè)系統(tǒng)很滿意蝗拿,但作為用戶晾捏,我們可能不會(huì)這樣做。雖然ScroogeCoin似乎是一個(gè)不切實(shí)際的建議哀托,但早期對(duì)密碼系統(tǒng)的研究假定惦辛,那里確實(shí)會(huì)有一些中央信任機(jī)構(gòu),通常是銀行仓手。畢竟胖齐,大多數(shù)真實(shí)世界貨幣確實(shí)有一個(gè)值得信賴的發(fā)行人(通常是政府造幣廠)玻淑,負(fù)責(zé)創(chuàng)建貨幣并確定哪些票據(jù)是有效的。然而市怎,有中央機(jī)關(guān)的加密貨幣在實(shí)踐中基本上沒有起飛岁忘。這有很多原因辛慰,但事后看來区匠,很難讓人們接受中央授權(quán)的加密機(jī)制。
因此帅腌,我們需要解決的中心技術(shù)挑戰(zhàn)是驰弄,為了改進(jìn)ScroogeCoin并創(chuàng)建一個(gè)可行的系統(tǒng):我們的系統(tǒng)可以不吝嗇嗎?也就是我們可以擺脫那個(gè)集中的數(shù)字吝嗇鬼嗎速客?我們可以在許多方面擁有像ScroogeCoin一樣運(yùn)行的加密機(jī)制戚篙,但沒有任何中央信任機(jī)構(gòu)嗎?
要做到這一點(diǎn)溺职,我們需要弄清楚所有用戶如何就一個(gè)已發(fā)布的塊鏈達(dá)成一致岔擂,因?yàn)檫@些交易的歷史已經(jīng)發(fā)生了。他們必須一致同意哪些交易是有效的浪耘,哪些交易是實(shí)際發(fā)生的乱灵。他們還需要能夠以分散的方式將ID分配給事物。最后七冲,新鑄造的硬幣需要以分散的方式(分布式)進(jìn)行控制痛倚。如果我們可以解決所有這些問題,那么我們可以建立一個(gè)像ScroogeCoin這樣的貨幣澜躺,但是沒有一個(gè)集權(quán)機(jī)構(gòu)(去中心化)蝉稳。事實(shí)上,這將是一個(gè)非常像比特幣的系統(tǒng)掘鄙。
進(jìn)一步閱讀
史提芬.列維的加密是一個(gè)非常有趣的耘戚,以非技術(shù)的眼光看現(xiàn)代密碼學(xué)的發(fā)展和背后的人:
Levy,Steven. C rypto: How the Code Rebels Beat the Government‐‐Saving Privacy in theDigital Age. Penguin, 2001.
列維.巴斯比魯.史提芬:代碼叛軍如何擊敗政府——在數(shù)字時(shí)代保護(hù)隱私.企鵝,2001
現(xiàn)代密碼學(xué)是一個(gè)相當(dāng)理論的領(lǐng)域操漠。密碼學(xué)家使用數(shù)學(xué)來定義原語收津、協(xié)議,以正式的方式獲得他們所期待的安全屬性颅夺,并基于廣泛接受的關(guān)于特定數(shù)學(xué)任務(wù)的計(jì)算硬度的假設(shè)來證明他們是安全的朋截。在本章中,我們使用直觀的語言來討論哈希函數(shù)和數(shù)字簽名吧黄。對(duì)于有興趣以更為數(shù)學(xué)的方式和更詳細(xì)的方式探索這些和其他加密概念的讀者部服,我們建議你參考:
Katz,Jonathan, and Yehuda Lindell. Introduction to Modern Cryptography, SecondEdition. CRC Press, 2014.
Katz,Jonathan和Yehuda Lindell拗慨。 現(xiàn)代密碼學(xué)導(dǎo)論廓八,第二版奉芦。CRC Press,2014剧蹂。
有關(guān)應(yīng)用密碼學(xué)的介紹声功,請(qǐng)參閱:
Ferguson,Niels, Bruce Schneier, and Tadayoshi Kohno. Cryptography engineering: designprinciples and practical applications.John Wiley & Sons,2012 .
弗格森,尼爾斯宠叼,布魯斯施奈爾和大田孝如先巴。密碼學(xué)工程:設(shè)計(jì)原理和實(shí)際應(yīng)用。約翰·威利父子冒冬,2012伸蚯。
使用SHA-2定義的NIST標(biāo)準(zhǔn)是獲取直觀加密標(biāo)準(zhǔn)的好方法。
FIPS PUB 180‐4,Secure HashStandards,Federal Information Processing Standards Publication. InformationTechnology Laboratory, National Institute of Standards and Technology,Gaithersburg, MD, 2008.
FIPS PUB 180-4简烤,安全哈希標(biāo)準(zhǔn)剂邮,聯(lián)邦信息處理標(biāo)準(zhǔn)出版物。 信息技術(shù)實(shí)驗(yàn)室横侦,國(guó)家標(biāo)準(zhǔn)與技術(shù)研究所挥萌,Gaithersburg,MD枉侧,2008引瀑。
最后,這是描述ECDSA簽名算法的標(biāo)準(zhǔn)化版本論文棵逊。
Johnson,Don, Alfred Menezes, and Scott Vanstone. The elliptic curve digital signaturealgorithm (ECDSA). International Journal of Information Security 1.1 (2001):36‐63.
約翰遜伤疙,唐,阿爾弗雷德·梅內(nèi)塞斯和斯科特·范斯通辆影。 橢圓曲線數(shù)字簽名算法(ECDSA)徒像。 國(guó)際信息安全雜志1.1(2001):36-63。