IT技術互動交流平臺

讀《圖解密碼技術》(一):密碼

作者:佚名  發布日期:2016-07-25 22:33:17

《圖解密碼技術》的目標讀者主要包括以下人群:
對密碼相關知識感興趣的人
希望理解公鑰密碼、數字簽名等密碼技術原理的人(我就屬于此類)
對信息安全感興趣的人
本書的結構分為三部分:
密碼:內容主要包括對密碼技術整體性的講解,以及歷史密碼、對稱密碼、公鑰密碼等保證機密性的密碼技術。
認證:內容包括單向散列函數、消息認證碼、數字簽名、證書等密碼技術。
密鑰、隨機數和應用技術:內容包括密鑰、隨機數相關的知識,以及PGP、SSL/TLS等應用技術。
本篇文章是關于第一部分的筆記。
密碼技術
密碼技術的目的很明確,就是為了解決信息安全問題。信息安全可分為四類特性:
機密性:為了防止信息被竊聽,對應的密碼技術有對稱密碼和公鑰密碼。
完整性:為了防止信息被篡改,對應的密碼技術有單向散列函數、消息認證碼、數字簽名。
認證:為了防止攻擊者偽裝成真正的發送者,對應的密碼技術有消息認證碼和數字簽名。
不可否認性:為了防止發送者事后否認自己沒有做過,對應的密碼技術為數字簽名。
信息安全和密碼技術之間的關系可以用下圖來表示:

接下來就簡單了解下這些密碼技術:
對稱密碼:也稱為共享密鑰密碼、私鑰密碼等,是指在加密和解密時使用同一密鑰的方式。
公鑰密碼:也稱為非對稱密碼,是指在加密和解密時使用不同密鑰的方式。對稱密碼和公鑰密碼可以保證數據的機密性。
單向散列函數:MD5、SHA-1,就是單向散列函數的例子,使用單向散列函數可以計算出散列值,散列值也稱為哈希值、密碼校驗和、指紋、消息摘要。使用單向散列函數可以保證數據的完整性。
消息認證碼:消息認證碼是一種確認完整性并進行認證的技術,英文名稱為message authentication code,簡稱為MAC。
數字簽名:數字簽名相當于現實世界中的蓋章、簽字的功能,使用數字簽名可以識別篡改和偽裝,還可以防止否認。
偽隨機數生成器:偽隨機數生成器并不直接解決信息安全問題,但它承擔了密鑰生成的重要職責。而密鑰的重要性就不用多說了。
一次性密碼本
曾經以為,理論上應該沒有任何密碼是無法破譯的。只要通過暴力破解法,無論任何密文總有一天都能夠被破譯。如今才知道,特例是存在的。這個特例就是一次性密碼本。即使用暴力破解法,就算破解到世界末日,也破譯不了一次性密碼本。
一次性密碼本其實非常簡單,它的原理就是:將明文與一串隨機的比特序列進行XOR運算,即異或運算。隨機的比特序列也稱為密鑰,密鑰的長度需與明文等長。而解密時,則將密文與密鑰再進行一次XOR運算,就可以得到明文了。
舉例,現在要對midnight這個字符串進行加密,對其進行ASCII編碼后得到一串比特序號:

以上為64比特,然后,隨機生成一個同樣64比特長的密鑰:

接著,將明文和密鑰進行XOR運算:

這樣,密文就產生了。而解密則是反向運算,即將密文與密鑰進行XOR運算:

