譯文:一點點深入端到端加密-- 公鑰密碼系統如何保護我們的信息?

Horo
·
·
IPFS
·
哇站內隱藏無法取消的嘛……(手滑無藥可醫)
來自https://ssd.eff.org/en/module/deep-dive-end-end-encryption-how-do-public-key-encryption-systems-work

如果使用得當,端到端加密可以保護汝的消息、文字甚至文件除了為汝期望的接收者以外其他的傢伙都看不到。它也能保證汝收到的消息確實來自汝所認識的那一位發件人(而不是別的冒充他/她/它的誰),是唄~

過去的幾年中,端到端加密工具如雨後春筍般在各個領域出現(而且達到了可用標準)。例如像Signal 這樣支持文字消息、語音/視頻通話和文件傳送的IM 就是其中的一種咯。這些工具讓監聽者無法讀取消息的內容(包括服務提供商自己)。

是不是覺得有些端到端加密的實現難以理解?在汝開始使用這些端到端加密工具以前,咱們推薦汝先花一點時間了解一下公鑰密碼學的基礎。

這篇文章所討論的公鑰密碼學正是端到端加密所依賴的基礎。啥,汝想了解其它的加密類型?去翻翻咱們以前寫(翻譯)的《當汝看到加密(encryption)時應該想到什麼》咯~

理解公鑰密碼學的基本原則(大概)能讓汝更正確的使用那些工具,例如公鑰加密可以做什麼,不能做什麼,和何時以及如何使用它。

太長不看版小結

  • 對稱密碼系統中,加密和解密使用相同的密鑰。
  • 公鑰密碼系統中,參加信息交換的雙方各自有自己的兩對密鑰,稱作私鑰和公鑰。
  • 公鑰可以公開,私鑰需要安全保護。
  • 發件人用收件人的公鑰加密消息,收件人用自己的私鑰解密消息。
  • 發件人用自己的私鑰簽名消息,收件人用發件人的公鑰驗證消息。
  • 同樣地,公鑰密碼系統保護的是消息的內容而不是元數據。

加密做什麼?

當汝以加密的方式傳輸一些數據的時候:

  • 可以清楚的直接讀取的消息(稱作“明文”,例如“hello mum”)被加密的話會被混亂成輕易無法理解的形式(例如“OhsieW5ge+osh1aehah6”,稱作“密文”)。
  • 這段看起來很像亂碼的消息在網上傳遞。
  • 消息唯一的接收者可以通過某些方法把它還原成原來的形式(“hello mum”),這個過程稱作“解密”。

對稱加密:以一把密鑰傳遞私密信息的故事

名字什麼的最難起啦……以及平常的Bob 和Alice 呢?
汝不知道Alice 和Bob 是誰?

Julia 想寫張小紙條告訴她的朋友César“Meet me in the garden,”(在花園和我見面),不過她當然不想讓她的同學也知道。


(汝有沒有在上課的時候給誰傳過小紙條咧?)

Julia 的字條會在同學間傳遞好幾次之後才能到César 的手上。不排除中間有誰會在傳遞之前悄悄看上一眼, 或者自己抄一份然後記下Julia 寫字條的時間什麼的。 (汝在期望給汝傳字條的同學不會多管閒事嘛?)


Julia 決定用密鑰“3” 來加密她們的消息,每個字母向後移動三位,例如A->D, B->E 等等。其實這簡單的密鑰加密以後的消息看起來像胡言亂語,別有用心的某人還是能夠通過嘗試所有的組合的方式來“暴力破解”。換句話說,他們能為了得到解密的答案一直猜下去。

這種移位三個字母的方法其實是一種古老的加密方法,相傳是羅馬帝國的凱撒大帝發明的,所以也稱作凱撒密碼。在這個例子中,字母移位的數量(3)被同時用於加密和解密,這被稱作對稱加密。

