加密型別以及相關演算法

技術小甜發表於2017-11-09

讓我們從一個簡單的故事說起。

1.很久很久以前,在筆友盛行的年代,小明交到了筆友小紅,然而有件事讓他們很苦惱,他們的信封總是被他們家人偷看,青春期的小年輕們總是想有點自己的小祕密的,所以這對於他們來說是無法容忍的,於是呢,小明和小紅想了一個辦法,他們約定以後寫的書信每個字母往後兩位,比如a–>c,b–>d,這樣 i love you 就變成了 k nqxg aqw ,就這樣,他們的父母拿到書信後百思不得其解,然而小紅看到臉上卻泛起了紅暈…


上面的例子就是網際網路安全通訊的第一個特性:保密性

在網際網路誕生的最初,網際網路是明文傳輸的,這就很容易被人竊取資訊,所以人們想了一些轉換規則,把明文通過這些規則轉換為密文,再通過轉換規則轉換回來,從而實現資料傳輸的保密性。這種轉換規則我們稱為加密演算法。

plaintext –> 轉換規則 –> ciphertext


2.後來,小明耐不住心中的喜悅把和小紅的祕密告訴了豬隊友小育,於是小育在小明父母的威逼利誘下出賣了靈魂..於是..

容易得知,如果轉換規則被其他人知道,那麼就有可能被人破解密文,然而變換轉換規則的代價是巨大的,(比如說,上面小明和小紅是把字母替換掉,比如a替換為c,我們也可以a替換為d,但是它們都屬於替換的一種,我們也可以類似at之間新增一個字元變成aat,或者兩個變成aaat,這些都屬於新增額外資訊的轉換規則,顯而易見,轉換規則不變,把a替換其他字元比把替換規則變成其他規則要來得容易的多。)所以我們需要一種演算法,它的演算法可以被他人所知,但是如果不知道它的金鑰,破解它是不可能的或者代價是非常昂貴的,於是就出現了我們的對稱加密。對稱加密特點是演算法公開、計算量小、加密速度快、加密效率高,雙方必須使用相同的祕鑰才能解密。

因為對稱加密演算法必須事先知道金鑰才能解密,而金鑰如果唯一的話,那麼別人就可以拿你的金鑰去破解你跟別人的通訊,所以當你跟多人同時通訊的時候,你必須管理許多不同的金鑰,如果數量足夠多的話,那麼光是金鑰管理就夠你頭疼的了。


3.經歷沉痛打擊的小明和小紅大徹大悟,你們不就是想看嗎,給你們看就是了,哼,秀恩愛秀死你們這幫damn single!!然而這一切的一切都被小紅的青梅竹馬小東看在眼裡,每一句親暱的問候都像一把刀深深紮在小東的心裡。。終於有天小東踢翻眼前的狗糧,宣誓加入大fffff團,不擇手段擷取小明的信,並把每句問候都改成惡毒的詛咒..然而這一切小紅都矇在鼓裡..


這個就是網際網路安全通訊的第二個特性:資料的完整性

所謂資料的完整性,就是資料在傳輸過程中不得被他人修改。這就衍生了第二種演算法:單向加密 (提取資料特徵碼)

單向加密有以下幾種特點:

1.雪崩效應(任何微小的改變將會引起資料的巨大改變)

2.定長輸出(任意長度資料計算後的結果長度一樣)

3.結果唯一(相同的資料計算後得到的結果一樣)

4.不可逆性 (無法根據特徵碼逆向推出結果)

單向加密的這四種特性使得,資料在傳輸過程中,一旦被修改,資料計算所得到的結果將千差萬別,所以當A主機傳送資料給B主機的時候,只要先利用約定好的金鑰加密明文,然後把整個加密後的資料用單向加密演算法提取特徵碼附加在資料後面一起傳輸,當資料到達B主機的時候,B主機先用一樣的單向加密演算法提取資料特徵碼,跟附加在資料後面的特徵碼對比,如果一致則再利用已知金鑰解密密文得到最後結果,否則認為資料被篡改,不予接受。從而資料傳輸的保密性和完整性都得到了保證。


4.然而小東的暗戀者併兼任小紅的閨蜜的小紫把這一切都看在眼裡,她既想幫助閨蜜挽回這段感情,又不想被小東知道對自己反感,所以她不能明目張膽地寫信給小明,只能採用類似小紅和小明約定好祕密的方法,但是她和小明平時素來沒有交集,而且自從小明被小育出賣後,閨蜜一直不肯告訴她她和小明的約定..頭痛欲裂的小紫忽然想起一個夜黑風高的晚上,小紅告訴她,再沒有見過小明前,她是怎麼和小明約定好通訊祕密的。抱著試一試的想法,小紫用小紅的方法給小明寫了信,奇蹟般地,小明回了信,於是,小明終於知道了一切…


