充滿各種數學證明的密碼學是令人頭疼的,一聽到密碼、黑客、攻擊等詞的時候,就給人一種神祕又高大上的感覺,但除非你真的從事密碼學相關工作,否則你並不需要對密碼學有多麼深刻的理解。
這是一篇適合在飯後的品茶時光中閱讀的文章,我們們虛構一個故事來講解,雖然故事看起來很隨性,但是 HTTPS 也是這麼工作的。裡面有一些術語你也應該聽過,因為它們經常出現在技術文獻裡面。
故事背景
一天,一個男子到河邊抓魚給母親吃,而河岸的另一頭是一大戶人家的小姐和她的丫鬟在散步。突然,一個不小心,對面小姐不慎跌入水中,而丫鬟又不會游泳,這可把小丫鬟急的呀!!!正在抓魚的男子見此狀況,來不及脫掉身上的衣物,就像箭一樣竄入水中…..想必看客已經猜到了,小姐被救起,男子抱著迷迷糊糊小姐走上岸的過程中,小姐感覺自己像觸電了一樣,覺得這個男人很安全,只要靠著他,就算天塌下來也不怕,而男子把小姐放下的那一刻,也很不捨,好像把她放下就失去了活下去的希望。
小姐回到家中,給父親大人說了這件事,父親很高興,就叫下人去把這位男子請到家中表示感謝,結果一問,這小夥幼年喪父,現在家中還有病弱的老母親,連一間屋子都沒有,一直和母親寄住在城外的破廟裡面,不過他畢竟救了自己的女兒,父親讓下人拿出了五十兩黃金以表謝意,但不允許他和小姐再有任何來往。
…..此處省略五千字。
我們姑且稱小姐為小花,稱男子為小明,他們不能相見了,但是又備受相思之苦,因此只能通過寫信的方式來傳達彼此的思念了。
最簡單的通訊方式
如果小花想給小明寫信,那麼她可以把寫好的信讓信鴿給小明送去,小明也可以通過信鴿給小花回信,這樣他們就能知道彼此的感情了。
但是很快這種方式出問題了,因為他們都隱約感覺到收到的來信不是對方寫的,因為從信件上看,雙方都表示不再喜歡彼此。憑藉著對彼此的信任,他們才知道是小花的父親從中阻撓他們。每次他們寫的信都被父親的下人攔下了,然後換上他們事先準備好的信件,目的就是為了讓小花和小明斷了感情。
HTTP 就是這樣的工作方式。
對稱加密
小花是博冠古今的人,這怎麼能難倒她呢。他們彼此約定,每次寫信都加上密碼,讓信鴿傳送的信件是用密文書寫的。他們約定的密碼是把每個字母的位置向後移動三位,比如 A → D 、 B → E ,如果他們要給對方寫一句 “I love you” ,那麼實際上信件上面寫的就是 “L oryh brx” 。現在就算父親把信件攔截了,他也不知道里面的內容是什麼,而且也沒辦法修改為有效的內容,因為他不知道密碼,現在小花和小明又能給對方寫情書了。
這就是對稱加密,因為如果你知道如何加密資訊,那也能知道如何解密資訊。上面所說的加密常稱為凱撒密碼,在現實生活中,我們使用的密碼肯定會更復雜,但是主要思想是一樣的。
如何確定金鑰
顯然對稱加密是比較安全的(只有兩個人知道密碼的情況下)。在凱撒密碼中,密碼通常是偏移指定位數的字母,我們使用的是偏移三位。
可能你已經發現問題了,在小花和小明開始寫信之前,他們就已經沒辦法相見了,那他們怎麼確定金鑰呢,如果一開始通過信鴿告訴對方金鑰,那父親就能把信鴿攔下,也能知道他們的金鑰,那麼父親也就可以檢視他們信件的內容,同時也能修改信件了。
這就是典型的中間人攻擊,唯一能解決這個問題的辦法就是改變現有的加密方式。
非對稱加密
小花想出了更好的辦法,當小花想給小明寫情書的時候,她將會按照下面的步驟來進行:
- 小花給小明送一隻沒有攜帶任何信件的鴿子;
- 小明讓信鴿帶一個沒有上鎖的空箱子回去,鑰匙由小明保管;
- 小花把寫好的情書放到箱子裡面,並鎖上箱子
- 小明收到箱子後,用鑰匙開啟箱子就可以了。
使用這種方式,父親大人就沒辦法攔截信鴿了,因為他沒有箱子的鑰匙。同樣如果小明想給小花寫情書,也採用這種方式。
這就是非對稱加密,之所以稱之為非對稱加密,是因為即使你能加密資訊(鎖箱子),但是你卻無法解密資訊(開箱子),因為箱子的鑰匙在對方那裡。在技術領域,把這裡的箱子稱作公鑰,把鑰匙稱作私鑰。
認證機構
細心的你可能發現問題了,當小明收到箱子後,他如何確定這個箱子的主人是誰呢,因為父親也可以讓信鴿帶箱子給小明啊,所以父親如果想知道他們的信件內容,那隻需要把箱子偷換掉就好了。
小花決定在箱子上面簽上自己的名字,因為筆跡是不能模仿的,這樣父親就沒辦法偽造箱子了。但是依舊有問題,小花和小明在不能相見之前並沒有見過彼此寫的字,那麼小明又如何識別出小花的字跡呢?所以他們的解決辦法是,找張三丰替小花簽名。
眾所周知,張三丰是當世的得道高人,他的品德是世人都認可的,大家都把他奉為聖人,而且天下肯定不止一對有情人遇到小花和小紅這樣的問題。張三丰只會為合法居民簽名。
張三丰會在小花的盒子上簽名,前提是他確定了要簽名的是小花。所以父親大人是無法得到張三丰代表小花簽名的盒子,否則小明就會知道這是一個騙局,因為張三丰只在驗證了人們的身份後才會代表他們給盒子簽名。
張三丰在技術領域的角色就是認證機構,你現在閱讀這篇文章所使用的瀏覽器是附帶了各種認證機構的簽名的。所以當你第一次訪問某個網站時,你相信這不是一個釣魚網站,是因為你相信第三方認證機構,因為他們告訴你這個箱子是合法的。
箱子太重了
雖然現在小花和小明有了一個可靠的通訊系統,但是信鴿帶個箱子飛的慢啊,熱戀中的人是“一日不見如隔三秋”,信鴿飛慢了怎麼行呢。
所以他們決定還是採用對稱加密的方式來寫情書,但是對稱加密的金鑰要用箱子來傳遞,也就是用非對稱加密方式來傳遞對稱加密金鑰,這樣就可以同時獲得對稱加密和非對稱加密的優點了,還能避免彼此的缺點。
需要注意的是,在網路世界中,資訊不會像鴿子傳送的那麼慢,只不過只用非對稱加密技術加密資訊要比對稱加密慢,所以只用它來交換金鑰。
以上就是 HTTPS 的工作過程。
一個故事
這個故事你可能早就知道了,我只是在寫文章的過程中突然想起了它,就是笛卡爾的愛情故事。
具體細節你可以網上去查,笛卡爾每天給自己喜歡的公主寫信,但是信都被國王攔截了,笛卡爾給公主寫的第十三封信中只有一個數學方程,但是這個方程國王看不懂,所以就把這封信交給了公主,公主一看方程,立刻著手把方程的圖形畫了出來,發現這是一顆心的形狀。
參考內容:https://medium.freecodecamp.org/https-explained-with-carrier-pigeons-7029d2193351