密码学技术导论篇
密碼學(xué)技術(shù)
- 前言
- 基礎(chǔ)術(shù)語
- 不要使用保密的密碼算法
- 任何密碼總有一天都會被破解
- 對稱密碼(共享秘鑰密碼)
- AES
- 總結(jié)
- 公鑰密碼 --- 用公鑰加密,私鑰解密
- 秘鑰配送問題
- 公鑰密碼
- 中間人攻擊
- 認(rèn)證
- 單向散列函數(shù)--- 消息的指紋
- 單向散列函數(shù)的實(shí)際應(yīng)用
- 單向散列函數(shù)無法解決的問題。
- 消息認(rèn)證碼
- 什么事消息認(rèn)證碼
- 消息認(rèn)證碼無法解決的問題
- 對第三方證明
- 防止否認(rèn)
- 密鑰
- 什么是密鑰
- 各種不同的密鑰
- 隨機(jī)數(shù) --- 不可預(yù)測的源泉
- 隨機(jī)數(shù)的性質(zhì)
- 隨機(jī)性
- 不可預(yù)測性
- 不可重現(xiàn)性
- 偽隨機(jī)數(shù)生成器
- 密碼技術(shù)與實(shí)現(xiàn)社會
- 密碼技術(shù)小結(jié)
- 6中基本的密碼技術(shù)
- 密碼技術(shù)與壓縮技術(shù)
- 比特幣
- 區(qū)塊鏈
- 挖礦
前言
上一篇博客:計(jì)算機(jī)科學(xué)領(lǐng)域中里程牌式的算法中提到了兩處密碼學(xué)的算法。其中的序言,讓我認(rèn)識到我的專業(yè)是計(jì)算機(jī)科學(xué)與技術(shù),那么是否要科普或者說要專攻的方向是否應(yīng)該是這些方面的內(nèi)容呢?(而不是軟件工程中所學(xué)的內(nèi)容,個(gè)人理解,不喜互噴)
借著這個(gè)想法,為了更好的理解密碼學(xué),因此就看了一篇名為《圖解密碼學(xué)技術(shù)》的一本書,書的確講的很好。在看完之后,就想寫下一篇讀書筆記,記錄自己看完之后的一個(gè)總結(jié),同時(shí)該書有四百多頁,也是為了哪些不想看這么厚的書,這需要看一篇博客即可。
基礎(chǔ)術(shù)語
以下圖片是受威脅的特性與應(yīng)對的密碼技術(shù)
不要使用保密的密碼算法
主要原因有以下兩點(diǎn):
密碼算法的秘密早晚會公諸于眾:①從歷史上看,密碼算法的秘密最終無一例外地都會被暴露出來。1999 年, DVD 的密碼算法 被破解。2007 年,NXP 的非接觸式 1C 卡 MIFARE Classic 的密碼算法被破解。這些算法最初都是 保密的,然而研究者可以通過逆向工程的手段對其進(jìn)行分析,并找到漏洞進(jìn)行破解。RSA 公司開 發(fā)的 RC4 密碼算法曾經(jīng)也是保密的,但最終還是有一位匿名人士開發(fā)并公開了與其等效的程序。
②一旦密碼算法的詳細(xì)信息被暴露,依靠對密碼算法本身進(jìn)行保密來確保機(jī)密性的密碼系統(tǒng) 也就土崩瓦解了。反之,那些公開的算法從一開始就沒有設(shè)想過要保密,因此算法的暴露絲毫 不會削弱它們的強(qiáng)度。
開發(fā)高強(qiáng)度的密碼算法是非常困難的。①現(xiàn)在世界上公開的被認(rèn)為強(qiáng)度較高的密碼算法,幾乎都是經(jīng)過密碼破譯者長期嘗試破解未 果而存活下來的。因此,如果認(rèn)為 “公司自己開發(fā)的密碼系統(tǒng)比那些公開的密碼系統(tǒng)更強(qiáng)”,那只能說是過于高估自己公司的能力了。
② 試圖通過對密碼算法本身進(jìn)行保密來確保安全性的行為,一般稱為隱蔽式安全性( securityby obscurity ), 這種行為是危險(xiǎn)且愚蠢的。
③ 反過來說,將密碼算法的詳細(xì)信息以及程序源代碼全部交給專業(yè)密碼破譯者,并且為其提供大量的明文和密文樣本,如果在這樣的情況下破澤一段新的密文依然需要花上相當(dāng)長的時(shí)間, 就說明這是高強(qiáng)度的密碼。
任何密碼總有一天都會被破解
無論使用任何密碼算法所生成的密文,只要將所有可能的密鑰全部嘗試一遍,就總有一天 可以破譯出來。因此,破譯密文所需要花費(fèi)的時(shí)間,與要保密的明文的價(jià)值之間的權(quán)衡就顯得 非常重要。
嚴(yán)格來說,絕對不會被破解的密碼算法是存在的,這就是一次性密碼本,但它并不是一種實(shí)現(xiàn)可用的算法。還有一種技術(shù)被認(rèn)為可能造就完美的密碼技術(shù),那就是量子密碼
對稱密碼(共享秘鑰密碼)
AES
AES是取代前任標(biāo)準(zhǔn)(DES)而成為新標(biāo)準(zhǔn)的一種對稱密碼算法。全世界的企業(yè)和密碼學(xué)家提交了多個(gè)對稱密碼算法作為AES的候選,最終在2000年從這些候選算法中選出了一種名為“Rijndael”的對稱密碼算法,并將其確定為了AES。
總結(jié)
公鑰密碼 — 用公鑰加密,私鑰解密
談?wù)勍稁偶奈锕瘛J紫?#xff0c;我們將物品放入寄物柜中。然后,投入硬幣并拔出鑰匙,就可以將寄物柜關(guān)閉了。關(guān)閉后的寄物柜,沒有鑰匙是無法打開的。也就是說,只要有硬幣,任何人都可以關(guān)閉寄物柜,但寄物柜一旦關(guān)閉,再怎么投幣也無法打開。打開寄物柜需要使用鑰匙,而不是硬幣了。
這里,硬幣是關(guān)閉寄物柜的秘鑰(相當(dāng)于公鑰,任何人都可以知道),而鑰匙則是打開寄物柜的秘鑰(私鑰)。
秘鑰配送問題
首先想到的方法有如下幾種:
公鑰密碼
公鑰密碼中,秘鑰分為加密秘鑰和解密秘鑰兩種。發(fā)送者用機(jī)密秘鑰對消息進(jìn)行加密,接收者用解密秘鑰對密文進(jìn)行解密。該機(jī)制下:
①發(fā)送者只需要加密秘鑰。
②接受者只需要解密秘鑰。
③解密秘鑰不可以被竊聽者獲取。
④加密秘鑰被竊聽獲取也是沒有問題的。
也就是說,解密秘鑰從一開始就是有接受者自己保管的,因此只需要加密秘鑰發(fā)給發(fā)送者就可以解決秘鑰配送問題了,因?yàn)檫@根本就不需要配送解密秘鑰。
大概機(jī)制(RSA)可以參考這篇博客:計(jì)算機(jī)科學(xué)領(lǐng)域中里程牌式的算法](https://blog.csdn.net/qq_39838607/article/details/128757526)中的數(shù)字簽名部分,數(shù)字簽名與該算法都是RSA,只不過不一樣的是數(shù)字簽名是反過來使用了,也就是用私鑰加密,用公鑰解密。
中間人攻擊
所謂中間人攻擊,就是主動攻擊者 Mallory 混人發(fā)送者和接收者的中間,對發(fā)送者偽裝成 接收者,對接收者偽裝成發(fā)送者的攻擊方式,在這里,Mallory就是 “中間人”
如圖
現(xiàn)在,發(fā)送者Alice準(zhǔn)備向接收者Bob發(fā)送一封郵件,為了解決密鑰配送問 題,他們使用了公鑰密碼。Mallory 位于通信路徑中,我們假設(shè)他能夠任意竊聽或篡改郵件的內(nèi) 容,也可以攔截郵件使對方無法接收到。
“ To Bob : 請把你的公鑰發(fā)給我 D From Alice”
“ To Alice: 這是我的公鑰。From Bob”
起來,他稍 會用到Bob的公鑰。
“ To Alice: 這是我的公鑰。From Bob”(其實(shí)是 Mallory )
“ To Bob: 我愛你D From Alice”
但是, Alice 所持有的并非 Bob 的公鑰而是 Mallory 的公鑰,因此 Alice 是用 Mallory 的 公鑰對郵件進(jìn)行加密的。
Mallory 能夠?qū)ζ溥M(jìn)行解密,于是 Mallory 就看到了 Alice 發(fā)給 Bob 的情書。
“ To Bob: 我討厭你。From Alice”(其實(shí)是 Mallory ) 然后,他用4中保存下來的 Bob 的公鑰對這封假郵件進(jìn)行加密,并發(fā)送給 Bob。
“ To Bob : 我討厭你。From Alice” 他傷心極了。
上述過程可以重復(fù)多次,Bob向Alice發(fā)送加密郵件時(shí)也可能收到同樣的攻擊,因此Bob即便要發(fā)送郵件給Alice以詢問她真正的想法,也能被修改。
這種攻擊不僅針對RSA,而是可以針對任何公鑰密碼。在這個(gè)過程中,公鑰密碼并沒有被 破譯,所有的密碼算法也都正常工作并確保了機(jī)密性。然而,所謂的機(jī)密性并非在 Alice 和 Bob 之間,而是在 Alice 和 Mallory 之間,以及 Mallory 和 Bob 之間成立的。僅靠公鑰密碼本身,是無法抵御中間人攻擊的。我們還需要一種手段來確認(rèn)所收到的公鑰是否真的屬于Bob,這種手段被稱為認(rèn)證。
認(rèn)證
單向散列函數(shù)— 消息的指紋
單向散列函數(shù)有一個(gè)輸入和輸出,其中輸入消息稱為消息,輸出值稱為散列值。單向散列函數(shù)可以根據(jù)消息的內(nèi)容計(jì)算出散列值,而散列值就可以被用來檢驗(yàn)消息的完整性。
同時(shí),散列值的長度和消息的長度無關(guān)。單向散列函數(shù)總是計(jì)算出固定長度的散列值。因此,散列值很容易處理和使用。
單向散列值的性質(zhì)如下
單向散列函數(shù)的實(shí)際應(yīng)用
PBE 的原理是將口令和鹽( salt, 通過偽隨機(jī)數(shù)生成器產(chǎn)生的隨機(jī)值 )混合后計(jì)算其散列 值,然后將這個(gè)散列值用作加密的密鑰。通過這樣的方法能夠防御針對口令的字典攻擊。
數(shù)字簽名是現(xiàn)實(shí)社會中的簽名和蓋章這樣的行為在數(shù)字世界中的實(shí)現(xiàn)。數(shù)字簽名的處理過 程非常耗時(shí),因此一般不會對整個(gè)消息內(nèi)容直接施加數(shù)字簽名,而是先通過單向散列函數(shù)計(jì)算 出消息的散列值,然后再對這個(gè)散列值施加數(shù)字簽名。
密碼技術(shù)中所使用的隨機(jī)數(shù)需要具備 “事實(shí)上不可能根據(jù)過去的隨機(jī)數(shù)列預(yù)測未來的隨機(jī) | 數(shù)列” 這樣的性質(zhì)。為了保證不可預(yù)測性,可以利用單向散列函數(shù)的單向性。
單向散列函數(shù)無法解決的問題。
數(shù)字簽名的相關(guān)內(nèi)容,在我這篇博客中一致指向的博客中提到了。因此下邊主要提到的是消息認(rèn)證碼技術(shù)。
消息認(rèn)證碼
什么事消息認(rèn)證碼
消息認(rèn)證碼的使用步驟如下:
①發(fā)送者與接受者事先共享秘鑰。(使用的方法如上述談到的,可以是公鑰密碼算法等)
②發(fā)送者根據(jù)消息計(jì)算MAC值(使用共享秘鑰)
③發(fā)送者將消息和MAC值發(fā)送給接受者。
④接受者根據(jù)收到的消息計(jì)算MAC值(使用共享秘鑰)
⑤接受者將自己計(jì)算的MAC值與從發(fā)送者的MAC值對比。
⑥如果兩個(gè)MAC值一致,則接受者可以斷定確實(shí)是發(fā)送者原始的消息(認(rèn)證成功);如果不一致,則就是認(rèn)證失敗。
消息認(rèn)證碼無法解決的問題
??假設(shè)發(fā)送者 Alice 要向接收者 Bob 發(fā)送消息,如果使用了消息認(rèn)證碼,接收者 Bob 就能夠 斷定自己收到的消息與發(fā)送者 Alice 所發(fā)出的消息是一致的,這是因?yàn)橄⒅械?MAC 值只有用 Al1Ce 和 Bob 之間共享的密鑰才能夠計(jì)算出來,即便主動攻擊者 Mallory 篡改消息,或者偽裝成 Alice 發(fā)送消息,Bob 也能夠識別出消息的篡改和偽裝。
??但是,消息認(rèn)證碼也不能解決所有的問題,例如 “對第三方證明” 和 “防止否認(rèn)”,這兩個(gè) 問題就無法通過消息認(rèn)證碼來解決。下面我們來逐一解釋一下。
對第三方證明
??假設(shè) Bob 在接收了來自 Alice 的消息之后,想要向第三方驗(yàn)證者 Victor 證明這條消息的確 是 Alice 發(fā)送的,但是用消息認(rèn)證碼無法進(jìn)行這樣的證明,這是為什么呢? ?’ ’
??首先,Victor 要校驗(yàn) MAC 值,就需要知道 Alice 和 Bob 之間共享的密鑰。
??假設(shè) Bob 相信 Victor,同意將密鑰告訴 Victor, 即便如此,Victor 也無法判斷這條消息是由 Alice 發(fā)送的,因?yàn)?Victor 可以認(rèn)為:“即使 MAC 值是正確的,發(fā)送這條消息的人也不一定是 Alice, 還有可能是 Bob。”
??能夠計(jì)算出正確MAC值的人只有Alice和Bob, 在他們兩個(gè)人之間進(jìn)行通信時(shí),可以斷定 是對方計(jì)算了 MAC 值,這是因?yàn)楣蚕磉@個(gè)密鑰的雙方之中,有一方就是自己。然而,對于第
??三方Victor, Alice或Bob卻無法證明是對方計(jì)算了MAC值,而不是自己。 使用第 9 章中將要介紹的數(shù)字簽名就可以實(shí)現(xiàn)對第三方的證明。
防止否認(rèn)
??假設(shè) Bob 收到了包含 MAC 值的消息,這個(gè) MAC 值是用 Alice 和 Bob 共享的密鑰計(jì)算出來 的,因此 Bob 能夠判斷這條消息的確來自 Alice。
??但是,上面我們講過,Bob 無法向驗(yàn)證者 Victor 證明這一點(diǎn),也就是說,發(fā)送者 Alice 可以 向Victor聲稱:“我沒有向Bob發(fā)送過這條消息。” 這樣的行為就稱為否認(rèn)(repudiation)。
??Alice 可以說 “這條消息是 Bob 自己編的吧” “說不定 Bob 的密鑰被主動攻擊者 Mallory 給 盜取了,我的密鑰可是妥善保管著呢” 等。說白了,就是 Alice 和 Bob 吵起來了。
??即便 Bob 拿 MAC 值來舉證,Victor 也無法判斷 Alice 和 Bob 誰的主張才是正確的,也就是 說,用消息認(rèn)證碼無法防止否認(rèn)(nonrepudiation)。在這種情況下,就需要使用數(shù)字簽名就可以實(shí)現(xiàn)防止否認(rèn)了。
通俗來說,消息認(rèn)證碼確保的是消息被正確轉(zhuǎn)送了沒有;數(shù)字簽名則是確認(rèn)消息到底是誰寫的。
密鑰
什么是密鑰
各種不同的密鑰
隨機(jī)數(shù) — 不可預(yù)測的源泉
實(shí)際上,和對稱密碼、公鑰密碼、數(shù)字簽名等技術(shù)相比,生成隨機(jī)數(shù)的技術(shù)確實(shí)不是很引人注意,但是,隨機(jī)數(shù)在密碼技術(shù)中扮演者十分重要的角色。
隨機(jī)數(shù)的性質(zhì)
- 隨機(jī)性。不存在統(tǒng)計(jì)學(xué)的偏差,是完全雜亂的數(shù)列。
- 不可預(yù)測性。不能從過去的數(shù)列推測出下一個(gè)數(shù)列。
- 不可重現(xiàn)性。除非將數(shù)列本身保存下來,否則不能重現(xiàn)相同的數(shù)列。
上面三個(gè)性質(zhì)中,越往下就越嚴(yán)格。隨機(jī)數(shù)就是依據(jù)這三個(gè)性質(zhì)的有無來進(jìn)行分類的。如下圖
隨機(jī)性
?? 所謂隨機(jī)性,簡單來說就是看上去雜亂無章的性質(zhì)。我們可以用偽隨機(jī)數(shù)生成器大量生成0到9范圍內(nèi)的整數(shù),然后看一看所生成的數(shù)列。如果數(shù)列是像0、1、2、3、4、5.6、7、8、 9 、0 、 1 、2…這樣不斷循環(huán)的,那肯定不是雜亂無章的。或者乍一看是雜亂無章的,但實(shí)際上 在數(shù)列中 0 —次都沒有出現(xiàn),或者整個(gè)數(shù)列中有一半都是 6, 這樣的數(shù)列也不能算是雜亂無 章的。
??如果偽隨機(jī)數(shù)列中不存在統(tǒng)計(jì)學(xué)偏差,則我們可以認(rèn)為這個(gè)偽隨機(jī)數(shù)列是隨機(jī)的。判斷一 個(gè)偽隨機(jī)數(shù)列是否隨機(jī)的方法稱為隨機(jī)數(shù)測試,隨機(jī)數(shù)測試的方法有很多種。
??一般在電腦游戲中使用的隨機(jī)數(shù)只要具備隨機(jī)性就可以了。此外,在計(jì)算機(jī)模擬中使用的 隨機(jī)數(shù)雖然需要根據(jù)目的來進(jìn)行隨機(jī)數(shù)測試,但也是只要具備隨機(jī)性就可以了。然而,密碼技術(shù)中所使用的隨機(jī)數(shù),僅僅具備隨機(jī)性是不夠的。
??讓我們來回憶一下密碼技術(shù)中使用的隨機(jī)數(shù)需要具備怎樣的性質(zhì)。由’于隨機(jī)數(shù)會被用來生成密鑰,因此密鑰不能被攻擊者看穿。但是,雜亂無章并不代表不會被看穿。
不可預(yù)測性
??密碼中所使用的隨機(jī)數(shù)僅僅具備隨機(jī)性是不夠的,還需要具備避免被攻擊者看穿的不可預(yù) 測性。不可預(yù)測性在英語中叫作 unpredictability, 將這個(gè)單詞分解之后是這樣的:un( 否定 )-pre ( 之前 ) -diet ( 說 ) -ability ( 可能性 )。因此,unpredictability 就是一種 “不可能事先說中” 的性質(zhì),即不可預(yù)測性。
??所謂不可預(yù)測性,是指攻擊者在知道過去生成的偽隨機(jī)數(shù)列的前提下,依然無法預(yù)測出下—個(gè)生成出來的偽隨機(jī)數(shù)的性質(zhì)。其中,“在知道過去生成的偽隨機(jī)數(shù)列的前提下…” 是非常 重要的一點(diǎn)。
??現(xiàn)在我們假設(shè)攻擊者已經(jīng)知道偽隨機(jī)數(shù)生成器的算法。此外,正如攻擊者不知道密鑰一樣, 他也不知道偽隨機(jī)數(shù)的種子氣偽隨機(jī)數(shù)生成器的算法是公開的,但偽隨機(jī)數(shù)的種子是保密的。 在上述假設(shè)的前提下,即便攻擊者知道過去所生成的偽隨機(jī)數(shù)列,他也 預(yù)測出下一個(gè)生成 出來的偽隨機(jī)數(shù)— 這就是不可預(yù)測性。
??那么如何才能編寫出具備不可預(yù)測性的偽隨機(jī)數(shù)生成器呢?嗯,這是一個(gè)很有意思的問題。 其實(shí),不可預(yù)測性是通過使用其他的密碼技術(shù)來實(shí)現(xiàn)的。例如,可以通過單向散列函數(shù)的單向 性和密碼的機(jī)密性來保證偽隨機(jī)數(shù)生成器的不可預(yù)測性。
不可重現(xiàn)性
??所謂不可重現(xiàn)性,是指無法重現(xiàn)和某一隨機(jī)數(shù)列完全相同的數(shù)列的性質(zhì)。如果除了將隨機(jī) 數(shù)列本身保存下來以外,沒有其他方法能夠重現(xiàn)該數(shù)列,則我們就說該隨機(jī)數(shù)列具備不可重現(xiàn)性。
??僅靠軟件是無法生成出具備不可重現(xiàn)性的隨機(jī)數(shù)列的。軟件只能生成偽隨機(jī)數(shù)列,這是因 為運(yùn)行軟件的計(jì)算機(jī)本身僅具備有限的內(nèi)部狀態(tài)。而在內(nèi)部狀態(tài)相同的條件下,軟件必然只能 生成相同的數(shù),因此軟件所生成的數(shù)列在某個(gè)時(shí)刻一定會出現(xiàn)重復(fù)。首次出現(xiàn)重復(fù)之前的數(shù)列 長度稱為周期,對于軟件所生成的數(shù)列,其周期必定是有限的。當(dāng)然,這個(gè)周期可能會很長, 但總歸還是有限的。凡是具有周期的數(shù)列,都不具備不可重現(xiàn)性。
??要生成具備不可重現(xiàn)性的隨機(jī)數(shù)列,需要從不可重現(xiàn)的物理現(xiàn)象中獲取信息,比如周圍的溫度和聲音的變化、用戶移動的鼠標(biāo)的位置信息、鍵盤輸入的實(shí)踐間隔等,根據(jù)從這些硬件中所獲取的信息而生成的數(shù)列,一般可以認(rèn)為是具備不可重現(xiàn)性的隨機(jī)數(shù)列。
偽隨機(jī)數(shù)生成器
?隨機(jī)數(shù)可以通過硬件來生成,也可以通過軟件來生成。
?通過硬件生成的隨機(jī)數(shù)列,是根據(jù)傳感器收集的熱量、聲音的變化等事實(shí)上無法預(yù)測和重現(xiàn)的 自然現(xiàn)象信息來生成的。像這樣的硬件設(shè)備就稱為隨機(jī)數(shù)生成器(Random Number Generator, RNG )。
?而可以生成隨機(jī)數(shù)的軟件則稱為偽隨機(jī)數(shù)生成器(Pseudo Random Number Generator, PRNG)0 因?yàn)閮H靠軟件無法生成真隨機(jī)數(shù),因此要加上一個(gè) “偽” 字。
偽隨機(jī)數(shù)生成器的結(jié)構(gòu)如下,偽隨機(jī)數(shù)生成器具有“內(nèi)部狀態(tài)”,并根據(jù)外部輸入的“種子”來生成偽隨機(jī)數(shù)列。
偽隨機(jī)生成器的具體實(shí)現(xiàn)有主要有如下幾種
密碼技術(shù)與實(shí)現(xiàn)社會
密碼技術(shù)小結(jié)
6中基本的密碼技術(shù)
如下圖
密碼技術(shù)與壓縮技術(shù)
如下圖
??無論是對稱密碼還是公鑰密碼,密碼的作用都是確保機(jī)密性。由于確保較長的明文整體的 機(jī)密性很困難,因此我們用密碼將明文轉(zhuǎn)換成密文。這樣一來,我們就不必保護(hù)明文本身了。 相對地,我們則需要保護(hù)加密時(shí)所使用的密鑰。通過保護(hù)較短的密鑰來保護(hù)較長的明文,這樣 的做法可以稱為機(jī)密性的壓縮。
??單向散列函數(shù)是用于確認(rèn)完整性的。我們不必檢查較長的明文的完整性,只要檢查散列值 就能夠確認(rèn)完整性了。通過檢查較短的散列值來確認(rèn)較長的明文的完整性,這樣的做法可以稱為完整性的壓縮。
??消息認(rèn)證碼和數(shù)字簽名都是用于認(rèn)證的技術(shù) , 但我們并不是直接對較長的消息本身進(jìn)行認(rèn) 證, 而是通過將較長的消息與密鑰結(jié)合起來,生成較短的比特序列(認(rèn)證符號 ),再通過認(rèn)證符 號進(jìn)行認(rèn)證。在消息認(rèn)證碼中,MAC 值就是認(rèn)證符號;而在數(shù)字簽名中,簽名就是認(rèn)證符號。 通過較短的認(rèn)證符號來對較長的消息進(jìn)行認(rèn)證,這樣的做法可以稱為認(rèn)證的壓縮。
??那么偽隨機(jī)數(shù)生成器又是怎樣的呢?在偽隨機(jī)數(shù)生成器中,所生成數(shù)列的不可預(yù)測性是非常重要的。要大量生成具備不可預(yù)測性的隨機(jī)數(shù)列非常困難,于是我們通過將種子輸人偽隨機(jī)數(shù)生成器,生成具備不可預(yù)測性的偽隨機(jī)數(shù)列。也就是說,為了對偽隨機(jī)數(shù)列賦予不可預(yù)測性,我們使用了隨機(jī)數(shù)種子,這可以稱為不可預(yù)測性的壓縮。反過來說,偽隨機(jī)數(shù)生成器是將種子所具備的不可預(yù)測性進(jìn)行了擴(kuò)張。
這里的觀點(diǎn)很重要,因此我們從另一個(gè)角度來總結(jié)一下。
? 密鑰是機(jī)密性的精華
? 散列值是完整性的精華
? 認(rèn)證符號(MAC值和簽名)是認(rèn)證的精華
? 種子是不可預(yù)測性的精華
如下表
比特幣
?比特幣之 所以能夠成為一種流通的貨幣,完全依賴于全世界所有比特幣用戶組成的 P2P 網(wǎng)絡(luò) ( Peer to Peer Network)。也就是說,全世界所有比特幣用戶的計(jì)算機(jī)(node或者peer)共同保存、驗(yàn)證 和使用支撐比特幣體系的所有必要信息。
?與其說比特幣是一種貨幣,不如說比特幣是一種基于 P2P 網(wǎng)絡(luò)的支付結(jié)算系統(tǒng),這樣更易 于人們理解其本質(zhì)。比特幣用戶通過使用比特幣這一支付結(jié)算系統(tǒng)實(shí)現(xiàn)了價(jià)值的轉(zhuǎn)移,因此比 特幣看上去才具備了貨幣的特征。
區(qū)塊鏈
區(qū)塊鏈就是保存比特幣全部交易記錄的公共賬簿。全世界使用比特幣進(jìn)行的所有交易被記錄在一本公共賬簿中。顧名思義,區(qū)塊鏈即使將交易以區(qū)塊為單位組織起來的。
區(qū)塊的添加。比特幣的首付款是以交易為單位來進(jìn)行的,若干條交易會合并為一個(gè)區(qū)塊,并被添加到區(qū)塊鏈中。當(dāng)P2P網(wǎng)絡(luò)確認(rèn)區(qū)塊的添加后,相應(yīng)的交易也就成立了。如下圖:
1. 一個(gè)區(qū)塊是由若干條交易以及一個(gè)區(qū)塊頭所組成的,區(qū)塊頭中保存了 “上一個(gè)區(qū)塊的區(qū)塊 頭的散列值”。以圖 15-4 中的區(qū)塊 2 為例,其中區(qū)塊頭 2 中保存的散列值 H2 就是根據(jù)它前面的 區(qū)塊 1 的區(qū)塊頭 1 計(jì)算出來的。
2. 此外,區(qū)塊頭中還保存著 “本區(qū)塊所有交易的整體散列值” 例如,區(qū)塊頭2中的散列值 T2 就是根據(jù)區(qū)塊 2 中記錄的所有交易數(shù)據(jù)計(jì)算出的散列值。
3. 區(qū)塊頭中還保存著一個(gè)名為 nonce 的任意數(shù)值,以及時(shí)間戳(圖中省略 )等信息。
4. 假設(shè)區(qū)塊 2 中記錄的某一條交易中的 1 個(gè)比特被修改,那么散列值 T2 就需要重新計(jì)算,這 樣一來區(qū)塊頭2的內(nèi)容就會發(fā)生變化,因此區(qū)塊頭3中的散列值H3也需要重新計(jì)算。也就是 說,一旦對區(qū)塊鏈中的數(shù)據(jù)進(jìn)行任何改動,都需要重建所改動的區(qū)塊之后的所有區(qū)塊的數(shù)據(jù)。 由此可見,區(qū)塊頭中的兩個(gè)散列值有效增加了篡改區(qū)塊鏈數(shù)據(jù)的難度。
挖礦
交易成立的前提是一方必須擁有一定量的比特幣。那么比特幣是如何擁有的呢?
總結(jié)
- 上一篇: Java实现 蓝桥杯VIP 算法提高 扫
- 下一篇: 小程序转uni-app之通用方法