這個就是我們要講的,兩臺從未交流過的主機,怎麼在網路上互相協商生成加密金鑰,也就是IKE(Internet Key Exchange)

解決這個問題的就是著名的diffie-hellman協議

假設主機A跟主機B通訊

首先,A隨機生成大素數P和生成數g發給B

然後,A在自己的機器上生成隨機數X,B在自己的機器上生成隨機數Y

接著,A把生成數g的x次方模大素數p的值傳給B,同理B把g^y%p的值傳給A

最後,A把B傳過來的g^y%p的值取x次方作為金鑰,也就是(g^y%p)^x,同樣地,B把(g^x%p)^y作為金鑰,易證(g^y%p)^x=(g^x%p)^y= g^xy%p

整個過程簡寫如下:

A–>B   p(大素數)g(生成數)

A:x

B:y

A:g^x%p –> B

B: g^y%p –> A

容易證明,當素數足夠大的時候,分解出x和y代價是巨大的,而且在網路上傳輸了四個值p、g、g^x%p、g^y%p,真正的金鑰g^xy%p並沒有在網路上傳輸,而A、B均已經得知。


5.“小紅,你聽我解釋” “我不聽!我不聽!..”   此處省略3000字..  最終小明還是讓小紅相信了他不可能對她寫出那麼惡毒的話,畢竟沒有什麼不開心是一套別墅搞不定的,如果有,那就是兩套。 小明痛定思痛,覺得還是採用以前的方法通訊,不過現在小明守口如瓶,所以跟小紅的祕密只有天知地知和他倆知,並且從謝爾賓斯基地毯悟出真理,寫的信格式對稱而且全都滿格寫,不留一點改動空間。並且他們約定的規則都定期更換,用來防範豬隊友,心思縝密,以為固若金湯,然而他還是太年輕….

當小紅邁進大學的那天,她就俘虜了技術宅小良的心..這個小良是筆跡模仿高手,而且封信毫無痕跡,關鍵他爹還是學校的郵差..於是,當小紅的信到達的時候,小良把它扔到一邊,並且模仿小明的筆跡跟小紅寫信,親愛的,我們的約定的規則太舊了,換一個吧,小紅拿到信看到熟悉的筆跡也沒生疑,於是發去了新的約定規則,同樣地,小良也模仿小紅給小明寫信…然後開始他罪惡的生涯..每天模仿小明給小紅寫信,再模仿小紅給小明回信,玩得不亦樂乎。終於某天小良覺得時機已經成熟了,他給她倆分別回了“分手吧”!然後趁虛而入,橫刀奪愛,十步殺一人,千里不留行….


這個就是網際網路安全通訊的第三個特性:身份驗證

當我們的資料在網際網路上傳輸的時候,這個時候如果有中間人擷取我們的資料,並且冒充我們的身份去目的主機通訊,再假冒目的主機給我們回信,我們是無從得知的,於是催生了第三種加密演算法:非對稱加密演算法

非對稱加密演算法會生成一對金鑰對,公開出來給大家的叫做公鑰(public key),只有自己知道的叫做私鑰(private key),準確地講,是非對稱加密演算法先生成私鑰,然後公鑰再從私鑰中提取

非對稱加密演算法的特點是,用公鑰加密的資料只能用私鑰解密,同樣地,用私鑰加密的資料,只能用公鑰解密

假設主機A跟主機B都有自己金鑰對,並且都把它們的公鑰公佈於眾,私鑰只有自己知道。這樣當主機A發資訊給主機B的時候,用自己的私鑰加密,主機b收到資料後發現只有用主機A的公鑰才能解密這段資料,從而確認這段資料確實來自於主機A,從而主機A的身份得到了驗證。

然而這僅僅能驗證主機A的身份,因為主機A的公鑰是公開的,所以當主機C的擷取到主機A發給主機B的資料後,也可以用主機A的公鑰解密資料,從而資料的保密性無從保證。

不過不要緊,我們擁有主機B的公鑰,因為利用主機B公鑰加密的資料只有主機B能解密,所以我們可以這樣:(下列方法之一)

1.利用資料先經過主機b的公鑰加密,然後再利用主機A的私鑰對整個資料進行加密,這樣就算主機c能用主機A的公鑰解密資料,它得到的扔是一堆密文,而這個密文只有主機B的私鑰能解密

2.利用資料先經過主機A的私鑰加密,然後再利用主機B的公鑰對整個資料進行加密,同樣地,沒有主機B的私鑰解密不了密文,而主機A的公鑰可以驗證主機A的身份

可惜,這樣的資料到了主機c手裡還是可以作惡,因為它可以篡改裡面的資料,也就是資料的完整性無法得到保證。不過不要緊,我們把單向加密演算法結合進去就好了,我們可以這樣:

