本文來源: http://marklux.cn/blog/77
作者: MarkLux,轉載請註明出處
介紹
非對稱加密技術是當前網際網路界採用較多的一種資料加密方式。
通過網路傳輸機密資訊的問題是,傳輸的渠道是公開、透明的,某種程度上來講,這就好比要使用明信片來傳遞祕密一樣。
因此我們需要構建的資料加密方式必須能夠做到,只有接受和傳送訊息的人才能夠得到明信片上所真正表示的內容。
什麼是祕鑰?
首先,毋庸置疑的是,我們需要對公開傳送的內容進行修改,使其成為加密的密文。
一個最簡單的方法,就是“移位密碼”。以英文為例,我們可以簡單的讓每個字母向後移動幾個距離來實現內容的加密,比如下面這樣:
Mark =每個字元向後移動3個距離=> Pdun
複製程式碼
這是一個簡單的方法,更進一步的,使用凱撒密碼等方式,可以實現進一步的加密。
切換到計算機層面上,即是說可以對傳輸的二進位制包整體做移位處理,從而實現加密(當然實際的演算法要比這複雜的多)。
可以看到,無論是採用什麼樣的加密方式,訊息的傳送者和接受者都需要提前共享一樣東西,來實現加密和解密:在移位密碼的例子中,這個東西是字母向後移動的距離,在凱撒密碼中,則是一串字母或是也該單詞。
我們將這個需要雙方提前共享的東西稱為祕鑰,這是一個很形象的比喻,我們對資訊加密,就像是要對資訊加上一把老式的旋轉鎖,而無論是上鎖還是解鎖,都需要一把同樣的鑰匙。
所以在共享祕鑰的加密方式裡,傳輸加密訊息的關鍵在於如何通過公開的通道共享同一把祕鑰。
使用混合顏料
現在讓我們想象一個場景:
在同一個房間裡有A,B,C三個人,A要向B傳輸一段私密訊息(比如說他的銀行卡密碼),而C是一名竊聽者。
在不使用小紙條、悄悄話等方式的前提下,A和B要如何傳輸訊息,才能避免C的竊聽呢?
另外需要注意的一點是,A和B是陌生關係,這也就意味著他們沒法使用諸如“天王蓋地虎,寶塔鎮河妖”之類的暗號進行交流。
乍看之下似乎是一個很無解的問題,但卻有一個很巧妙的方法能夠解決 —— 我們需要的只是幾桶不同顏色的顏料罷了。
前提
現在我們假設A,B,C三個人,分別位於房間的三個角落裡,而每個角落裡都有很多很多不同顏色的顏料,每種顏色的顏料也是無限多的。
注意,我們規定,每個人在自己的角落裡所做的事情,是其他任何人都無法看到的,如果兩個人需要對話或是交換資訊,就必須走到房間中央的公共區域去,在這裡做的事情,是公開透明的。
第一步:A和B選擇各自的私有顏色
A和B在各自的角落裡選定一種顏色,我們將這個稱為A和B的私有顏色,這意味著只有A和B自己知道它是什麼顏色,其他人都無法知曉。
第二步:A和B選擇各自的公開顏色
現在A和B需要再各自選定一種顏色,與之前不同的是,這次選定的顏色是公開的,這意味著A和B需要將這種顏色放到房間中央的公共區域去:任何人都可以取到他們的公開顏色。
第三步:A和B構建自己的混合顏色
現在A和B需要在各自的角落裡做一些“調色”工作,這非常簡單:
A將自己的私有顏色和自己的公開顏色進行混合,得到一種新的顏色,我們稱其為A的“公開-私有混合顏色”。
同樣的,B將自己的私有顏色,與A的公開顏色進行混合,得到B的“公開-私有混合顏色”。
注意,他們各自的混合顏色並不相同。
接下來A和B將會把各自的混合顏色公開,放置到房間中央的公共區域去。
第四步:A和B在彼此的混合顏色中,加入自己的私有顏色
現在我們假設,A獲得了B的“公開-私有混合顏色”,並將它搬回了自己的角落;同樣的,B也將A的“公開-私有顏色”搬回了自己的角落。
那麼,神奇的地方來了,現在A和B分別向彼此的混合顏色中,加入自己的私有顏色,最終他們將得到相同的顏色,因為他們使用了同樣的成分(A的公開顏色+A的私有顏色+B的私有顏色)來構建最終的顏色。
接下來,A和B只需要使用這種相同的顏色對要傳輸的資訊進行加密/解密操作,就可以實現訊息的祕密傳輸了(參照移位密碼)。
整體的過程可以參考下圖:
我們可以看到,對於竊聽者C,無論如何拼湊資訊,都無法得到真正的共享祕鑰。
顏料混合的要點
之所以能夠使用混合顏料來達到上述的神奇效果,關鍵在於:
-
顏色的混合是一個不可逆的過程
構建“公開-私有混合顏色”後,就沒有人能夠從中從中抽離出原有的兩種顏色究竟是什麼了
-
相同的成分混合最終一定能夠得到相同的結果
儘管A和B不能從“混合顏色”中提取出原有的顏色,但他們只要再向其中加入自己的私有顏色,就可以使顏色混合的結果達成一致,最終獲得相同的顏色。
實際網路中的公鑰加密演算法
我們以混合顏料的例子說明了如何實現共享祕鑰的構建,現在是時候思考如何在二進位制的網路世界裡達到同樣的效果了。
首先我們需要一種特殊的數字運算方式,能夠和顏料的混合一樣實現不可逆運算,同時還能夠保證相同的數字按照不同的順序進行運算後,能夠得到同樣的結果(即滿足交換律)。
現在來介紹能夠滿足上述要求的一種計算方式,也是網路早期共享祕鑰Diffie Hellman演算法所採用的計算方式:模運算+冪運算
模運算(mod)
這對於熟識計算機常識的人並不是一個陌生的數學知識,我們假定一個模數A
,那麼任何一個數字B
對A
取模的結果就是B / A
的餘數。
以模數A = 11
為例子:
13 mod 11 = 2
(3 + 6) mod 11 = 9
(2^4) mod 11 = 5
複製程式碼
有了模運算的概念後,我們就可以開始著手構建可用的共享祕鑰演算法了,下面依舊基於A,B,C三個人的場景進行說明。
第一步:A和B各自選擇一個私人數字
為了方便閱讀,我們假設A和B選擇的都是一個非常小的數字:比如A選擇8,B選擇9。注意在實際的應用中,這個數字要大得多。
第二步:A和B選擇兩個公開的數字
和顏色混合不同,現在每個人的公開部分需要包含兩個數字,其中一個是模數,另一個是基數。
假設A的公開數字分別是11(模數)和2(基數)。
第三步:A和B構建自己的公開-私人數字(PPN)
這是關鍵的一步,我們要解釋一個等同於顏料混合的算數過程,這個過程構建出的結果將會是不可逆的。
現在,A和B都將使用A的兩個公開數字,和自己的私有數字,利用下面的公式計算自己的公開-私有數字(我們稱其為PPN):
PPN = 基數^私人數字 mod 模數
複製程式碼
於是:
A的PPN = 2^8 mod 11 = 3
B的PPN = 2^9 mod 11 = 6
複製程式碼
可以看到這個計算PPN的過程是不可逆的,這主要歸功於取模操作。
第四步:A和B向彼此的PPN中混合自己的私人數字
混合的計算方式和上面類似,只是公開基數被替換成了對方的PPN:
A計算共享祕鑰 = B的PPN^8 mod 11 = 6^8 mod 11 = 4
B計算共享祕鑰 = A的PPN^9 mod 11 = 3^9 mod 11 = 4
複製程式碼
之所以能夠得到同樣的結果,是因為冪運算滿足交換律,即:
(a^b)^c = (a^c)^b = a^(bc)
複製程式碼
很好,A和B成功混合得到了同樣的共享祕鑰!現在他們只需要使用這個共享祕鑰進行數字的加密/解密就可以實現私密通訊了。
而竊聽者C無論拿到誰的PPN,都會因為無法混入另一個人的私鑰而不能得到最終的共享祕鑰。
我們可以把上面的過程總結為下圖:
真實的Deffie-Hellman演算法
上面的例子中,為了方便理解,我們都採用了非常小的數字,比如模數11,對應的結果空間只有0-10一共11個數字,那麼竊聽者完全可以通過暴力嘗試的方式遍歷整個結果空間,最終破譯得到密碼。
所以,Deffie-Hellman對公開數字有以下幾個要求:
- 模數一般是幾百個數位長的數字,確保無法通過暴力遍歷的方式求解
- 模數必須是一個素數
- 基數必輸是模數的“本原根”:其冪迴圈最終可以遍歷迴圈模數對應結果空間上的每一個值
有關本原根,我們可以參考上面使用到的數字,對於模數11而言,2和6都是本原根,而3則不是:
3的冪迴圈對11取模後得到的值只有3,9,5,4,1
,而無法得到2,6,7,8,10
。
更多
共享祕鑰加密,是不對稱加密的一個典型使用範例,除了Deffie-Hellman演算法之外,大名鼎鼎的RSA也屬於同樣的思路。
後續的文章中將會更新更多有關不對稱加密的內容。
本文參考:《改變未來的九大演算法》第四章