一次性密碼本,就是這么簡單。那么,為什么它不可破譯呢?用暴力破解,嘗試所有可能的密鑰組合,總能得到midnight啊。問題就在于,即使解密出了midnight這個字符串,也無法判斷它是否是正確的明文。因為,所有64比特的排列組合都會出現,那么,解密出來的,除了midnight,還會有onenight、lastnight,以及aaaaaaaa、abcdefgh、ZZZZZZZZ等各種字符串,根本無法判斷哪個才是正確的明文。
雖然一次性密碼本無法被破譯,但它并不實用。最大的缺點就在于每一次通信都需要使用不同的密鑰,所以密鑰就無法重用了,“一次性”也正是由此而來。而且,每次密鑰的生成都必須是無重現性的真正隨機數,而不是偽隨機數。其他的,密鑰的配送、保存、同步也都是比較麻煩。所以,能夠使用一次性密碼本的,只有機密性重與一切,且可以花費大量財力和人力來生成并配送密鑰的場合。據說,大國之間的熱線就用了一次性密碼本,密鑰應該是通過特工直接送到對方手上的。
對稱密碼
對稱密碼使用相同的密鑰進行加密和解密,作為標準的對稱密碼主要有DES、三重DES和AES,它們都屬于分組密碼,即以分組為單位進行處理的密碼算法。DES和三重DES的分組長度都是64比特,而AES的分組長度可以為128比特、192比特和256比特中的一種。那么,如果要加密的明文比較長,就需要對密碼算法進行迭代,而迭代的方法就稱為分組密碼的模式。具體有哪些模式,后面再說。
DES
DES(Data Encryption Standard)是一種將64比特的明文加密成64比特的密文的對稱密碼算法,它的密鑰長度是56比特,即7個字節。DES的結構采用的是Feistel網絡。Feistel網絡中,加密的各個步驟稱為輪(round),整個加密過程就是進行若干次輪的循環。下圖是Feistel網絡中一輪的計算流程。DES是一種16輪循環的Feistel網絡。


一輪的具體計算步驟如下:
將輸入的數據等分為左右兩部分;
將輸入的右側直接發送到輸出的右側;
將輸入的右側發送到輪函數;
輪函數根據右側數據和子密鑰,計算出一串看上去是隨機的比特序列;
將上一步得到的比特序列與左側數據進行XOR運算,并將結果作為加密后的左側。
其中,子密鑰指的是本輪加密使用的密鑰。每一輪的子密鑰都是不同的。輪函數的作用則是根據“右側”和子密鑰生成對“左側”進行加密的比特序列,它是密碼系統的核心。
但是,這樣一來“右側”根據沒有被加密,因此需要用不同子密鑰對一輪的處理重復若干次,并在沒兩輪之間將左側和右側的數據對調。下圖展示了一個3輪的Feistel網絡:

那么,Feistel如何解密呢?很簡單,只要按照相同的順序來使用子密鑰就可以完成解密了。即將上圖中的子密鑰1換成了子密鑰3,而子密鑰3則換成子密鑰1,輸入的為密文,輸出的則為明文了。
無論是任何輪數、任何輪函數,Feistel網絡都可以用相同的結構實現加密和解密,且加密的結果必定能夠正確解密。因為Feistel網絡具有如此方便的特性,因此,被許多分組密碼算法使用,包括5個AES最終候選算法中的其中3個算法:MARS、RC6、Twofish。
三重DES
現在DES已經可以在短時間內被暴力破解,因此,其強度大不如前了。為了增強DES的強度,因此出現了三重DES(triple-DES),將DES重復3次所得到的一種密碼算法,通常縮寫為3DES,其機制如下圖所示:

明文經過三次DES處理才能變成最后的密文,而由于DES的密鑰長度為56比特,因此三重DES的密鑰長度則為56*3=128比特。另外,從圖中也可以發現,三重DES并不是進行3次DES加密,而是加密->解密->加密的過程。這是為了向下兼容,即使用DES加密的密文,也可以通過三重DES進行解密。
三重DES的解密過程和加密相反,是以密鑰3、密鑰2、密鑰1的順序執行解密->加密->解密的操作。即將上圖從明文到密文的箭頭反過來就是解密的流程了。
AES
AES(Advanced Encryption Standard)是取代其前任標準(DES)而成為新標準的一種對稱密碼算法。AES最終候選算法名單中,總共有5種算法,分為為:MARS、RC6、Rijndael、Serpent、Twofish。但最終被選定為AES的是Rijndael算法。
Rijndael使用的并不是Feistel網絡,而是SPN結構。Rijndael加密中的一輪如下圖所示,其分組為128比特,即16字節,加密過程經過4個步驟:SubBytes、ShiftRows、MixColumns、AddRoundKey。

