國家網絡安全周

日期:
標籤: thoughts cs security

這幾週是「國家網絡安全宣傳周」。許多上了川大網絡安全少年班班,網絡安全是幹什麼呢?我不知道。我只會玩電腦🤪,給大家講點玩電腦基本常識。


我想起在初一還是初二的時候,我們小組要講一個網絡安全主題班會。我給大家介紹了 HTTPS 和 RSA 相關內容,結果 RSA 講到一半就給 cyb 叫停了😭️。

但是這裏我想介紹什麼就介紹什麼。

RSA

假如 Alice 和 Bob 希望通信,但是兩人之間的信道是公開的,任何人都能知道 Alice 和 Bob 交換了什麼信息。那麼 Alice 和 Bob 還有有辦法加密通信嗎?

有的兄弟有的。假設是 Bob 要給 Alice 發消息。Alice 先生成一對密鑰,具體操作如下(以下內容中紅色表示被公開的信息,當然整個算法也是被公開的):

  1. 選一對大素數 ppqq
    題外話,如果你也希望生成一個大素數的話,可以使用:openssl prime -generate -bits <位數>。比如 openssl prime -generate -bits 1024 就能生成一個 1024 位(二進制位)的素數。以前我寫字符串哈希的時候喜歡這樣幹,不過後來有人告訴我固定大素數模數然後運行時隨機 base 更能防 hack。
  2. n=pqn=pq
  3. 計算 r=φ(n)=φ(p)φ(q)=(p1)(q1)r = \varphi(n) = \varphi(p) \varphi(q) = (p-1)(q-1)
  4. 隨便選一個在 modr\bmod r 意義下有逆元的數 ee(也即 gcd(r,e)=1,1<e<r\gcd(r,e)=1, 1 < e < r,很多時候用的是 65537=216+165537=2^{16}+1)。
  5. 計算 ee 的在 modr\bmod r 意義下的乘法逆元,記作 dd
  6. 然後將 (n,e)\textcolor{red}{(n,e)} 公開,這是公鑰,(n,d)(n,d) 自己保管好,這是解密用的私鑰。

Bob 現在知道了 Alice 公開的 (n,e)\textcolor{red}{(n,e)},他有一段想要偷偷發給 Alice 的信息 tt,那麼他只需要將 cte(modn)\textcolor{red}{c} \equiv t^{\textcolor{red}{e}} \pmod {\textcolor{red}{n}} 發給 Alice。

最後 Alice 只需要解密消息,計算 tcd(modn)t \equiv \textcolor{red}{c}^d \pmod {\textcolor{red}{n}},便得到了 tt。其原理是 cd(te)dtedtedmodφ(p)t(modn)c^d \equiv \left(t^e\right)^d \equiv t^{ed} \equiv t^{ed \bmod \varphi(p)} \equiv t \pmod n,即歐拉定理。

那麼安全性怎麼保證?這個也叫做 RSA Problem:已知 eenncte(modn)c \equiv t^e \pmod n,求 tt。雖然和質因數分解不等價,但是目前比較好的解決方法也只有分解 N。所以 RSA 的安全性很大程度上依賴於質因數分解。然而質因數分解目前沒有多項式複雜度算法,所以想要分解長達 2048 甚至 4096 位的 nn幾乎是不可能的。

但是,RSA 運算太慢了,如今大家聊天軟件中隨隨便便就傳個幾 MB 甚至 GB 級別的文件,RSA 的速度無法接受。於是一個好的方案是,隨機生成一份強密碼,將這個密碼用 RSA 傳輸,具體的消息傳遞用更快速的對稱加密,如 AES 等。

Diffie–Hellman

這是一個專門用於交換密鑰的算法。

  1. Alice 和 Bob 公開選一個素數 p\textcolor{red}{p} 和其一個原根 g\textcolor{red}{g}
  2. Alice 隨機選一個私鑰 aa,計算公鑰 Aga(modp)\textcolor{red}{A} \equiv \textcolor{red}{g}^a \pmod{\textcolor{red}{p}},並公開。
  3. Bob 也同理隨機選一個私鑰 bb,計算公鑰 Bgb(modp)\textcolor{red}{B} \equiv \textcolor{red}{g}^b \pmod{\textcolor{red}{p}},並公開。
  4. KBaAbgab(modp)K \equiv \textcolor{red}{B}^a \equiv \textcolor{red}{A}^b \equiv \textcolor{red}{g}^{ab} \pmod{\textcolor{red}{p}},這就是雙方協商出來的密鑰。

然後就可以拿這個 KK 去對稱加密通信了。

安全性在於想從計算 AABB 計算出 KK,需要解出 aabb,但這是離散對數問題,目前沒有多項式複雜度算法。

橢圓曲線

橢圓曲線不是圓錐曲線,而是類似 y2=x3+ax+by^2 = x^3 + ax + b 的曲線。在 modp\bmod p 意義下橢圓曲線上的點可以定義加法乘法。所以自然能想到把上面這些算法搬到橢圓曲線上。

好處是橢圓曲線離散對數問題比 RSA 更難一點,因此用更短的密鑰能達到同等的安全性。

簽名

非對稱加密還有一個用途就是用於簽名,其實相當於將 RSA 逆用,RSA 的公鑰私鑰有明顯的對稱性。

