加密算法中密鑰交換有點(diǎn)不安全
今天聊聊關(guān)于對(duì)稱加密算法中關(guān)于密鑰的問題。如果對(duì)于密碼學(xué)的基礎(chǔ)概念還不太熟悉的可以復(fù)習(xí)一下我上一篇文章。手把腳看看密碼學(xué)No.72。
我們都知道對(duì)稱密鑰可以用于傳送加密信息,過程是這樣的。
從上面的過程我們可以看到,如果傳送者跟接收者都有密鑰 KEY ,那么就可以在不安全的信道下進(jìn)行安全的通信了,目前比較流行的對(duì)稱加密算法有 AES、DES、3DES、TDEA、Blowfish、RC5、IDEA等算法。。
那么問題來(lái)了,傳送者和接受者雙方都需要擁有同一個(gè)密鑰,那么這個(gè)過程要怎么實(shí)現(xiàn)呢?現(xiàn)實(shí)中我們可以這樣做,把一個(gè)鑰匙做兩份,然后裝在信封里邊面對(duì)面交易,拿到信封后回到家里鎖起房門蓋上被子打開手電筒偷偷摸摸看看密鑰然后記在腦海里,這樣就幾乎沒人可以偷走了吧?
理想的情況應(yīng)該是這樣的:
但是在網(wǎng)絡(luò)世界中,基本一切都是不安全的,可能會(huì)出現(xiàn)搞壞的的人,比如出來(lái)了一個(gè)叫F的人,在中途截獲了密鑰,那么A和B后面所有的交流都會(huì)被監(jiān)聽了。
喏你看,一切消息都被破譯了吧,這時(shí)候 A 跟 B 之間的這個(gè)密鑰有跟沒有是一樣一樣一樣的。
那么究竟要怎么辦呢?這時(shí)候我們又要搬出偉大的數(shù)學(xué)了,今天介紹一種算法 迪菲-赫爾曼密鑰交換,這個(gè)算法能夠解決在不安全的信道下進(jìn)行安全的密鑰交換問題,究竟是怎么實(shí)現(xiàn)的呢。
迪菲-赫爾曼密鑰交換(Diffie–Hellman key exchange,簡(jiǎn)稱“D–H”) 是一種安全協(xié)議。它可以讓雙方在完全沒有對(duì)方任何預(yù)先信息的條件下通過不安全信道建立起一個(gè)密鑰。這個(gè)密鑰可以在后續(xù)的通訊中作為對(duì)稱密鑰來(lái)加密通訊內(nèi)容。
主要的思路就是,根據(jù)數(shù)學(xué)的指數(shù)運(yùn)算的法則來(lái)進(jìn)行本地的計(jì)算(本地計(jì)算可以認(rèn)為是安全的),同時(shí)用使用模運(yùn)算來(lái)降低傳輸?shù)臄?shù)的值。算法的大概流程像下面的圖這樣。
首先確定一個(gè)公共的數(shù)對(duì) (3 和 17),這個(gè)數(shù)對(duì)***都是質(zhì)數(shù),防止其他人進(jìn)行猜測(cè),其中3作為冪計(jì)算的底數(shù),17作為求模的值。(這兩個(gè)概念不清楚的自己百度去)
交換的過程分為 3 part 。
第 1 part :A 和 B 各自生成一個(gè)私鑰。
第 2 part :A 和 B 進(jìn)行指數(shù)運(yùn)算,然后求模。
第 3 part :A 和 B 對(duì)接收到的消息各自進(jìn)行指數(shù)運(yùn)算,然后求模,得到最終的公共的對(duì)稱密鑰。
這樣子,公共數(shù) 3、17、6、12 都是完全公開的,但是如果不擁有密鑰,想要靠猜的猜到 A 和 B 的公共密鑰是什么,還是需要很大的成本的,特別是我們把 3、17 這兩個(gè)公共數(shù)設(shè)置得非常非常大,然后 A 和 B 的私鑰也設(shè)置得非常非常大,這對(duì)于計(jì)算機(jī)來(lái)說(shuō)短期內(nèi)是不可破解的,甚至需要幾百萬(wàn)年甚至更久,所以我們說(shuō)這個(gè)算法是安全的。
那么,怎么保證 A 和 B 進(jìn)行運(yùn)算之后得到的數(shù)是一致的呢?
我們可以這樣看。
A 端:
接收到的 12 = 3^13 mod 17
所以 3 ^ 12 mod 17 = 3 ^ (13 * 12) mod 17
B 端:
接收到的 6 = 3^15 mod 17
所以 3 ^ 6 mod 17 = 3 ^ (12 * 13) mod 17
根據(jù)指數(shù)運(yùn)算的規(guī)律,我們可以知道其實(shí)
3 ^ 6 mod 17 = 3 ^ (12 * 13) mod 17 = 3 ^ (13 * 12) mod 17
好,無(wú)論這個(gè)最終計(jì)算到的數(shù)是什么,我們都可以保證 A 和 B 所擁有的密鑰是同一個(gè)值,然后后續(xù)所有的通訊都使用這個(gè)值進(jìn)行加密運(yùn)算然后傳輸就好了。
雖然這個(gè)方法很棒,但是你思考一下下面這個(gè)過程,如果 A 要跟 5 個(gè)人通信,那么 A 就要保存 5 個(gè)密鑰,久而久之,A會(huì)崩潰的。。。
如果不想這樣,那能怎么辦呢?關(guān)注后面的密碼學(xué)系列,可以解答這些問題。
【本文為51CTO專欄作者“大蕉”的原創(chuàng)稿件,轉(zhuǎn)載請(qǐng)通過作者微信公眾號(hào)“一名叫大蕉的程序員”獲取授權(quán)】