對稱加密、非對稱加密、公鑰、私鑰究竟是個啥?

前言

世界上有沒有不能破解的密碼或加密方式?還真有一種,叫做一次性密碼本,這時唯一一種不能破解的加密方式,而其他的密碼只要時間無限理論上都是可破解的,如果你也對加密這個領域感興趣,可以簡單瞭解下這些概念。

進入正題之前先嘮叨幾句,不久前聽到一個名詞叫——費曼學習法,核心思想就是用通俗的話語把複雜道理或技術講清楚,如果你已經明白了這個方法的含義,那麼我好像離成功又進了一步。其實這個方法一直在嘗試使用,但是沒想到它居然有個“洋氣”的名字。

由於之前學習時接觸了加密、驗證、HTTPS、證書等知識,感覺挺有意思的,最近也用到了一些這方面的內容,所以決定把這些概念重新梳理一下,免得一段時間不復習又還給書本了。本打算寫一篇總結把這些概念整理到一起,但是初步想了一下很難實現,涉及到的概念實在太多了,所有還是決定分成幾次來寫吧。

分開寫就比較隨便了,寫到哪完全看心情,不過我還是力圖用最簡單的描述來講清楚問題,拋開具體的實現細節(其實我也不懂),梳理流程和概念性的知識,想了解具體的實現細節還是找專業的書籍去補充吧,我曾經看了一遍《圖解密碼技術》,過了這麼久整本書我就記得兩個詞——異或、求餘,再比如使用公鑰和私鑰來完成非對稱加密,就是利用了兩個大質數 (p,q) 乘積 (n) 難以逆向求解,這些太細節的東西很難展開一點點講清楚。

最理想的狀態是把學習知識當成是看故事書,閱讀完一個個情節就吸收的差不多了,而不是把這些知識當成武功祕籍,然後一點點參悟,最後覺得枯燥而放棄,所以爲了知識解惑,也算是將學習成果做個筆記,我們開始從最基礎的知識學起。

對稱加密

對稱加密一般指:加密和解密使用的是同一個密鑰的加密方式。就像防盜門的鑰匙一樣,可以用鑰匙把門鎖上,也可以用這同一把鑰匙再把門打開。

對稱加密示例

至於密鑰怎麼使用要看具體的加密算法了,可以舉一個簡單的例子,比如有下面這樣一句話:

I like cat

我想把它發給一個好朋友,但是又不想被別人看到,萬一有其他人一眼看到,那我的喜好就暴露了(那有怎樣呢?),這時我們可以把這句話改的稍微隱晦一點,我可以和好友約定一個密碼,假設是 1,然後我把原來這句話的每個非空白字母都替換一下,按字母表順序使用後一個字母替換前一個字母,比如用字母 b 替換字母 a,那麼這句話就變成了:

J mjlf dbu

這時就不怕被別人一眼看穿消息內容了,沒有意義的字符串是比較難記的,但是當我的好友收到這句話時,使用我們約定的密碼 1 就知道字母順序變換了1位,所以他再將將字母反向替換回來就能夠將文字還原。

這個例子很簡單,但可以說明對稱加密的關鍵,就是加密解密使用同一個密鑰,例子中的 1 就是這個密鑰,它可以讓解密者知道,還原信息時需要反向移動1位即可,消息發送流程如下:

用1加密
發送給好友
用1解密
I like cat
J mjlf dbu
J mjlf dbu
I like cat

對稱加密的問題

剛纔的例子已經說了對稱加密的流程,但是有一個問題需要解決,這個密碼 1 我要怎麼告訴我的好友呢?直接發消息被別人看到怎麼辦,打電話也有可能被別人竊聽啊!

密鑰配送

這就涉及到了一個密鑰配送的問題,如果想讓對方解密就需要把密碼發過去,但是密鑰有可能被其他人竊取,這樣祕密就不再是祕密了,可能你會想即使密碼被別人竊取了也不要緊,因爲他根本不知道怎麼用。

請不要做這種假設,簡單的情況沒有密碼都能破解,更何況在密碼和數據都被竊取的情況下呢,另外在密碼領域我們建議使用完全公開的密碼算法,這樣的算法經過時間的檢驗才能被用於加密,千萬不要獨創一套自認爲很安全的加密算法,單靠隱藏算法的細節來達到加密的目的是很危險的。

發送密鑰可能被竊取,不發送密鑰對方無法解密,這個加密的密鑰配送問題是使用對稱加密必須要解決的,而下面要說的這種非對稱就不同了,可以將一把密鑰直接發送給對方,即使被竊取也沒有關係。

非對稱加密

看這個名字就知道它有點“針對”那個叫做對稱加密的小夥伴,從定義上來說對稱加密指的是加密和解密使用相同的密鑰(爲啥不叫同鑰加密咧),而非對稱加密指的是加密和解密過程使用不同的密鑰來進行。

乍一聽好像有點不可思議啊,怎麼滴,難道還能兩把不同的鑰匙開一把鎖?確實可以!這有點像中學物理裏面的兩個開關控制一個燈泡。在一個漆黑的樓梯兩端,分別有一個開關,控制着樓梯上方的一個燈泡,上樓前先打開樓梯下面的開關,然後上樓後關掉樓梯上面的開關,而下樓時進行相反的操作,先打開樓梯上面的開關,然後下樓後默認樓梯下面的開關,找了張電路圖,感興趣可以再分析一下。