Alice 有一對 RSA 公私鑰,然後又發佈了一條消息,怎麼證明這條消息確實是 Alice 發佈的?

Alice 只需要將這條消息的 hash 值用自己的私鑰加密得到 h,然後將其公佈。

如果你能用 Alice 的公鑰,將 h 解密得到正確的 hash 值,那麼就能證明 Alice 極可能有 RSA 私鑰。道理和之前的 RSA 通信是一樣的。

密鑰代表人嗎?

上面的過程依賴一件事情,Alice 發佈的密鑰真的是 Alice 發佈的。不安全的信道裏,很可能有不法分子在中途篡改 Alice 的消息,導致在最初傳遞密鑰的時候就出錯了。後面一切的加密都白搭。

所以怎麼辦呢,沒有好的辦法。

一個想法是,不要用不安全的信道傳輸消息。比如 Alice 和 Bob 可以線下碰頭,相互交換密鑰,這樣安全性會高很多。

但是問題來了,線下碰頭成本太高了。並非只有人與人交流纔有加密的需求,很多時候你訪問網站,確認網站發送的消息真的是網站發送的,保持一定的保密性,同樣很重要。結果很荒唐了,本來是爲連接世界的互聯網,結果爲了保證絕對安全,只在線下可以接觸的地方互聯,真是互聯了個寂寞。

還有想法是,建立權威的證書頒發機構,也就是 CA。大體思想是 CA 幫你驗證了很多網站的證書合法性,如果你相信 CA 的話,那就相信這些網站吧。但是建立權威的 CA 本身比較中心化,而且很可能有可信度問題。

但至少在這個層面上,人們往往願意用隱私換取便利。

量子計算機

Shor 算法可以多項式複雜度內分解質因數。所以隨着量子計算機的發展,所以上面提到的 RSA、DH,以及他們的橢圓曲線版本,在幾十年後都很可能失效。

好在人類還是發明了一些足以應對量子計算的加密算法,什麼 Kyber 之類,但是我不會😵‍💫。

所以,到這裏,如果暫時不管量子計算機的話,你可以發現,通過上面的加密手段,設計一個安全的代理、一個安全的通訊軟件、安全的存放文件,其實都不難,並且這樣的技術已經相當成熟了。

這是數學,永遠是對的。

加密與犯罪

加密技術既能維護用戶隱私安全,又可能被惡意分子濫用。警方無法從端到端加密軟件中獲取情報。那麼政府應該禁止這種端到端的通信軟件嗎?這是目前很多國家還在爭議的話題。

我認爲不應該。

  1. 這種軟件實現上並不困難。加密算法一旦公開,邊難以收回。政府封鎖往往只會讓守法公民受限,而犯罪分子猖獗。
  2. 保護公民隱私,防止信息洩露,對於打擊電信詐騙也有積極意義。
  3. 很多人認爲通信隱私權屬於基本人權。

密碼管理

但是這些東西很大程度上依賴於用戶的密碼,假如說加密用的密碼是 123456,那上面的一切加密都白搭了。

因此我特別推薦用密碼管理器,我用的是 KeePass,東西放在本地比放在雲端安全一點。多用複雜隨機生成的密碼,然後自己只需要記憶一個強的主密碼就行了。

上游

然而,有太多事情是你掌控不了的。比如你用的 Firefox 或者 Chromium,幾千萬行代碼,可能沒有漏洞嗎?於是安全性其實是建立在上億行你從來沒有看過,也不可能看過的代碼之上。開源軟件雖然給了人們閱讀甚至自己修改代碼的自由,但是不等於安全。而人們傾向於相信有更專業的人已經審閱過了,便無條件相信。況且,對於 99% 以上的人來說,也只能無條件相信,畢竟想要編譯 Firefox 都是要有一定水平的。

xkcd dependency

Linus’s law 說:given enough eyeballs, all bugs are shallow。但是真的有 enough eyeballs 嗎?最後網絡安全的大廈落在了極少數默默無聞開發者的良心上。

開源軟件的開發不應該只是慈善事業。

用戶應該有「不安全」的自由

這個「安全」打引號。

除了這些開源軟件尚且可以看一看源代碼,人們每天還依賴很多閉源商業公司產品,比如手機,戶晨風最喜歡的蘋果,其操作系統本來就是封閉的,許多 Android 手機的廠商定製系統也是封閉的。它們面向的客戶 99% 不懂技術,它們也不希望用戶懂技術。

打着安全的旗號,爲你好,無非只是希望你少用競爭對手的產品,爲自己更好地謀求利益罷了。

當然也不只是商業公司。

線下真實

網絡安全到最後,大道至簡,竟是社會工程學。技術絕對不是萬能的,很多時候安全問題不止在數學和算法。

前面這麼多這麼牛的加密方法,真的有用嗎?

應當明確一點,加密≠沒有特徵。所以不需要能夠解密你的加密數據,只需看出你的數據是刻意加過密的,便知道你很可能心裏有鬼。所以優秀的代理軟件往往會傾向於模仿正常流量,以免被注意。

如果有一天,刀子就架在你的脖子上了,到底是你的數據隱私重要,還是生命重要,只有你自己知道。