SubBytes就是根據一張替換表(S-Box),將輸入中每個字節的值替換成另一個字節的值。ShiftRows即將SubBytes的輸出以字節為單位進行打亂出路,當然,這種打亂處理也是有規律的。MixColumns即對一個4字節的值進行比特運算,將其變成另外一個4字節的值。AddRoundKey就是將MixColumns的輸出與輪密鑰進行XOR處理。至此,一輪就結束了。實際上,在Rijndael中需要重復進行10~14輪計算。
而下圖則是一輪解密的流程圖,基本也是反向操作,加密時的SubBytes、ShiftRows、MixColumns,解密時分別為反向運算的InvSubBytes、InvShiftRows、InvMixColumns。這是因為Rijndael不像Feistel網絡一樣能夠用同一種結構實現加密和解密。

對于三種對稱密碼,DES因為已經很容易被暴力破解,因此不建議再使用;三重DES目前還被銀行等機構使用,但其處理速度不高,而且在安全性方面也逐漸顯現出了一些問題;AES作為最新標準,安全、快速,而且可以在各種平臺上工作,可以算是目前最佳的選擇。另外,其他AES最終候選算法也可以作為AES的備份。和Rijndael一樣,這些密碼算法也都經過了嚴格的測試,且沒有發現任何弱點。
分組模式
DES、AES都屬于分組密碼,它們只能加密固定長度的銘文。如果需要加密任意長度的明文,就需要對分組密碼進行迭代,而迭代方法就稱為分組密碼的“模式”。分組密碼有很多種模式,主要有:ECB、CBC、CFB、OFB、CTR。如果模式選擇不恰當,就無法保證機密性。
ECB模式
ECB全稱為Electronic CodeBook,電子密碼本模式,是最簡單的一種模式,它直接將明文分割成多個分組并逐個加密,如下圖,其中,加密和解密是指用分組密碼算法加密和解密,其中也省略了密鑰的描述。

當最后一個明文分組的內容小于分組長度時,需要用一些特定的數據進行填充。
這種模式的優點就是簡單、快速,加密和解密都支持并行計算。而缺點也比較明顯,因為每個明文分組都各自獨立地進行加密和解密,如果明文中存在多個相同的明文分組,則這些分組最終會被轉換為相同的密文分組。這樣一來,只要觀察一下密文,就可以知道明文中存在怎樣的重復組合,并可以以此為線索來破譯密碼。另外,攻擊者可以通過改變密文分組的順序,或刪除密文分組,或替換掉密文分組,就可以達到對明文操縱的目的,而無需破譯密碼。
CBC模式
CBC全稱為Cipher Block Channing,密文分組鏈接模式,是將前一個密文分組與當前明文分組的內容混合起來進行加密的。在CBC模式中,首先將明文分組與前一個密文分組進行XOR運算,然后再進行加密。加密第一個明文分組時,由于不存在“前一個密文分組”,因此需要事先準備一個長度為一個分組的比特序列來代替“前一個密文分組”,這個比特序列稱為初始化向量(initialization vector),通常縮寫為IV。一般來說,每次加密時都會隨機產生一個不同的比特序列來作為初始化向量。CBC模式的加解密流程如下圖:

 


CBC模式避免了ECB模式的弱點,明文的重復排列不會反映在密文中。這是推薦使用的一種模式。
CFB模式
CFB全稱為Cipher FeedBack,密文反饋模式,前一個密文分組會被送回到密碼算法的輸入端,如下圖:

CFB模式中,由密碼算法所生成的比特序列稱為密鑰流(key stream)。需要注意的是,CFB模式解密時,密碼算法執行的是加密操作,因為密鑰流是通過加密操作來生成的。
CFB模式無法抵御重放攻擊。因此,一般不建議使用了,推薦用CTR模式代替。
OFB模式
OFB全稱為Output-FeedBack,輸出反饋模式,密碼算法的輸出會反饋到密碼算法的輸入中,如下圖:

OFB模式有個缺陷,如果對密鑰流的一個分組進行加密后其結果碰巧和加密前是相同的,那么這一分組之后的密鑰流就會變成同一值的不斷反復。因此,一般不建議使用了,推薦用CTR模式代替。
CTR模式
CTR全稱為CountTeR,計數器模式,是一種通過逐次累加的計數器進行加密來生成密鑰流的流密碼,如下圖:

CTR模式中,每個分組對應一個逐次累加的計數器,并通過對計數器進行加密來生成密鑰流。計數器分為兩部分,前部分為nonce,這和初始化向量一樣,也是一個隨機比特序列;后部分為分組序號。
從圖中還可以知道,CTR模式對每個分組的處理是相對獨立的,這就意味著加密和解密都能夠實現并行計算。
CTR模式在錯誤和機密性方面都具有不錯的性質,也沒有上面提到的CFB和OFB的弱點,因此,現在都推薦使用CTR了。
關于初始化向量問題
前面講到的幾種模式中,CBC、CFB、OFB都用到了初始化向量IV,而CTR則使用了計數器,計數器的nonce部分和初始化向量IV是一樣的,只是叫法不同而已。關于初始化向量IV,是一個隨機比特序列,為了提高安全性,建議每次加密時都使用不同的值,這樣的話,即使有兩條相同的明文信息,加密后的密文也是不同的。但是,每一次發送端使用IV對明文加密后,接收端也需要使用同樣的IV才能夠解密,那么,發送端和接收端如何同步這個IV呢?關于這個問題,書中沒有提到。于是,只好自己尋找解決方案。
最簡單的方式可能就是,發送端每次發送信息時,將IV和加密后的密文一起發送給接收端。接收端收到信息后,就可以將收到的IV用于解密收到的密文了。而這種方式最明顯的缺陷就是IV直接暴露給攻擊者了,攻擊者就可以利用IV發起攻擊,比如使用CBC模式時,攻擊者將IV進行比特反轉,就可達到操縱明文的目的。攻擊者將IV中的任意比特進行反轉(1變0,0變1),則解密后的明文分組中相應的比特也會被反轉。
為了避免將IV直接暴露,那將IV進行加密后再發送呢?因為IV的長度和一個分組的長度是等長的,這就不需要考慮分組迭代的問題,即不需要考慮使用什么模式了,直接用密碼算法進行加密即可。加密后,攻擊者再想通過比特反轉IV來操縱明文就困難多了。
密鑰配送問題
對稱密碼中,由于加密和解密都使用同一個密鑰,因此就必須向接收者配送密鑰,這個問題就稱為密鑰配送問題。而解決密鑰配送問題的方法有幾種:
通過事先共享密鑰來解決
通過密鑰分配中心來解決
通過Diffie-Hellman密鑰交換來解決
通過公鑰密碼來解決
通過事先共享密鑰來解決
事先用安全的方式將密鑰交給對方,就稱為密鑰的事先共享。這是密鑰配送問題最簡單的一種解決方法,但有其局限性。公司內部開發的應用產品,客戶端和服務端都是自己開發的,事先共享密鑰就很簡單,服務端人員生成密鑰后直接給到客戶端的開發人員就可以了。但這種情況又會帶來其他問題,比如密鑰在客戶端如何才能安全的保存。一般,密鑰都是通過硬編碼或存為文件的形式保存在客戶端的,那么客戶端應用一旦被反編譯,就很容易竊取到密鑰了。
而如果是開放性平臺,像微博開放平臺、微信開放平臺等,要做到事先共享密鑰就很有難度了。開發者在開放平臺注冊的應用,其密鑰都是通過平臺的管理端給到開發者的,也就是通過了網絡,那就存在被竊聽的風險了。
通過密鑰分配中心來解決
當使用密鑰分配中心時,需要通信的雙方可以事先在密鑰分配中心注冊,然后密鑰分配中心給每個注冊方發送一個密鑰,不同注冊方的密鑰是不同的。那么,當某個發送端需要向某個接收端發送消息時,通信流程如下:
發送端向密鑰分配中心發起希望與接收端通信的請求;
密鑰分配中心隨機生成一個會話密鑰,該會話密鑰是供發送端和接收端在本次通信中使用的臨時密鑰,我們簡稱為TempKey;
密鑰分配中心查詢出發送端的密鑰,即發送端注冊時分配的密鑰,我們簡稱為SenderKey;
密鑰分配中心使用SenderKey對TempKey進行加密,加密后的密文稱為CipherTempKeyToSender,并發送給發送端;
密鑰分配中心用同樣的方式查詢出接收端的密鑰,簡稱為ReceiverKey;
密鑰分配中心再用ReceiverKey對TempKey進行加密,加密后的密文稱為CipherTempKeyToReceiver,并發送給接收端;
發送端對來自密鑰分配中心的CipherTempKeyToSender,用自己的密鑰即SenderKey進行解密,得到TempKey;
發送端將要發送給接收端的消息用TempKey進行加密,然后發送給接收端;
接收端對來自密鑰分配中心的CipherTempKeyToReceiver,用自己的密鑰即ReceiverKey進行解密,也得到TempKey;

 