先對整體資料單向加密提取特徵碼附加在資料後面,然後對連同特徵碼在內的資料採取以上兩種方法之一,即 先主機B公鑰加密再主機A私鑰加密或者相反

這樣,資料傳輸的三個特性都得到了滿足。事實上,由於非對稱加密的速度實在太慢,所以非對稱加密一般僅僅用來做身份驗證,所以最終資料的傳輸還是要結合對稱金鑰來實現,所以資料傳輸的一般過程可以是這樣的:

1.主機A和主機B通過ike協議生成對稱金鑰

2.主機A生成明文資料,並對這段資料提取特徵碼附加在後面

3.主機A用自己的私鑰加密特徵碼

4.主機A利用對稱金鑰對明文資料連同加密後的特徵碼加密傳送給B

這樣子,主機B再收到資料後:

1.利用對稱金鑰解密 (保密性得到保證)

2.利用主機A的公鑰對特徵碼解密 (身份得到驗證)

3.計算明文,提取後的特徵碼與解密後的特徵碼對比 (完整性得到保證)

事實,因為主機A和主機B都有對方的公鑰,所以上述過程可以略去Ike交換金鑰那步,最終在主機A的操作過程如下:

1.主機A生成明文資料,並對這段資料提取特徵碼附加在後面

2.主機A隨機生成對稱金鑰

3.主機A利用對稱金鑰對明文和特徵碼進行加密

4.主機A利用主機B的公鑰對對稱金鑰進行加密,並附加到密文後面一起傳送給主機B

這樣,主機B在收到密文後:

1.利用自己的私鑰解密對稱金鑰密文(主機B的身份得到驗證)

2.利用對稱金鑰解密資料 (保密性得到保證)

3.利用主機A的公鑰對特徵碼解密 (主機A的身份得到驗證)

4.計算明文,提取後的特徵碼與解密後的特徵碼對比 (完整性得到保證)


6.傷心欲絕的小明,對這個世界感到深深的失望。這一切都被他媽媽看在眼裡,終於有一天他媽媽拿到村裡傳說級的村花的聯絡方式。抱著試試看,大不了不買的態度,小明給村花按給小紅的方式發了一封信,這一次,出於對小明的愧疚,小良不僅沒使壞而且幫小明排除了所有的安全隱患,而小明也成功地獲取到了小紅的來信,彷彿被喚醒了第二春,一生的不幸唏噓,都是為了這次的獨特相遇..然而,小明還是太年輕..一天,為了給這個村花一個surprise,小明起早摸黑趕了幾千裡去找她,終於發現,這個村花居然tm是個男的。。從此小明步入了永夜的黑暗…


這個就是我們要講的網際網路安全通訊的保證:證書。

經過以上的例子我們知道,我們要想身份驗證就必須要有私鑰金鑰對,然後把公鑰釋出出去。但是我們怎麼證明公鑰就是我們自己的呢?自己說自己是顯然是不太具有說服力的,就好比當小明在村裡,大家都認識小明這個人,但是進城後,小明要想證明自己的身份就必須要有公安部發布的身份證。同樣地,在網際網路中,要想證明自己的主機身份,就必須要有權威機構釋出的憑證,這個權威機構必須雙方主機都認可,在網際網路中這個權威機構我們叫做證書機構(CA  certifying authority),這個憑證我們叫做證書。

那麼,證書機構是怎麼給主機發證書呢?假設我們給主機A發證,整個過程大概是這樣的:

1.首先,證書機構必須要能證明自己,所以必須要生成有自己的金鑰對,然後利用自己的私鑰給自己簽署證書,並把公鑰公佈出去。

2.主機A生成一對金鑰對,私鑰自己儲存

3.主機A填寫好自己的資訊(公司、住址等)並附加上自己的公鑰做成證書籤署請求傳送給CA

4.CA拿到這份證書籤署請求後,確認沒有問題(一般人工稽核),於是提取出客戶的資訊和公鑰結合在一起,計算特徵碼,附加在後面(資料完整性,保證資訊沒被篡改),並對特徵碼用自己的私鑰進行加密(驗明CA的身份),生成證書回送給主機A

以後,每次主機A要與其他主機安全通訊的時候,主機A就把自己的證書傳送給對方。

對方收到證書後,如果認可證書的簽署機構,那麼就用CA的公鑰對特徵碼解密,然後計算特徵碼對比,從而獲取主機A的公鑰。然而CA機構的證書又怎麼獲得呢?其實這是個死迴圈,在網際網路裡面沒有絕對安全的通訊。為了證明CA的身份,我們只有自己不辭辛苦跑一趟了。

整個網際網路的安全通訊大概是這樣,至於怎麼建立ca,簽署等,詳見下篇 ssl協議與ca的建立

本文轉自biao007h51CTO部落格,原文連結:http://blog.51cto.com/linzb/1868280 ,如需轉載請自行聯絡原作者


相關文章