不用數學,一張圖了解公鑰加密法原理

不用數學,一張圖了解公鑰加密法原理
Photo Credit: Panayotis Vryonis, Koppas, CC BY-SA 3.0
我們想讓你知道的是

加密通訊在未來的重要性只會有增無減,在一些公共政策、人權、言論自由等討論中甚至不可或缺,有見及此本文嘗試簡單介紹公鑰加密的原理。

唸給你聽
powered by Cyberon

在網絡已經連上現實的時代,不論是商業交易需要保密,抑或反抗高壓政權的人為求安全避免竊聽,又或是在日常通訊中希望有多一點私隱,加密通訊均非常重要。過去幾十年密碼學發展迅速,其中最重要的概念,應數「公鑰加密」(public-key encryption)。

加密通訊在未來的重要性只會有增無減,在一些公共政策、人權、言論自由等討論中甚至不可或缺,有見及此本文嘗試簡單介紹公鑰加密的原理。下文用到關於公鑰加密的比喻及圖片,均來自Panayotis Vryonis一篇介紹公鑰加密的文章〈Public-key cryptography for non-geeks〉

加密法極簡介

假如我希望傳一項秘密訊息給別人,但不能確保傳送途中沒有其他人讀取,那麼我就要把訊息加密。簡單來說,就是找方法將訊息中的內容打亂,讓第三者即使看到訊息也無法了解內容。

問題在於,我應如何把訊息打亂呢?如果是英文訊息,最簡單直接的想法,就是把字母轉換,例如全部字母按順序向前移3個字母︰A變成X、B變成Y、C變成Z、D變成A、……如此類推。那麼「BAD」就會變成「YXA」,收訊者只需要反過來,便能讀到原本的訊息。

Photo Credit: Matt_Crypto, Public Domain

Photo Credit: Matt_Crypto, Public Domain

這是其中一種最古老的加密方式,據稱超過2000年前的凱撤大帝也有使用。當然,加密時不一定要全部字母移位,也可以隨意把字母調亂替換,原理也沒太大分別。這種古老的加密方式非常簡陋,加上英文詞語的串法有一定規律(例如q之後往往是u、e出現得最多、th經常一起出現等),如果訊息足夠長,有心人不難猜出訊息內容。

後來也有其他的加密方式,例如有500年歷史、使用多次替換,讓人難以透過分析字母出現頻率而猜出內容的維珍尼亞加密法。又或者二次大戰時,納粹德軍使用的Enigma機加密。英軍需要召集頂尖的數學家,再利用部份波蘭密碼學家的成果,才能間中破解德軍的密碼。

這些稍為先進的加密法,在解密時除了要知道加密方式外,還需要知道一組「密鑰」才能正確解密。粗略來說,這類「密鑰」就像鎖匙,讓收訊方能「打開鎖」——找出正確解密的方式去讀取訊息。

交換密鑰問題

然而這些加密法都有一個問題︰通訊雙方需要事先知道加密方式和密鑰,否則收訊息一方無法解密。這是因為使用這些加密法時,加密和解密是個相反的過程。比方說,你知道加密方法是用凱撤的方法向後移7個字母,那對方也必須知道這回事,才能夠解密讀取訊息,反之亦然。如果通訊雙方無法確定通訊本身安全,他們又如何能夠安全的交換密鑰?

假設小欣、小明分隔兩地,小欣需要把一項重要訊息傳給小明,於是小欣就把訊息放在箱子裏,把箱子上鎖再寄出。小明要打開鎖的話,就需要先取得小欣的鎖匙,可是小欣又如何能把鎖匙安全的送到小明手上呢?總不成把鎖匙放到另一個箱,然後再把箱上鎖……

接下來可以看到,公鑰加密方法能漂亮的解決這個問題。雖然要理解技術細節的話,少不免需要懂一點數學,但其原理並不困難,甚至可以說是概念上非常簡單。

特製的鎖及兩把鎖匙

小明需要一個特製的鎖(參考下圖),鎖匙可以轉動至3個位置,其中A、C均會把箱鎖上,轉至B處的話就能把鎖打開。另外,小明有2把特製鎖匙,能夠插進這個鎖的匙孔之中,然而當中一把鎖匙只能順時針轉(由A轉向C),另一把只能逆時針轉(由C轉向A)。

Photo Credit: Panayotis Vryonis, Koppas, CC BY-SA 3.0

Photo Credit: Panayotis Vryonis, Koppas, CC BY-SA 3.0

第一把鎖匙稱為「私鑰」,只由小明保管;第二把則稱為「公鑰」,小明會多配一把寄給小欣。然後小明會把公鑰及箱子寄給小欣,小欣收到後只需要把信放進箱子,再用公鑰鎖上——鎖匙會轉至位置A——然後再寄回去。小明收到箱子後,用私鑰就能夠把鎖匙轉回位置B,打開箱子。

這個想法聰明之處,在於能夠省去交換鎖匙的步驟。即使在傳送公鑰期間,小豪偷偷多配一條公鑰,在小欣上鎖後小豪仍然無法打開箱子——只有小明能夠打開。

而如果小明要把訊息傳給小欣,就需要小欣寄出另一個箱子和屬於該箱子的公鑰。同樣道理,小明使用小欣的公鑰把箱子上鎖,就能確保訊息只有小欣讀到。

如何證明訊息並非偽冒?

這個特別的鎖能解決交換鎖匙的問題,可是還有一個問題︰小明如何能夠確定傳送訊息的是小欣,而不是其他人?公鑰加密系統仍然可以解決這個問題。

方法就是,小欣先把信放進自己的箱子,用她的私鑰鎖上;然後再放進小明的箱子中(先假設箱子夠大,這點不重要),以小明的公鑰鎖上。小明收到的時候,用他的私鑰開啟自己的箱子(只有他能夠打開);再用小欣的公鑰開啟。由於小欣的箱子,只有小欣能用私鑰鎖上,因此如果小明能夠用小欣的公鑰打開,就能確定訊息來自她。

以上的「箱子」、「鎖」和「鎖匙」當然是比喻,用電腦加密訊息,一切都是演算法和數字。因此我們不用擔心「箱子」的大小,「公鑰」亦可公開放到網上,讓其他人傳送訊息時用來加密——也可以用來解密你的訊息,確認並非他人偽冒。

20160303更新︰為統一譯名,把「公匙」等改為「公鑰」。

相關文章︰