接收端收到發送端的密文后,用TempKey對密文進行解密;
通信完畢,發送端和接收端都刪除TempKey。
這個通信過程還挺復雜的,總的來說就是,發送端和接收端通信時是使用密鑰分配中心分配的臨時密鑰進行加密和解密的。這種方案,密鑰分配中心的安全性就顯得非常重要了。如果攻擊者入侵了密鑰分配中心,盜取到所有密鑰,則后果很嚴重。
通過Diffie-Hellman密鑰交換來解決
在Diffie-Hellman密鑰交換中,進行加密通信的雙方需要交換一些信息,而這些信息即便被竊聽者竊聽到也沒有問題。根據所交換的信息,雙方可以各自生成相同的密鑰,而竊聽者卻無法生成相同的密鑰。
雖然這種方法叫“密鑰交換”,但實際上雙方并沒有真正交換密鑰,而是通過計算生成出了一個相同的共享密鑰。因此,這種方法也稱為Diffie-Hellman密鑰協商。支撐Diffie-Hellman密鑰交換算法的是有限群的離散對數問題的復雜度。
通過公鑰密碼來解決
公鑰密碼類似于投幣寄物柜。首先,將物品放入寄物柜中。然后,投入硬幣并拔出鑰匙,就可以將寄物柜關閉了。關閉后的寄物柜,沒有鑰匙是無法打開的。只要有硬幣,任何人都可以關閉寄物柜,但寄物柜一旦被關閉,再怎么投幣也無法打開。要打開寄物柜只能使用鑰匙,而不是硬幣。因此可以說,硬幣是關閉寄物柜的密鑰,而鑰匙是打開寄物柜的密鑰。
在公鑰密碼中,加密和解密的密鑰是不同的。只要擁有加密密鑰,任何人都可以進行加密,但沒有解密密鑰是無法解密的。接收者事先將加密密鑰發送給發送者,這個加密密鑰即便被竊聽者獲取也沒有問題。發送者使用加密密鑰對通信內容進行加密并發送給接收者,而只有擁有解密密鑰的人(即接收者本人)才能夠進行解密。這樣一來,就用不著將解密密鑰配送給接收者了,也就是說,不存在密鑰配送問題了。
公鑰密碼
公鑰密碼中,密鑰分為加密密鑰和解密密鑰兩種。加密密鑰一般是公開的,因此也被稱為公鑰(public key)。解密密鑰則絕對不能公開,因此也稱為私鑰(private key)。公鑰和私鑰是一一對應的,一對公鑰和私鑰統稱為密鑰對(key pair)。由公鑰加密的密文,只有配對的私鑰才能夠解密。
使用公鑰密碼通信時,流程如下:

那么,密鑰對是如何生成的呢?為什么用公鑰加密的密文能用私鑰解密呢?要理解公鑰密碼的原理,需要先理解一些數學上的問題,mod運算是基礎。
公鑰密碼是基于數學上困難的問題來保證機密性的,比如利用質因數分解的困難度、mod運算下求離散對數的困難度、mod運算下求平方根的困難度,等等。現在使用最廣泛的公鑰密碼算法RSA就是利用了大整數質因數分解問題的困難度。
數學原理
要理解RSA算法的原理,就要先理解一些mod運算方面的知識。mod運算,其實就是“除法求余數的運算”,比如:
27 mod 12 = 3 表示27除以12的余數等于3
加法和乘法都非常簡單,比如:
(6 + 7) mod 12 = 13 mod 12 = 1
7 * 7 mod 12 = 49 mod 12 = 1
減法和除法則可以看成加法和乘法的逆運算,比如:
(7 + N) mod 12 = 0 7加上幾除以12的余數為0?
7 * M mode 12 = 1 7乘以幾除以12的余數為1?
這里,N 和 M 都要求大于等于 0 小于 12。N 還是很容易算出來的,答案是5。而 M 一下子就比較難算出來,可以用暴力破解把0~11都代入 M 計算一下結果,最終可以得到 M = 7。接著,看另一個算式:
N * M mod 12 = 1
如果沒有 mod 12,那 N 和 M 就是互為倒數。此處的話,我們還要加上“在以12為模的世界中”這個條件。在一般的算術中,互為倒數可以寫成:
N * 1/N = 1
那么,在以12為模的世界中,在0到11的數字中,是不是每一個數都存在相應的倒數呢?實際上,mod運算中“某個數是否存在倒數”這個問題,與RSA中“一個公鑰是否存在相對應的私鑰”這個問題是直接相關的。下表列出了結果:

存在倒數的只有1、5、7、11,這些數有怎樣的性質呢?其實,在 mod 12 的世界中,存在倒數的數,它們和12之間的最大公約數都是1,也可以說是和12互質的數。那么,如果是在 mod 14 的世界中,存在倒數的則有1、3、5、9、11、13。
接著,看看乘方的mod運算又是怎樣的。比如,現在要求 7^4 mod 12,最笨的方法就是將7^4直接算出結果,然后除以12求余。而快速的計算方法則是在計算的中間步驟求mod,如下:
7^4 mod 12 = 7*7*7*7 mod 12 = ((7*7 mod 12)(7*7 mod 12)) mod 12 = ((49 mod 12)(49 mod 12)) mod 12 = 1*1 mod 12 = 1
在中間步驟求mod,可以避免計算大整數的乘積。這種在計算過程中求mod來計算乘方的方法,也是RSA的加密和解密算法中所使用的方法。
接著,再看看對數,即乘方的逆運算。mod運算中的對數稱為離散對數,比如:
7^N mod 13 = 8
這里N應該等于幾呢?像下面這樣依次嘗試一遍,可以得到 N = 9:

當數字很大時,求離散對數就會非常困難,而且非常耗時。到現在也還沒有發現能夠快速求出離散對數的算法。也因此,有很多公鑰算法都運用了離散對數。
RSA
RSA是現在使用最廣泛的公鑰密碼算法,但RSA不只用于公鑰密碼,也用于數字簽名。關于數字簽名下一篇文章再講。
在RSA中,明文、密鑰和密文都是數字。RSA的加密過程可以用下列公式來表達,其中,Plaintext 指明文,Cipher 指密文:
Cipher = Plaintext^E mod N (RSA加密)
RSA的密文是對明文的數字的 E 次方求 mod N 的結果。換句話說,就是將明文和自己做 E 次乘法,然后將其結果除以 N 求余數,這個余數就是密文。因此,只要知道 E 和 N 這兩個數,任何人都可以完成加密的運算。所以說,E 和 N 是RSA加密的密鑰,也就是說,E 和 N 的組合就是密鑰。另外,E 是加密(Encryption)的首字母,N 是數字(Number)的首字母。

 

RSA的解密和加密一樣簡單,可以用下面的公式來表達,其中,Plaintext 指明文,Cipher 指密文:
Plaintext = Cipher^D mod N (RSA解密)
對表示密文的數字的 D 次方求 mod N 就可以得到明文。換句話說,將密文和自己做 D 次乘法,再對其結果除以 N 求余數,就可以得到明文。這里的數字 N 和加密時的 N 是相同的。D 和 N 組合起來就是RSA的解密密鑰,因此,D 和 N 的組合就是私鑰。另外,D 是解密(Decryption)的首字母。
整理一下,RSA的加密和解密如下圖:

由于 E 和 N 是公鑰,D 和 N 是私鑰,因此求 E、D 和 N 這三個數就是生成密鑰對。密鑰對的生成步驟如下:
1. 求N:N = p * q
其中,p、q 是需要事先準備的兩個很大的質數。p 和 q 太小的話,密碼會變得容易破譯,但太大的話計算時間又會變得很長。一般來說,p 和 q 的長度都是512比特以上,N 的長度為1024以上。
2. 求L:L = lcm(p-1, q-1)
L 是僅在生成密鑰對的過程中使用的數,它是 p-1 和 q-1 的最小公倍數。
3. 求E:1
公鑰密碼的問題
公鑰密碼雖然可以避免密鑰配送問題,但也存在兩個很大的問題:
1. 公鑰密碼的處理速度遠遠低于對稱密碼;
2. 公鑰密碼難以抵御中間人攻擊。
如果用公鑰密碼去處理很長的消息,那么,公鑰密碼速度慢的缺點就會顯露無疑。所以,一般,不會用公鑰密碼直接處理消息。而是和對稱密碼相結合,采用混合密碼系統。關于混合密碼系統,下面再說。
對于第二個問題,是因為公鑰是公開的,任何人都可以獲取,也包括攻擊者。所謂中間人攻擊,就是攻擊者混入發送者和接收者中間,對發送者偽裝成接收者,對接收者偽裝成發送者的攻擊方式。如下圖所示:

在這種情況下,就沒有機密性可言了,因為發送者用來加密的其實是攻擊者的公鑰,攻擊者攔截到信息后就可以用自己的私鑰解密出來,再用之前攔截到的接收者的公鑰對偽造的消息加密后發給接收者。
僅靠公鑰密碼本身,是無法防御中間人攻擊的。要防御中間人攻擊,還需要一種手段來確認所收到的公鑰是否真的屬于接收者,這種手段稱為認證。針對上面的情況,我們可以使用公鑰的證書。關于認證和證書,下一篇文章再講。
混合密碼系統
混合密碼系統是將對稱密碼和公鑰密碼的優勢相結合的方法,加密消息使用快速的對稱密碼,而用公鑰密碼來加密對稱密碼的密鑰。因為對稱密碼的密鑰一般比消息本身要短,因此公鑰密碼速度慢的問題就可以忽略了。另外,對稱密碼使用的密鑰是臨時生成的會話密鑰。混合密碼系統的加密過程如下圖:

從圖中就可得知:
1. 會話密鑰是隨機生成的,因此,每次加密的會話密鑰都會不同;
2. 混合密碼系統的明文是用對稱密碼加密的,而加密使用的密鑰就是上一步生成的會話密鑰;
3. 用公鑰密碼對會話密鑰進行加密,形成了加密后的會話密鑰;
4. 將加密后的會話密鑰和加密后的消息組合在一起,就是混合密碼系統的密文。
而解密過程則如下圖所示:

從圖中也可得知:
1. 將已加密的會話密鑰和消息進行分離;
2. 用公鑰密碼對已加密的會話密鑰進行解密,得到會話密鑰明文;
3. 用對稱密碼對已加密的消息進行解密,而解密密鑰就是上一步解密出來的會話密鑰。
那么,怎樣才算是一個高強度的混合密碼系統呢?混合密碼系統運用了偽隨機數生成器、對稱密碼和公鑰密碼,因此其中每一種技術要素的強度都必須很高,而且,這些技術要素之間的強度平衡也非常重要。
如果偽隨機數生成器的算法很差,生成的會話密鑰就有可能被攻擊者推測出來。會話密鑰中哪怕只有部分比特被推測出來也是很危險的,因為會話密鑰的密鑰空間不大,很容易通過暴力破解來發動攻擊。
對稱密碼被用于加密消息,我們需要使用高強度的對稱密碼算法,并確保密鑰具有足夠的長度。此外,還要選擇使用合適的分組密碼模式。
公鑰密碼被用于加密會話密鑰,同樣需要使用高強度的公鑰密碼算法,并確保密鑰具有足夠的長度。
另外,公鑰密碼的強度應該要高于對稱密碼,因為對稱密碼的會話密鑰被破譯只會影響本次通信的內容,而公鑰密碼一旦被破譯,從過去到未來的(用相同公鑰加密的)所以通信內容就都能夠被破譯了。
寫在最后
本篇文章只是本書第一部分的讀書筆記,雖然也有加入了一點自己的看法。第一部分的內容主要是關于保證機密性的密碼技術。但信息安全還包括消息完整性、進行認證以及防止否認的技術,這些下面的文章再做總結。
Tag標簽: 密碼   技術  
  • 專題推薦

About IT165 - 廣告服務 - 隱私聲明 - 版權申明 - 免責條款 - 網站地圖 - 網友投稿 - 聯系方式
本站內容來自于互聯網,僅供用于網絡技術學習,學習中請遵循相關法律法規
香港最快开奖现场直播结果