凱撒加密其實挺弱的(按現代的話來說,可以通過頻率分析一類的手段破譯出密鑰(字母移位的數量))。不過這麼長時間過去了,在神奇的算法和電腦的幫助下,加密的密鑰可以生成的越來越長,越來越難猜。對稱加密也用在越來越多的場景中。

(汝來想一想

對稱加密

有沒有問題? )


不過咧,對稱加密還剩下一個問題。如果有人在Julia 和César 交換密鑰的時候竊聽,然後竊取密鑰怎麼辦? (畢竟密鑰沒法再加密的傳遞出去……) 或者如果她們倆沒法在現實見面呢? (例如離得相當遠?)

於是讓咱們跳過紛繁冗雜的學習過程,就當她們已經熟練掌握公鑰加密了吧(大噓)。竊聽者不太可能得到她倆解密消息的密鑰——因為她們根本就不用分享呀。在公鑰加密的過程中,加密和解密的密鑰是不同的。

公鑰密碼:密鑰之雙城記

拿上汝手邊的放大鏡(啥?),讓咱們離問題更近一些:在有人竊聽對話的前提下, 如何只把對稱解密的密鑰發送給接收者咧,特別是在雙方的物理距離非常遠的話?

公鑰密碼學(有時候汝也會看到非對稱加密之類的說法,這倆是一樣的)解決了這個問題。它允許每個人在對話中創建兩個密鑰——通常稱作公鑰和私鑰。兩把密鑰相互關聯,通常是具有某些特別的數學性質的特別大的數字。如果汝用誰的公鑰編碼了一段消息,那麼他們就可以用他們的私鑰解碼。

Julia 和César 現在要用公鑰密碼發送加密的消息,於是之前傳小紙條的同學們就理所當然的被一台台電腦取代了唄。它們可能是她們倆之間的電腦,例如Wi-Fi 接入點,ISP,她們所使用的郵箱的服務器等等。自然它們也能複制雙方傳遞的消息的內容和記錄消息傳遞的時間。


雖然她們不介意中間有人會看到她們的消息,不過自然的還是不想讓別人看到消息的內容。

首先,Julia 需要César 的公鑰,於是César 把她的公鑰寄給了Julia (例如通過郵件)。她並不介意通過不安全的通道傳遞公鑰,因為公鑰本來就是她可以自由分享的東西。

需要注意的是,公鑰和現實生活中的鑰匙還有一些區別的。因為César 可以把公鑰拆分成幾部分,然後通過不同的通道發送出去。


有了公鑰以後,Julia 就能給她發送加密的信息了:

“Meet me in the garden.”

Julia 發出了只給César 加密的消息。


雖然她們都可以理解這條消息,剩下的人都認為消息的內容是亂碼, 不過中間的人(或者電腦)還是能看到元數據,例如主題、時間、發件人和收件人。


因為消息是用César 的公鑰加密的,因此只有César 和Julia(因為是發件人)能閱讀這條消息。

César 用她的私鑰解密消息:


簡單的概括:

  • 公鑰密碼可以讓汝(和其他人)在開放和不安全的通道中傳遞公鑰。
  • 有了朋友的公鑰以後,汝就可以給他們發送加密的信息。
  • 汝的私鑰用來解密發送給汝的加密的信息。
  • 中間人——像是服務和網絡提供商,在消息傳遞的過程中可以看到一些元數據,例如誰寫了這些消息,發送給誰,接收或者發送的時間和消息的主題等等。

(汝覺得現在可以高枕無憂了?)

還有一件事……如何識別假冒?

在上面的例子中,中間人能夠看到整個過程中的元數據。

所以讓咱們來耍點壞心眼,某個中間人想知道她們在談論什麼,因此在監聽她們。

壞人能夠用一些手段讓Julia 得到假的公鑰。 Julia 沒注意到這不是César 的公鑰,還是用它加密了要發給César 的消息。

隨後壞人就得到了本該加密給César 的消息,它可以看到消息的原始內容,然後再發送給César 。


