密碼技術簡明教程(一)
密碼技術好像不常用,偶爾我們才需要對接需要驗籤的介面。 實際上密碼技術很常用,只要你訪問了https的網站,就用到了密碼技術,甚至是解鎖手機,也用到了密碼技術。
密碼技術就是這樣,無處不在,但是一般人卻極少察覺到。然而密碼技術與網路安全息息相關,每個程式設計師都有必要了解。
為此,整理了這篇教程,就是為了讓大家能夠方便快速的理解密碼技術。我們先對圖示進行約定。首先我們所有的圖示中,Alice
和Bob
是傳送者和接受者(通常都是Alice
是傳送者,Bob
是接受者,但偶爾會反過來,視箭頭方向而定),而Cracker
是嘗試竊取Alice
和Bob
通訊內容的第三者。舉個例子,最理想的情況下,沒有人進行竊聽,那麼Alice
和Bob
是這樣進行對話的:
Alice ---(訊息A)----> Bob
就好像我們和朋友面對面說話,但是旁人都沒有聽。但實際生活中,我們的談話多多少少會被旁人聽到,因此,實際上應該是這樣的:
Alice ----(訊息A)---> Bob \------> Cracker
除了竊聽之外,Cracker
可以做出更多破壞性的事情,例如篡改資訊,就像下面這樣:
Alice ---(訊息A)---> Cracker ---(訊息B)---> Bob
如果Alice
給Bob
傳送的訊息是 "我愛你",但是不懷好意的Cracker
篡改成了 "我們分手吧!混蛋",那麼對於Alice
和Bob
來說,這無疑都是最壞的訊息。 這就是傳說中的中間人攻擊。還有其他的攻擊型別,例如破解密碼等等。而密碼技術的重要用途
就是保證我們想要的資料完好無損或者不被第三人知曉。
然而在瞭解真正的密碼技術之前,首先我們要了解一些常見的概念。讓我們開始吧!
密碼、加密、解密、破譯
說起密碼,我想大家都不陌生,我們每天都要輸入各種各樣的密碼,密碼簡單來說,就是一堆只有你知道而別人不一定知道的序列,但是通常來說, 密碼是明文的,例如最常見的弱密碼:1234567。
而加密則是把明文轉換成別人看不懂、無法破解的密文的過程,解密則是相反的過程。加密之前的訊息叫做明文,加密之後生成的訊息叫做密文。 而對於解密來說,解密之前的訊息叫做密文,解密成功之後得到的訊息便是明文。而第三方通過某種方式,也將密文還原成了明文,這就叫破譯。
+----------++-----------+ ||---加密--->|| |明文||密文| ||<--解密----|| +----------++-----------+ <-/ \--破譯---/
而對於加密來說,由於加密和解密所使用的金鑰是否相同,則分為了對稱加密和非對稱加密兩種。金鑰就是加密和解密時使用的密碼。
對稱加密,非對稱加密和混合加密
對稱加密是指在加密和解密時使用同一金鑰的加密方式。 非對稱加密則是指在加密和解密時使用不同金鑰的方式。
而對於使用的金鑰,對稱加密所使用的金鑰叫做對稱密碼(symmetric cryptography),非對稱加密所使用的金鑰叫做 非對稱密碼(asymmetric cryptography),也叫公鑰密碼(public-key cryptography)。
而混合加密就是把對稱加密和非對稱加密揉在一起,利用這兩種技術各自的優點,而避開缺點的一種技術,比如 HTTPS 就是構建在混合加密之上的。
對稱加密
我們知道,計算機裡所有的東西都是0和1來表示,而二進位制有一個運算特別 “神奇”,那就是異或運算(XOR)。異或運算有這樣一個特性,
對於同一個數字A,使用另一個數字B進行兩次異或運算,最後的結果還是A。如果我們用^
來表示 異或運算,那麼就是:A ^ B ^ B = A
。
異或運算的規則(二進位制):
- 0 ^ 0 = 0
- 1 ^ 0 = 1
- 0 ^ 1 = 1
- 1 ^ 1 = 0
簡單的來說就是相同的為0,不同的為1。
用Python來算一下就知道了:
$ python >>> 1 ^ 2 ^ 2 1
分組密碼
DES
下面我們介紹一種年代比較久遠的對稱加密:DES。DES(Data Encryption Standard)是1977年美國聯邦資訊處理標準中採用的一種對稱密碼。 它的工作方式是把明文分成64bit為一組,使用一個64bit長(實際有效長度為56bit)的加密金鑰分別進行加密。
一般來說,以分組為單位進行處理的密碼演算法稱為分組密碼。
DES中,加密的各個步驟稱為輪(round),DES的整個加密過程中就是進行若干次輪的迴圈。DES是一種16輪迴圈的加密演算法。
如圖,每一輪中,將輸入的64bit切割成兩個32bit,分別叫做左側和右側,然後把右側的資料和子金鑰使用輪函式進行加密,然後和左側 的32bit進行異或運算。由於這樣只加密了左側,沒有加密右側,因此進行下一輪的時候,將左右兩側對調,重複進行上次的操作。
注意,其中的子金鑰之所以叫做子金鑰,是因為每一輪中的子金鑰都是不同的,它只針對那一輪生效。
而解密的流程就是根據上述流程反著來。
AES
AES(Advanced Encryption Standard)是取代DES的新的加密標準,它的底層演算法是Rijndael演算法。AES也使用了輪,在每一輪中,AES進行了 如下四個步驟:
- SubBytes。AES的輸入分組為128bit,也就是16位元組。首先AES逐位元組的對16位元組進行SubBytes替換。也就是以每個位元組的值為索引, 從一張擁有256個值的表裡查找出對應的字元進行替換。
- ShiftRows。這一步是以4位元組為單位,算作一行,按照一定的規則向左平移,每一行評議的位元組數是不一樣的。
- MixColumns。這一步是以4位元組為單位,對每一列進行位元運算,得到一個不同的4位元組的值。
- AddRoundKey。最後這一步就是將前面得到的結果與金鑰進行異或運算。
而解密的時候也是根據上述流程反著來。
擴充套件閱讀:分組加密的分組模式
非對稱加密
對稱加密固然好,但是有一個很大的問題,那就是,怎麼解決密碼共享的問題呢?Cracker
可以不知道密文是什麼,但是隻要在金鑰共享的過程中
獲取了金鑰,那麼密文自然就可以破譯出來。因此我們需要一種不需要共享金鑰就能進行加密的技術,它就是非對稱加密。
非對稱加密的原理是餘數,以時鐘為例,1點再轉1個小時,又會回到1點,即1 + 12 = 13, 13 mod 12 = 1
,而時鐘反過來轉,往前減12個小時,也
還是1,即1 - 12 = -11, -11 mod 12 = 1
。正是利用了餘數的這一特性,才能有公鑰加密。
下面我們來講講最常用的公鑰加密演算法:RSA。
在RSA中,密文、明文、金鑰都是數字。RSA的加密和解密流程是這樣的:
密文 = 明文 ** E mod N 明文 = 密文 ** D mod N
而我們常說的公鑰和私鑰,在上面的等式中就是,公鑰是E和N的組合,私鑰是D和N的組合。
不過至於RSA的數學證明,以我目前的水平尚且無法給大家一個簡單易懂的解釋,有興趣的同學可以自行參考:https://en.wikipedia.org/wiki/RSA_(cryptosystem)
混合密碼技術
既然RSA這麼好用,為什麼不直接在所有的場合都使用RSA呢?原因是RSA的加密和解密都要對一個非常大的質數進行計算,與對稱加密相比,效能實在是差太多。 因此就有人把這兩種技術混合起來,使用非對稱加密來傳送密碼,之後使用所傳送的密碼進行對稱加密,HTTPs就是構建在這個基礎之上的。
小結
這篇文章裡,我們簡單的看了一下對稱加密和非對稱加密,瞭解了加密過程中涉及到的一些物件和名詞概念。在下一篇中,我們將會看到 密碼技術在其他領域的應用,例如校驗檔案的唯一性,等等。