在前面聊到 HTTPS 時,我們有提到透過加密,可以讓你傳輸的資料不會被「中間人」所竊取。
但這會有一個問題產生,如果加密像是用一把鑰匙將裝滿資料的盒子鎖住,再用同一把鑰匙解開的話,我們要怎麼把這把鑰匙交給對方呢?在傳遞的過程中不也會有「中間人」可以偷走嗎?
回答這個問題之前,我們得先了解兩種類型的加密演算法,一種是「對稱式」加密,另外一種當然就是「非對稱式」加密。
這種用同一把鎖「加密」及「解密」的演算法就稱做「對稱式加密」,例如凱撒密碼,就是典型的對稱式加密。
我們把要傳的資料稱做「明文」,被加密過的資料稱做「密文」,凱撒密碼的原理就是將明文的字母位移某個數目,例如往右位移 3,則 A
會變成 D
、B
會變成 E
,而 Z
會繞回來變成 C
,以此類推。
假如我們要加密一串明文 Hello
,位移量設為 3 的話,輸出的密文就會是 Khoor
,一串大家看不懂的文字。
*凱撒密碼
其中 3 這個位移量就是我們所謂的鑰匙(密鑰)。
假如我們兩個之間已經先見過面了,互相確認過我們加解密的密鑰是 3,這樣我只要傳出一個加密後的文字 Khoor
,你再用密鑰 3 將密文反過來運算(解密),就能得到明文 Hello
了。現實中的對稱式加密算法當然不會像凱撒密碼這麼簡單,但原理是類似的,都是通過同一把鑰匙將盒子鎖上,以及解鎖。
不過,我想你也發現了這種「對稱式」加密的最大缺陷,便是我們兩個要事先溝通密鑰為何,這在網路世界中基本上就不可行了,透過 TCP/IP 體系的溝通沒辦法做到「私下」,無論如何兩者間傳遞的訊息都需要其它節點幫忙轉送封包。
那這可怎麼辦?還好有「非對稱式」的發明,完美的解決這個難題。
這種聰明的做法是將鑰匙分成「公鑰」和「私鑰」兩把,用公鑰加密的資料,只能用私鑰解密;用私鑰加密的資料,只能用公鑰解密。
為何要用公與私呢?這是因為公鑰便是公開給大家的,用途就是讓別人用這把公開的鑰匙加密資料,這樣只有我自己可以解密,其它人都無法。
*Bob 用 Alice 的公鑰加密,只能被 Alice 的私鑰解開
有了非對稱式加密這種演算法,居然就能在公開的情況下設定個人秘密,那麼我們上網時所使用的 HTTPS 是否都是用非對稱式加密來保護我們的資料?更進一步來說,是否就可以拋棄對稱式加密了?
事實上,HTTPS 兩種都有用!
當初步的連線建立時,會透過非對稱式加密來傳輸資料,至於是什麼資料呢?其實是之後再加密其它資料所用的「對稱式加密密鑰」。
這是由於相較於「對稱式加密」而言,「非對稱式」加密需要的運算量更大,也就意味著吃的資源更多,而且速度可能更慢。如果要長期的交換資料,每次都用非對稱式加密來處理資料,效能遠不如對稱式加密來的好。