甚至可以篡改消息的內容:


於是Julia 和César 如約在花園見面,沒想到這裡已經有人守候多時了……

這就是所謂的“中間人攻擊”啦,其實攻擊的傢伙也不一定是人……幸運的是,公鑰密碼學有防禦這種攻擊的手段。

公鑰密碼學可以讓汝通過一種稱作“指紋驗證”的方式來確認某把密鑰確實屬於汝認識的某人,(“指紋” 指的是公鑰通過某種摘要算法計算出的一串字母,通常比公鑰短的多) 這種過程最好在現實生活中完成。如果汝可以和誰面對面的話,汝可以檢查雙方擁有的公鑰的指紋的每一個字母是否一致。雖然一個一個的看很枯燥,但為了保證汝手上的某把私鑰確實屬於汝認識的某人的話,就稍微忍受一下吧……

其它的端到端加密應用也擁有類似的指紋驗證機制,雖然可能方法各不相同。有些方式比較傳統,汝要小心比較雙方屏幕上顯示的內容是否一致。有的方法比較“新鮮”,例如用汝手上的設備掃描對方顯示的二維碼來“驗證”某個設備。


如果汝沒法和對方見面的話( 擔心有去無回麼…… ) ,汝可以在其它已知安全的地方交換指紋,例如端到端加密的聊天軟件,或者一個HTTPS 網站。

總結一下:

  • 中間人攻擊是指有人在某個雙方之間攔截傳遞的消息,攻擊者可以修改消息、或是只是簡單地監聽。
  • 公鑰密碼讓汝通過驗證發送者和接收者的身份來防禦中間人攻擊,這種方法被稱作“指紋驗證”。
  • 汝(或者汝的朋友)的公鑰也包含一些被稱作“指紋”的信息,汝可以通過指紋驗證公鑰持有人的身份。
  • 私鑰用於解密發給汝的消息,也用來以汝的名義簽名消息。

簽名時代

公鑰密碼讓汝不用冒險把解密密鑰發送給汝私密消息的接收者,因為他們已經擁有了,就是他們的私鑰。因為公鑰只用來加密而不能解密,因此汝(和汝消息的接收者)可以把公鑰分享出去,汝發送私密信息所需要的也只有接收者的公鑰而已。

不過只有這樣麼……咱們已經知道了用特定公鑰加密的消息只有用公鑰對應的私鑰解密。其實反過來也是, 用特定私鑰加密的消息只能用私鑰對應的公鑰來解密。

啥,這有啥用?汝用汝自己的私鑰加密一段消息然後讓隨便什麼人用汝的公鑰解密來看嘛…… 別那麼著急嘛,再想想,例如汝寫了一句話,然後用汝的私鑰加密。大家都能解密汝的消息, 但只有持有汝私鑰的人能寫出這條消息。如果汝能小心翼翼的保護汝的私鑰的話,多半只有汝自己有汝自己的私鑰,也就只有汝能發出這條消息了是唄~

通過用汝的私鑰加密消息,汝確保了這條消息只會是汝所寫的,是不是感覺哪裡眼熟?沒錯,就和實際生活中汝在某些地方簽下汝自己的名字一樣,汝對汝的數字消息完成了同樣的操作。

簽名同時也能防止篡改。畢竟大多數情況下,其他人不能用汝的私鑰重新簽名是吧…… 因此,已簽名的消息可確保它來自某個特定來源,並且不會在傳輸過程中被搞得一團糟。

複習:關於公鑰加密

公鑰密碼讓汝可以把消息安全的發給知道對方公鑰的人咯。

如果有人知道了汝的公鑰:

  • 他們可以發送只有用汝的私鑰解密的私密信息。
  • 汝可以用汝的私鑰簽名消息,而他們可以用公鑰驗證簽名有效。

如果汝知道其他人的公鑰:

  • 汝可以解密來自他/她/它的消息,而且可以驗證消息確實來自那一位。

