我們之前介紹的內容主要集中在對稱加密上。從本文開始,我們的重點轉移到非對稱加密算法,也稱為公鑰加密算法。整個算法有壹個非常關鍵的環節:密鑰交換。密鑰交換“人”顧名思義,要解決的本質問題就是如何安全地交換密鑰。讓我們邀請我們的老朋友愛麗絲王後和鮑勃勛爵來解釋。假設愛麗絲王後和鮑勃勛爵想要安全地通信,那麽愛麗絲王後和鮑勃勛爵將把他們各自的密鑰發送給對方。這樣壹來,通信雙方都持有* * *共享的這個密鑰,可以用於後續的信息安全交互。
為了讓後續的討論更接地氣,我們假設愛麗絲女王和鮑勃勛爵從未謀面,那麽如何才能讓女王和勛爵安全溝通呢?這個問題也是密鑰交換算法最原始的應用場景。為了保證女王和領主之間通信的私密性,雙方都需要壹個* * *共享的密鑰,但是安全通信* * *共享密鑰並沒有想象中那麽簡單。如果有惡意攻擊者竊聽了女王和領主之間的電話通信或電子郵件通信(假設傳輸的是明文信息),那麽惡意攻擊者就會竊取女王和領主共享的密鑰,雙方隨後的所有通信內容都可以被這個密鑰破解,所以女王和領主之間的所有私人通信都是不安全的,通信內容成了整個王國茶余飯後的談資。
如何解決這個問題?這是密鑰交換算法要解決的核心問題。簡單來說,通過密鑰交換算法,愛麗絲王後和鮑勃勛爵可以安全地交換密鑰。即使惡意攻擊者在監聽所有通信線路,也無法從雙方獲得密鑰,女王和領主終於可以無憂無慮地八卦了。
秘密密鑰交換始於通信雙方生成他們自己的秘密密鑰。通常,非對稱加密算法會生成兩個密鑰:公鑰和私鑰。然後通信雙方互相發送自己的公鑰,公鑰的“公開”在這裏就是公開的意思,也就是說惡意攻擊者也可以獲取通信雙方生成的公鑰信息。然後女王和領主把收到的公鑰和自己的私鑰結合起來,結果就是* * *共享的通信密鑰。您可以從惡意攻擊者的角度來看這個公鑰。因為惡意攻擊者沒有任何壹方的私鑰,所以惡意攻擊者無法獲取“* * *”密鑰用於女王和領主之間的通信。關於* * *在女王和領主這邊享受秘鑰的過程,如下圖所示:
了解了密鑰交換算法的壹般工作機制之後,我們再來看看密鑰交換算法是如何解決愛麗絲王後和鮑勃勛爵之間的安全通信問題的。在上圖所示的過程中,女王和領主通過密鑰交換算法確定可以用於安全通信的密鑰,這個密鑰可以作為認證和加密的密鑰。因此,即使MITM(中間人攻擊者)截獲了女王和領主之間的通信數據,由於沒有密鑰,通信內容也不會被破解,女王和領主可以安全通信,如下圖所示:
不過這裏描述的內容有點不嚴謹。充其量,我們只能稱這種情景為被動的MITM。在白話文裏是指惡意攻擊者被動監聽,但與主動MITM的主要區別在於,主動中間人會截取密鑰交換算法交換的數據,然後同時模擬通信雙方的角色。具體來說,中間人會同時主動與女王和領主交換密鑰,通信雙方“認為”自己與對方達成了壹個關於* * * *的* * *知識,但實質上女王和領主只是與中間人達成了壹個關於* * * *的* * *知識。妳可以想想是什麽原因造成了這種誤解。
其實背後的原因並不難理解,因為通信雙方沒有其他手段來判斷接收到的公鑰與通信對端的持有關系。我們也將這種密鑰交換稱為“未授權”密鑰交換,如下圖所示:
那麽如何解決MITM的主動攻擊呢?我相信妳能猜到認證密鑰交換。讓我們通過壹個具體的業務場景來看看為什麽我們需要這種認證模式。假設我們開發了壹套提供時間信息的服務,服務部署在阿裏雲。為了防止時間數據被惡意攻擊者修改,我們使用MAC(消息認證碼)。如果妳對MAC沒有任何概念,可以參考作者之前的文章。
MAC需要壹個密鑰來保護數據的機密性和完整性,所以我們在部署應用的時候會生成壹個密鑰,然後這個密鑰通過某種方式非法的給了所有的客戶端用戶。應用程序運行非常穩定,並且由於密鑰的存在,所有守法的客戶端都可以讀取準確的時間。但是,壹位客戶在得知這篇文章後,發現這個秘鑰可以用來篡改數據,於是我們的網站被大量客戶投訴讀取時間不準確,導致系統的業務操作和數據處理出現問題。
妳讓建築師趕緊處理。建築師給出了壹個方案,每個用戶可以生成唯壹的密鑰。雖然可以止血,但是妳很快就會發現這個方案不可行,無法操作和維護。隨著用戶數量的激增,如何配置和管理這些密鑰已經成為壹個大問題,更不用說定期更換了。密鑰交換算法在這裏可以派上用場。我們需要做的是在服務器上生成密鑰,然後為每個新用戶提供公鑰信息。因為客戶端知道服務器的公鑰信息,所以中間無法模擬兩個方向的MITM攻擊。我們也稱這種模式為:認證密鑰交換。
讓我們繼續分析這個場景。雖然中間人表示也可以與服務交換密鑰,但此時中間人與普通客戶端沒有區別,因此無法執行主動MITM攻擊。
隨著科技的發展,互聯網在我們的生活中幾乎無處不在,因此安全地建立通信雙方之間的秘密密鑰是極其重要的。但是我們前面介紹的模型擴展性不是很好,因為客戶端需要預先預置服務器的公鑰,這壹點在互聯網場景下尤為明顯。比如,作為用戶,我們希望安全地與多家銀行網站和社保網站進行交流。如果我們需要預設各個網站的公鑰信息,供手機、平板、臺式機安全訪問,那麽妳可以考慮壹下便利性會有多差,我們如何安全訪問新開發的網站。
所以,讀者需要明白很重要的壹點。密鑰交換很重要,但是有上面提到的可擴展性問題,這個問題的解決依賴於數字簽名技術。數字簽名和密鑰交換的結合是我們將在後面介紹的SSL技術的基礎。需要很長時間才能說清楚,所以後面會用專門的壹章來介紹SSL原理。不過,為了後面介紹的順暢,還是先說幾個具體的密鑰交換算法以及背後的數學原理吧。
先說作者系列第壹篇文章提到的Diffie-Hellman密鑰交換算法。Whitfield Diffie和Martin E. Hellman在1976發表了壹篇開創性的論文,介紹了DH(Diffie-Hellman)密鑰交換算法,被稱為“密碼學的新方向”。這篇論文之所以被稱為開創性,主要是因為它有兩個第壹:第壹個密鑰交換算法和第壹個公鑰加密算法(或非對稱加密算法)。
DH算法的數據原理是群論,這也是我們今天接觸到的所有安全機制的基石。因為不是數學專業畢業,數學基礎也不是太紮實,所以壹直在猶豫如何從安全的角度繼續深化。為了讓這個算法更容易被讀者理解,下面的內容會涉及壹些數據的基礎知識,相信有高中數學知識的同學應該能看懂。
引入群論,首要問題是明確定義什麽是群。筆者查閱了相關資料,發現數學領域中的群體有以下兩個特點:
1,由壹組元素組成。
2.元素之間定義了特殊的二元運算符(比如?還是?)
基於上面的定義,如果這組元素和上面定義的二元運算符滿足壹定的屬性,那麽我們稱這些元素為壹個組。對於DH算法,後面使用的群稱為乘法群:定義乘法二元運算符的元素的集合。讀者可能會問,那麽這個乘法群滿足什麽屬性呢?因為這部分內容比較多,我們就壹壹列舉出來:
-結束了。集合中的兩個元素由定義的運算符計算後,結果也在集合中。比如我們有壹個集合M,有元素A,B,c(c=a*b),那麽這三個元素符合閉包性質,集合上定義的算子是乘法。
-結合性(Associativity)。這和中學數學中的組合概念是壹致的。妳可以理解數學公式A× (b× c) = (a× b )× c。
-身份元素。集合包含單位元素,任何元素和單位元素的值經過運算符計算後都不會改變。例如,如果我們有集合M,它包含元素(1,a,b,c...),那麽1就是單位元,因為1*a = a,a和單位元1都是算符算出來的,結果不變。
-逆元素。集合中的任何元素都有壹個逆元素。比如我們有集合的壹個元素A,這個元素的逆元素是1/a,算子計算元素A和逆元素的結果是1。
筆者必須承認,自己膚淺的數學知識可能會導致以上四個屬性的解釋讓大家更加困惑,所以準備了下面這張圖,希望對群體所擁有的四個屬性有壹個更加詳細的補充解釋。
在介紹了組、組屬性等相關信息後,我們來具體看看DH算法中使用的組是什麽樣子的。DH算法中使用的群是由正整數組成的,大多數情況下組成群的元素都是質數,比如這個群(1,2,3,...,p-1),這裏P壹般是很大的素數,為了保證算法的安全性。
註:質數的數學定義是只能被自身和1整除的數,如2、3、5、7、11等。素數廣泛用於非對稱加密算法中。計算機專業的學生應該在大學期間編寫過尋找和打印質數的程序。算法的核心是枚舉所有的數,以便判斷它們是否是素數,如果是,就打印出來。但是從算法的角度來說,這種窮舉模型是低效的,所以業界出現了很多高效的算法,很快就能找到比較大的素數。
除了素數,DH算法使用的群的另壹個屬性是模運算符,具體稱為模乘運算。先說模運算,和小學生的壹些高空數學題很像,重在商和余數。例如,如果我們將模數設置為5,那麽當該數字大於5時,回繞將從1重新開始。比如數字6取模5後的結果是1,7的結果是2,以此類推。模運算最經典的例子就是鐘表,鐘表壹天有24個小時,所以我們用12個小時來計數的時候,下午的13個點稱為1個點,因為13 = 1 * 12+1(其中1)。
那麽我們來看看模乘的定義。我們以6為例。6 = 3?2.如果模為5,我們知道6全部等於(Congo to) 1moduo5,那麽我們的公式可以寫成:
3 × 2 = 1 mod 5
我們從上面的等式中得出壹個非常重要的結論。去掉mod 5,得到3 × 2 = 1,所以3和2是倒數元素。
最後,我們來總結壹下DH算法基礎組的兩個特點:
-交換律(交換律),壹個群中的兩個元素有交換律,即ab=ba。通常,我們稱壹個具有交換律的群為伽羅瓦群。
-有限域(有限域)。下面我們將詳細介紹有限域的特征。
DH算法定義的群也叫FFDH (Refine Field Diffie-Hellman),而子群指的是群的子集。在我們通過定義的操作符操作子集中的元素之後,我們將轉到另壹個子組。
群論中壹個非常重要的概念是循環子群。用白話文來說,就是妳可以通過壹個生成器(或基數)與自己相乘。對於以下示例,生成器4可用於子組1和4:
4 mod 5 = 4
4 × 4 mod 5 = 1
4 × 4 × 4 mod 5 = 4(重新開始,也是循環子群的體現)
4 × 4 × 4 × 4 mod 5 = 1
等等
當我們的模是素數時,那麽群中的每個元素都是壹個生成元,可以生成壹個循環子群,如下圖所示:
最後,我們完整地總結了由群和DH定義的伽羅瓦群:
-群是定義二元運算的元素的集合,具有閉包、關聯、單位元、逆元等性質。
由-DH定義的群稱為伽羅瓦群,組成該群的元素是素數,模乘運算定義在該群上。
-在DH定義的群中,每個元素都是壹個生成元,與自身反復相乘後產生壹個子群。
組是許多加密算法的基礎。筆者只介紹壹點粗淺的知識。如果讀者對這部分感興趣,可以查閱相關資料。有了對小組的初步了解,下篇文章再來介紹DH算法背後的工作原理,敬請期待!