單刀雙擲開關

不過非對稱加密和這種雙擲開關不完全相同,使用開關時可以在同一端打開或關閉,但是非對稱加密時,只能在一端加密,然後在另一端解密,同一端是不能同時加密和解密的。

公鑰與私鑰

具體地,非對稱加密指的是根據特殊規則生成兩把密鑰 AB,分別叫做公鑰和私鑰。私鑰自己保留,公鑰則分發給自己的小夥伴用來用來和自己通信,理論上生成的兩把密鑰選擇哪一把作爲私鑰都可以,但是出於效率和安全等方面的要求,公鑰和私鑰再生成時會給出特殊的條件,所以在實際使用過程中,兩者通常是不會互換的。

非對稱加密的示例

使用公鑰和私鑰怎樣完成非對稱加密呢?下面來看一個具體的場景,比如有 Tom 、Jerry 、Spike 三個小夥伴,有一天 Jerry 想給 Tom 發點小祕密,又不想讓 Spike 發現,首先他想到的是對稱加密,先和 Tom 約定一個密碼,再給 Tom 發送加密消息,但是想到前幾天,自己和 Tom 的消息被 Spike 破解了,因爲兩個人發送密鑰和加密消息的過程都被竊聽了,如果這次的消息再被竊聽到怎麼辦?

後來Jerry想起Tom曾經自己生成了一對公鑰和私鑰,然後把公鑰發給了自己和 Spike,那這樣就可以使用非對稱加密了,Jerry 使用 Tom 給的公鑰把要發送的小祕密進行加密,然後發送給了 Tom。這時 Spike 果然在竊聽,但是竊聽到的消息使用了 Tom 的公鑰進行了加密,只有 Tom 擁有解開這條消息的私鑰,而 Spike 雖然擁有 Tom 的公鑰也是解不開的。

Jerry用Tom公鑰加密
發送給Tom
Tom用自己的私鑰解密
I like cat
密文
密文
I like cat

怎麼判斷解開

上面的描述中出現了“解開”一詞,這兩個字在我剛開始學習加密這些知識的時候困擾了我好久,查了好多講解也沒弄明白,什麼叫能解開,什麼叫解不開。它不像現實生活中的事物那麼形象,比如把電視打開,那麼電視就出現圖像了,把鎖解開門就能打開了。在數據加密的過程中,數據本質上是一堆二進制數據,加密之後還是一堆二進制數據,解密時使用密鑰進行特定的運算就會得到解密後的二進制數據,怎麼判定這些“解開”的數據是否是原數據呢?

後來在不斷的學習過程中,接觸了一些開源的非對稱加密算法實現,比如常用的 RSA,基礎的函數包括公鑰加密、私鑰解密、私鑰加密、公鑰解密等,當你在解密時將密文和密鑰傳入解密函數進行特定的運算,計算過程和計算結果必須滿足特定的條件,這些條件是算法保證的,如果有條件不滿足那麼解密失敗,這就是上面所提到的解不開。

非對稱加密的問題

之前提到對稱加密時,密鑰配送問題是一個難題,因爲網絡上發送密鑰很容易被截獲,無法保證密鑰不被竊取。很多情況下又不能面對面的傳遞密鑰,而非對稱加密的出現解決了這個問題,因爲公鑰是可以被任何人知道的,所以網絡上發送公鑰就不怕被竊取,但是如果例子中,Jerry 收到的 Tom 的公鑰實際上在途中被 Spike 替換了怎麼辦?

這就又引入了一個問題——中間人攻擊,形象的來表述就是有第三方 Spike 侵入了原本兩個人 Tom 和 Jerry 的通信中,Spike 對 Tom 時把自己僞裝成 Jerry,和 Jerry 溝通時又將自己僞裝成 Tom,這樣原本兩個人的溝通信息全都被第三方竊取了,這個問題的根本就是獲取公鑰不可信,不過證書中心可以解決這個問題,後面我們再繼續深入瞭解,這裏就不展開了。

對稱加密和非對稱加密對比

加密類型 常見算法 加密處理速度 遇到的問題 解決辦法
對稱加密 DES、AES 密鑰配送問題 面對面交換或者使用非對稱加密傳送密鑰
非對稱加密 RSA、DSA 中間人攻擊問題 通過證書中心來解決中間人攻擊

總結

  • 雖然想寫的儘可能的通俗易懂,但還是不免會引入一些令人犯困的概念,一開始記住就好,後後面理解了就不會覺得那麼枯燥了
  • 還在不斷嘗試表達方式,總結中融入了一些我當時學習時的想法和疑惑,我猜想這些問題應該很多人也遇到過吧
  • 使用對稱加密方法,速度快,效率高,但是會面臨密鑰配送的問題
  • 非對稱加密雖然很巧妙的,但是效率較低,所以一般的用法是使用非對稱加密來傳送簡短的對稱加密密鑰,然後再使用對稱加密的方式傳送數據
  • 爲了更好的加密你的數據,應使用公開的加密算法,他們都是經過時間考驗的,單靠隱藏加密細節來加密時很危險的

==>> 反爬鏈接,請勿點擊,原地爆炸,概不負責!<<==

見過了外面的大千世界,便不再甘心留在原地,而這種不甘心恰恰就是動力~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章