所以很明顯啦,汝(或其他人)的公鑰傳播的越廣,這個加密方式就越有用處是唄。既然公鑰可以分享,汝也可以以現實中的什麼東西類比一下啦,例如通訊錄或者電話黃頁什麼的: 它是公開的,人們知道哪裡可以找到,汝也能廣泛的分享它。

至於私鑰呢,汝還是拿現實中的什麼東西類比一下好了,例如開門或者各種鎖的鑰匙。汝的私鑰用來加密和解密消息,所以務必要像對待手上真正的鑰匙一樣對待它。

為啥汝的私鑰明顯的(如此)重要?如果汝丟了鑰匙,汝就有可能打不開某處。公鑰加密中私鑰也是如此,如果汝弄丟了私鑰,汝就沒法解密發送給汝的信息了。如果誰拿到了汝的鑰匙,他就能以汝的名義打開某些地方。如果其他人拿到了汝的私鑰(例如物理接觸到汝的電腦,通過惡意軟件, 或者只是因為汝像個大笨驢一樣把汝的私鑰發了出來等等),他就能讀取汝加密的信息,或者冒充汝做些什麼。
也曾經有聽說過某些政府試圖竊取某些人的私鑰的經歷(像是強行收繳電腦啊,釣魚攻擊或者想方設法的安裝惡意軟件等等)。這當然是對公鑰加密安全性的損害。既然汝大多數時候遇不到那麼交迫的情況,那咱們來換個栗子:有扒手在汝停下來休息的時候偷走了汝的鑰匙,然後去配了一把新的,把原來的鑰匙悄悄地放回汝的口袋裡。汝可能覺得什麼都沒發生,然後發現有人光顧了汝的家門……

所以又到了老生常談的威脅模型時間了:估算汝可能遇到的風險,並設計相應的應對措施。例如既然汝擔心誰覬覦汝的私鑰的話,汝大概就不會使用某些瀏覽器中的端到端加密方案了吧,汝也會想方設法確保汝的私鑰只留在汝自己的電腦上而不是別處(例如其他人的服務器或所謂的雲端)。

公鑰密碼學總結和典型實例: PGP

雖然咱們是分開演示的對稱加密和公鑰機密,不過公鑰加密的過程中也有機會用到對稱加密啦。例如是記得操作中,公鑰加密加密的是解密對稱加密的消息的密鑰。 PGP 就是把對稱加密和公鑰加密結合起來的典型例子。

(汝有時會看到像是openPGP 或者GnuPG 一類的傢伙,是因為PGP 本身是私有的啦,於是不少人開發了類似的軟件,它們都支持openPGP 規範。而其中最常用的就是GNU 開發的GnuPG 咯……)

所以那些密鑰到底是什麼,它們是怎麼結合在一起的?

公鑰密碼學基於有兩把密鑰這一前提,一個負責加密,一個負責解密。基本上,汝可以把其中一把密鑰在互聯網這樣的不安全通道上傳遞,這把稱作公鑰。汝可以把公鑰公開到隨便哪裡去而不會影響到加密信息的安全性。

公鑰和私鑰構成一對密鑰,有時也把它倆一起稱作一個密鑰對

既然公鑰可以分享,汝也可以以現實中的什麼東西類比一下啦,例如通訊錄或者電話黃頁什麼的: 它是公開的,人們知道哪裡可以找到,汝也能廣泛的分享它。

至於私鑰呢,汝還是拿現實中的什麼東西類比一下好了,例如開門或者各種鎖的鑰匙。汝的私鑰用來加密和解密消息,所以務必要像對待手上真正的鑰匙一樣對待它。

讓咱們來看一看一種經常在公鑰密碼中用於生成密鑰的算法,叫做RSA (以發明這種算法的三位科學家羅納德·李維斯特(Ron Rivest)、阿迪·薩莫爾(Adi Shamir)和倫納德·阿德曼(Leonard Adleman) 的姓氏命名)。

