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