成為“黑客”前,必學的“密碼學原理”
”密碼學“是一個高度跨學科的領域,包含純數學、計算機科學以及電子工程等多方面的知識。 "許多小白看到這里應該頭就大了"要學這么多知識才能理解密碼學嗎?"當然不需要"如果你的理想是成為密碼學科學的研究者或者領域專家,一定要掌握上述學科知識。但是對于一名"初學者黑客"我們僅需要了解密碼學的常規術語、密碼加密、密碼分析等密碼學基本體系就足夠了。
接下來我就以本篇文章給想了解密碼學的小伙伴們一點啟發和引導!
一、 什么是密碼學
官方定義:密碼學是研究編制密碼和破譯密碼的技術科學。研究密碼變化的客觀規律,應用于編制密碼以保守通信秘密的,稱為編碼學;應用于破譯密碼以獲取通信情報的,稱為破譯學,總稱密碼學。
通俗理解:密碼學是隱藏信息的科學和藝術,因此它們是保密的,然后"取消隱藏"它們,以便只有預期的接收者才能閱讀它們。基本上,我們可以說密碼學是秘密消息傳遞的科學。
二、 密碼學里的常用術語解釋
- 消息也成為明文。
- 加密的消息稱為密文。
- E(M) = C,E為加密函數,M為明文,C為密文。
- D(C) =M,D為解密函數,C為密文,M為明文 。
- 算法和密鑰:如果算法的保密性是基于保持算法的秘密,這叫受限制的算法。任何算法都是可能被人逆向分析的,顯然這樣是不安全的。現代密碼學采用密鑰解決這個問題。密鑰用K表示,k1稱為加密密鑰,k2稱為解密密鑰,如果K1=K2,或者k2能從k1推算出來,反過來也成立,則這樣的算法叫對稱算法。如果k1不等于k2,并且k1與k2不能互相推導出來,則這樣的算法叫做非對稱方法,也叫公鑰算法。
- 密碼分析:不知道密鑰的情況下,回復出明文的科學。
- 隱寫術:將秘密消息隱藏在其它消息中。最常見的就是在圖像中隱藏消息,window下用copy命令直接可成功。
三、 密碼學的七個重要工具
密碼學的七個重要工具分別是:對稱密碼、公鑰密碼、單向散列函數、消息認證碼、數字簽名、證書和偽隨機數生成器。
1. 對稱密碼
對稱密碼(symmetric cryptography)是指在加密和解密時使用同一密鑰的方式。它是最常見的一種加密方式,通過將信息編碼,利用公開的加密算法和保密的密鑰完成對信息的加密和解密,其中加密過程和解密過程是對稱的,因此被稱為對稱密碼。
這里出現了公開的加密算法的概念,人們通常存在一種錯誤的觀點,即保密的加密算法具有更高的安全性,這被現代密碼學稱之為"隱蔽式安全性"。因為保密的加密算法只要被使用,遲早會公諸于世,想依靠對密碼算法本身進行保密來確保機密性的密碼系統也就土崩瓦解了。相反,如果加密算法從一開始就沒設想過要保密,則它會得到各種攻擊的洗禮,從而實現更強的保密性。因此現代密碼學的加密方式基本以"公開加密算法+保密密鑰"組成。
- 組成:公開的加密算法+保密的密鑰;
- 加密過程:A向B發送加密信息t時,需要利用加密算法和密鑰對t進行加密;
- 解密過程:加密過程的逆過程;
- 優點:巨大的密鑰空間能夠抵御暴力破解、算法上沒有弱點可以抵御其他類型的攻擊、加解密運算效率高等優點;
- 缺點:密鑰配送問題(這也是必須用到其它密碼技術的原因);
- 常見密碼算法:DES、AES等;
- 用途:加密信息;
2. 公鑰密碼
公鑰密碼(public-key cryptography)是指在加密和解密時使用不同密鑰的方式,與對稱密鑰正好相反,因此也被稱為非對稱密碼(asymmetric cryptography)。
- 組成:公開的加密算法+公開密鑰(公鑰)+保密密鑰(私鑰);
- 加密過程:A向B發送加密信息t時,需要利用加密算法和B的公鑰對t進行加密;
- 解密過程:B需要利用解密算法(通常與加密算法相同)和B的私鑰對t進行解密;
- 優點:解決了密鑰配送的問題;
- 缺點:加解密算法效率低(意味著它無法直接用于信息加密),中間人攻擊(B無法確定密文是由A發來的,因此需要引入新的安全技術);
- 常見密碼算法: RSA等;
- 用途:加密對稱密鑰等;
3. 單向散列函數
首先說明,后面這幾項技術都不是直接用于加密的。單向散列函數(one-way hash function)有一個輸入和一個輸出,其中輸入稱為消息,輸出稱為散列值。它通過一個不可逆的函數y=f(x)將x映射為y,通過對比傳輸前后y的變化來判斷x是否被篡改。舉個例子:假設A要傳輸t給B,并且要能夠讓B判斷傳輸過程中是否有人修改過t,那怎么做呢?A可以利用單向散列函數,求出y=f(t),并將t和y一起發給B;B得到t和y后,利用f(t)=y1,判斷y和y1是否相同,不同則說明傳輸過程中t或y出現了錯誤,信息不完整,相同則說明傳輸過程中t沒有被修改過。
- 組成:單向散列函數;
- 優點:算法效率高、辨別篡改;
- 缺點:無法辨別偽裝(這就需要新的安全技術來保證);
- 常見密碼算法:MD5、SHA1等;
- 用途:判斷篡改、基于口令的加密、消息認證碼、數字簽名等;
4. 消息認證碼
說到這里,B仍然無法確定與他通信的人是A。那如何認證A就是A呢?本節介紹的消息認證碼(message authentication code)是一種確認完整性并進行認證的技術,簡稱MAC。它的思想很樸素,為了確保完整性,需要MAC與信息內容相關,為了能夠認證,可以利用公共密鑰來提供。很顯然,MAC可以用單向散列函數與密鑰的組合來實現,這也是現實中MAC的一種實現方案。
- 組成:完整性技術(單向散列函數等)+保密密鑰;
- 加密過程:將密鑰作為完整性技術的種子引入,從而得到MAC;
- 認證過程:將信息t做相同的操作,并與傳來的MAC對比,辨別偽裝;
- 優點:辨別篡改和偽裝;
- 缺點:存在密鑰傳遞的問題,當然可以引入公鑰方案解決,但又會引入中間人攻擊的問題(這也是數字簽名的作用)。另外也存在無法防止否認的問題;
- 常見密碼算法:HMAC等;
- 用途:判斷篡改、認證;
5. 數字簽名
上一節提到了一種認證方案,但在某些場景下還存在諸多不足,如無法防止否認、無法抵御中間人攻擊的問題。無法防止否認是因為密鑰相同,無法判斷誰發出了這條消息,因此將密鑰分開為加密密鑰和解密密鑰就可以解決無法防止否認的問題。這是不是跟公鑰密碼很相似,可以將數字簽名看成是公鑰密碼的反過程,用私鑰加密來生成簽名,用公鑰解密來驗證簽名(這也要求不對稱加密算法可逆,由此可是RSA多牛逼)。但前文討論過RSA算法效率不高,因此數字簽名的做法通常:單向散列函數+RSA算法。
- 組成:單向散列函數+公鑰密碼算法+公鑰;
- 加密過程:A將信息t經過單向散列函數運算得到h,利用A的私鑰對h加密得到數字簽名s;
- 認證過程:B收到t和s,利用A的公鑰對s進行解密,再將t散列,對比兩者是否一致即可。
- 優點:能夠識別篡改和偽裝,還可以防止否認;
- 缺點:由于用到了公鑰密碼,那仍然無法理想的解決中間人攻擊,因此提出了證書的概念;
- 常見密碼算法:RSA等算法組合;
- 用途:各種需要認證的場景;
6. 證書
通過上面的講解可以看出,密碼學的基礎是對稱密碼+公鑰密碼,但它們仍然無法抵御中間人攻擊,也即M想辦法阻斷A和B的直接通信,同時偽裝成B然后與A通信,偽裝成A然后與B通信。這個問題在密碼學看來就是個死循環,因此需要引入額外的技術——社會學知識:讓公鑰以及數字簽名技術成為一種社會性的基礎設施,即公鑰基礎設施(public key intrastructure),簡稱PKI。而證書,就是將公鑰當作一條消息,由一個可信的第三方對其簽名后所得到的公鑰。
7. 偽隨機數生成器
前面介紹的幾項技術仿佛能保證信息的安全性,但其中仍然存在著坑:密鑰的由來以及各種算法參數的由來。很顯然,如果它是由特定的序列來生成的,那么攻擊者很容易就能推測出密鑰。那如何才能讓攻擊者沒法推測出來呢?那就是用隨機數。可又出現了一個問題,怎么得到隨機數呢?一次次的扔硬幣肯定不行,那還是需要一個算法來快速的生成類似隨機數的數,這就是偽隨機數生成器。因此這個偽隨機數生成器的算法還是需要一番功夫的,這里就不再贅述。
四、 現代密碼學常見的密碼算法
1. 對稱算法
對稱密碼算法有時又叫傳統密碼算法,就是加密密鑰能夠從解密密鑰中推算出來,反過來也成立。在大多數對稱算法中,加密解密密鑰是相同的。這些算法也叫秘密密鑰算法或單密鑰算法,它要求發送者和接收者在安全通信之前,商定一個密鑰。對稱算法的安全性依賴于密鑰,泄漏密鑰就意味著任何人都能對消息進行加密解密。只要通信需要保密,密鑰就必須保密。
(1) DES:DES算法的入口參數有三個:Key、Data、Mode。其中Key為7個字節共56位,是DES算法的工作密鑰;Data為8個字節64位,是要被加密或被解密的數據;Mode為DES的工作方式,有兩種:加密或解密。其功能是把輸入的64位數據塊按位重新組合,并把輸出分為L0、R0兩部分,每部分各長32位,其置換規則為將輸入的第58位換到第一位,第50位換到第2位……依此類推,最后一位是原來的第7位。L0、R0則是換位輸出后的兩部分,L0是輸出的左32位,R0是右32位,例:設置換前的輸入值為D1D2D3……D64,則經過初始置換后的結果為:L0=D58D50……D8;R0=D57D49……D7。
經過16次迭代運算后,得到L16、R16,將此作為輸入,進行逆置換,逆置換正好是初始置換的逆運算,由此即得到密文輸出。
此算法是對稱加密算法體系中的代表,在計算機網絡系統中廣泛使用。
(2) AES:高級加密標準(英語:Advanced Encryption Standard,縮寫:AES),在密碼學中又稱Rijndael加密法,是美國聯邦政府采用的一種區塊加密標準。這個標準用來替代原先的DES,已經被多方分析且廣為全世界所使用。經過五年的甄選流程,高級加密標準由美國國家標準與技術研究院(NIST)于2001年11月26日發布于FIPS PUB 197,并在2002年5月26日成為有效的標準。2006年,高級加密標準已然成為對稱密鑰加密中最流行的算法之一。
- AddRoundKey — 矩陣中的每一個字節都與該次輪秘鑰(round key)做XOR運算;每個子密鑰由密鑰生成方案產生。
- SubBytes — 通過非線性的替換函數,用查找表的方式把每個字節替換成對應的字節。
- ShiftRows — 將矩陣中的每個橫列進行循環式移位。
- MixColumns — 為了充分混合矩陣中各個直行的操作。這個步驟使用線性轉換來混合每列的四個字節。
2. 非對稱算法
非對稱密鑰也叫公開密鑰加密,它是用兩個數學相關的密鑰對信息進行編碼。在此系統中,其中一個密鑰叫公開密鑰,可隨意發給期望同密鑰持有者進行安全通信的人。公開密鑰用于對信息加密。第二個密鑰是私有密鑰,屬于密鑰持有者,此人要仔細保存私有密鑰。密鑰持有者用私有密鑰對收到的信息進行解密。
(1) RSA:RSA算法基于一個十分簡單的數論事實:將兩個大質數相乘十分容易,但是想要對其乘積進行因式分解卻極其困難,因此可以將乘積公開作為加密密鑰。
因為兩個大素數的乘積因式分解時,除了1和其本身(這兩個不在分解范圍內)外,只有這兩個大素數,但是分解時不知道這兩個大素數,只有從最小的素數2開始,逐步試除,直到這兩個大素數中較小的一個,當然非常困難了。
在公開密鑰密碼體制中,加密密鑰(即公開密鑰)PK是公開信息,而解密密鑰(即秘密密鑰)SK是需要保密的。加密算法E和解密算法D也都是公開的。雖然解密密鑰SK是由公開密鑰PK決定的,但卻不能根據PK計算出SK。
RSA算法是一種非對稱密碼算法,所謂非對稱,就是指該算法需要一對密鑰,使用其中一個加密,則需要用另一個才能解密。
RSA的算法涉及三個參數,n、e1、e2。
- 其中,n是兩個大質數p、q的積,n的二進制表示時所占用的位數,就是所謂的密鑰長度。
- e1和e2是一對相關的值,e1可以任意取,但要求e1與(p-1)*(q-1)互質;再選擇e2,要求(e2*e1)mod((p-1)*(q-1))=1。
- (n,e1),(n,e2)就是密鑰對。其中(n,e1)為公鑰,(n,e2)為私鑰。
RSA加解密的算法完全相同,設A為明文,B為密文,則:A=B^e2 mod n;B=A^e1 mod n;(公鑰加密體制中,一般用公鑰加密,私鑰解密)
e1和e2可以互換使用,即:
- A=B^e1 mod n;B=A^e2 mod n;
3. 哈希算法
哈希算法將任意長度的二進制值映射為較短的固定長度的二進制值,這個小的二進制值稱為哈希值。哈希值是一段數據唯一且極其緊湊的數值表示形式。如果散列一段明文而且哪怕只更改該段落的一個字母,隨后的哈希都將產生不同的值。要找到散列為同一個值的兩個不同的輸入,在計算上是不可能的,所以數據的哈希值可以檢驗數據的完整性。一般用于快速查找和加密算法。簡單解釋:哈希(Hash)算法,即散列函數。它是一種單向密碼體制,即它是一個從明文到密文的不可逆的映射,只有加密過程,沒有解密過程。同時,哈希函數可以將任意長度的輸入經過變化以后得到固定長度的輸出。哈希函數的這種單向特征和輸出數據長度固定的特征使得它可以生成消息或者數據。
(1) MD5:MD5即Message-Digest Algorithm 5(信息-摘要算法5),用于確保信息傳輸完整一致。是計算機廣泛使用的雜湊算法之一(又譯摘要算法、哈希算法),主流編程語言普遍已有MD5實現。將數據(如漢字)運算為另一固定長度值,是雜湊算法的基礎原理,MD5的前身有MD2、MD3和MD4。
MD5算法具有以下特點:
- 壓縮性:任意長度的數據,算出的MD5值長度都是固定的。
- 容易計算:從原數據計算出MD5值很容易。
- 抗修改性:對原數據進行任何改動,哪怕只修改1個字節,所得到的MD5值都有很大區別。
- 強抗碰撞:已知原數據和其MD5值,想找到一個具有相同MD5值的數據(即偽造數據)是非常困難的。
(2) 2SHA-256:安全哈希算法256位。SHA-1安全性比MD5稍高(160位VS128位),但算法需要時間SHA-1稍慢。
五、 密碼分析詳解
密碼編碼學的主要目的是保持明文(或者是密鑰)的秘密并防止竊聽者(也可以叫對手、攻擊者、截取者、入侵者、敵人等)知曉。這里假設竊聽者完全能夠截獲發送者和接收者之間的通信。
密碼分析學是在不知道密鑰的情況下,恢復明文的科學。成功的密碼分析可以恢復消息的明文或者密鑰。與此同時,密碼分析也可以驗證出密碼體制的弱點,并最終恢復明文或者密鑰。
對密碼進行分析的嘗試稱為攻擊(attack)。A.Kerckhoffs 早在19世紀就闡明了密碼分析的一個基本假設,此假設就是秘密必須全寓于密鑰中。Kerckhoffs假設密碼分析者已知密碼算法以及其實現的全部資料。雖然在實際的密碼分析中并不總是擁有如此詳細的信息,但理應如此假設。這樣如果不能破譯算法,那么即便了解算法是如何工作的也是徒然。當然,如果連算法的知識和相關資料都沒有,那就肯定無法破譯。
現我列出常用的七類密碼分析攻擊,在此假設每一類密碼分析者都知道所用的加密算法的全部知識。
- 唯密文攻擊(ciphertext-only attack)。密碼分析者有一些消息的密文,這些消息都用相同的加密算法進行加密。密碼分析者的任務就是恢復盡可能多的明文,或者最好能推算出加密消息的密鑰,以便可采用相同的密鑰破解其他被加密的消息。
- 已知明文攻擊(known-plaintext attack)。密碼分析者不僅可得到一些消息的密文,而且也知道這些消息的明文。分析者的任務就是用加密信息推出用來加密的密鑰或導出一個算法,此算法可以對用相同密鑰加密的任何新消息進行解密。
- 選擇明文攻擊(chosen-plaintext attack)。分析者不僅可以得到一些消息的密文和相同的明文,而且還可以選擇被加密的明文。這比已知明文攻擊更加有效,因為密碼分析者能選擇特定的明文塊進行加密,那些塊可能產生更多關于密鑰的信息。分析者的任務就是推導出用來加密消息的密鑰或導出一個算法,此算法可以對用相同密鑰加密的任何新消息進行解密。
- 自適應選擇明文攻擊(adaptive-chosen-plaintext attack)。這是選擇明文攻擊的特殊情況。密碼分析者不僅能夠選擇被加密的明文,還可以基于以前加密的結果修正這個選擇。在選擇明文攻擊中,密碼分析者還可以選擇一大塊被加密的明文。而在自適應選擇明文攻擊中,可以選擇較小的明文塊,然后再基于第一塊的結果選擇另一個明文塊,以此類推。
- 選擇密文攻擊(chosen-ciphertext attack)。密碼分析者能選擇不同的被加密的密文,并可得到對應的解密的明文。例如,密碼分析者訪問一個防篡改的自動解密盒,密碼分析者的任務就是推導出密鑰。
- 選擇密鑰攻擊(chosen-key attack)。這種攻擊并不表示密碼分析者能夠選擇密鑰,其只是表示密碼分析者具有不同密鑰之間關系的有關知識。
- 軟磨硬泡攻擊(rubber-hose cryptanalysis)。密碼分析者威脅、勒索,或者通過折磨某人,直到其給出密鑰為止。通過行賄獲取密鑰的方法,有時稱為購買密鑰攻擊(purchase-key attack)。這些是非常有效的攻擊,并經常是破譯算法的最便捷途徑。
六、使用密碼學教學常用工具CrypTool完成一次實例加解密過程
在這個實際場景中,將使用RC4算法創建一個簡單的密碼。然后將嘗試使用暴力攻擊解密它。在本練習中,假設我們知道加密密鑰是24位。我們將使用此信息來破解密碼。
1. 首先創建RC4流密碼
我們將加密以下短語 "永遠不要低估一個時間充裕且現金不足的孩子的決心" 我們將使用"00 00 00"作為加密密鑰。
打開CrypTool
將文本替換為"永不低估時間充裕且現金不足的孩子的決心"
單擊加密/解密菜單
指向Symmetric(現代),然后選擇RC4,如上所示
將出現以下窗口
選擇24位作為加密密鑰
將值設置為00 00 00
單擊加密按鈕
您將獲得以下流密碼
2. 其次攻擊流密碼
單擊"分析"菜單
指向Symmetric Encryption(現代),然后選擇RC4,如上所示
您將看到以下窗口
記住假設是秘密密鑰是24位。因此,請確保選擇24位作為密鑰長度。
單擊"開始"按鈕。您將看到以下窗口
注意:完成暴力分析攻擊所需的時間取決于所使用機器的處理能力和密鑰長度。密鑰長度越長,完成攻擊所需的時間越長。
分析完成后,您將獲得以下結果。
注意:較低的熵數意味著它是最可能的正確結果。高于最低找到的熵值可能是正確的結果。
選擇最有意義的行然后在完成后單擊"接受選擇"按鈕
七、 最后推薦小伙伴們幾本不錯的密碼學書籍
- 《現代密碼學》第4版------->楊波老師編寫的,一本很薄的講解基礎密碼學的書籍
- 《密碼編碼學與網絡安全——原理與實踐》第七版 by William Stalling ------->很多著名大學都采用它做教材
- 《密碼學原理與實踐》第三版 Douglas R.Stinson著 馮登國 譯------->值得精讀的一本書