非對稱加密技術:共享祕鑰

lumin發表於2019-02-14

本文來源: 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,那麼任何一個數字BA取模的結果就是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也屬於同樣的思路。

後續的文章中將會更新更多有關不對稱加密的內容。

本文參考:《改變未來的九大演算法》第四章

相關文章