私鑰由兩組特別大的質數組成
公鑰是私鑰的兩組數的乘積,因為私鑰是兩組特別大的質數,所以在相當長的一段時間內很難猜出來

公鑰和私鑰同生共死(?只是一起生成啦……),而且都依賴於特別大的秘密質數。私鑰由兩組特別大的質數組成, 而公鑰就是它們的乘積。以公鑰推算出私鑰的兩個質數的嘗試十分困難。

為啥咧?因為現在還沒有一個又快又穩定的分解質因數的算法啦……隨著時間的推進,現代的加密套件也允許用戶生成更大更難猜的質數作為密鑰。

(以及隨著時間推進,更現代的加密算法也被發明出來,像是橢圓曲線加密算法(ECC)和ElGamal 等等。)

這就是公鑰加密的強大之處了,參加加密信息交換的雙方在不安全的通道中交換的信息只有雙方的公鑰啦!因為不需要交換私鑰,所以(理想的情況下)私鑰自然不會洩漏。

銘記:需要雙方的公鑰讓公鑰密碼工作。

換種說法:公鑰和私鑰一起生成,像陰陽一樣交織在一起。

公鑰可以搜索和分享,汝可以把它隨便發送到哪裡去。如果汝不介意暴露郵件地址的話,汝可以把它放在社交媒體或是汝自己的網站上。

私鑰需要安全的保護起來。因為越多的話保持安全和秘密就越困難,所以汝肯定只想留著一把(而且不要搞丟), 而不是把它分享出去或者弄得複件到處都是。 (?)

PGP 如何工作

所以說了那麼多,PGP 到底是如何工作的呢?假設汝要向Aarav 發送一些私密消息:

  • Aarav 有一對密鑰,像一個優秀的公鑰密碼用戶一樣,他把他的公鑰放在了他有HTTPS 的網站上。
  • 汝下載了他的公鑰,用它加密了一些消息發送給他。
  • 因為只有他有他自己的私鑰,所以只有他能解密發送給他的消息。

PGP(Pretty Good Privacy,優良保密協議)就是聚焦於創建和使用公鑰和私鑰這些細節的結合。汝可以創建一對密鑰,用密碼保護私鑰,以及用私鑰和公鑰加密和簽名文本。

如果汝一定要總結一下的話:用足夠強的密碼短語保護汝的私鑰,而且放在安全的地方。

元數據:公鑰加密不是銀彈

公鑰加密的一切(秘密,一致性,防止篡改)都是在保護消息的內容。但這絕對不是汝唯一在隱私上需要關注的問題,就像前面所說的一樣,關於消息的信息(有時被稱作“元數據”) 也可能暴露消息的內容。

某些情況下,僅僅是交換加密的信息也有可能讓汝遇到危險。例如某些政權中的持不同政見者, 或者僅僅是拒絕解密消息。

偽裝汝在和某人交流的事實也許會相當困難。在前面的PGP 中,一種可行的方法是雙方使用通過匿名網絡(例如Tor )訪問的匿名郵箱。在這種情況下, PGP 還是十分有用,無論是在其他人間保護雙方的私密消息,還是證明消息的作者和傳遞過程沒被篡改。

說了那麼多,不妨親手試試看一些端到端加密的應用吧, 例如可用於iOS 和Android 的Signal

CC BY-NC-ND 2.0 授權

喜歡我的作品嗎?別忘了給予支持與讚賞,讓我知道在創作的路上有你陪伴,一起延續這份熱忱!

logbook icon
Horo目前是 LikeCoin Chain 验证人 Yoitsu 背后的家伙,以及 CDC/CFC 划水组成员(笑)。偶尔会变身成狐狸。( @foobarz )
  • 來自作者
  • 相關推薦

LikeCoin Vaildator Intro from Yoitsu 7th

LikeCoin Vaildator Intro from Yoitsu 6th

LikeCoin Vaildator Intro from Yoitsu 5th