作者:karmayu@騰訊安全云鼎實驗室
公眾號:https://mp.weixin.qq.com/s/fdq9ar_bl5XH5gV1N-Zv3w
相關閱讀:《密碼朋克的社會實驗(一):開燈看暗網》
密碼朋克奠定了互聯網的許多底層技術和通信協議,從 RSA 到 HTTPS,從 Tor 到區塊鏈。上一篇聊了暗網,這次我想聊聊它背后的密碼學。
密碼學遠不是一篇文章可以聊清楚,大概連當目錄都不夠。因此,我的目標僅僅是,寫一篇小學生也能懂的密碼學入門。
信息和編碼
看過一個有意思的說法,宇宙如此紛繁,但歸根結底就是三件事:信息、結構和通信。物質則是一種結構化的信息。
整個宇宙無盡的信息汪洋中,萬物有無數種通信方式。而人類,進化出眼睛、耳朵、鼻子、舌頭等接口與外界進行信息交換,導致神經系統或細胞物質的變化,再由大腦解碼分析出外界的信息,從而達到通信的目的。
另一方面,畢竟人類不能像阿凡達一樣,可以通過頭發接入神樹來與同類進行通信。建立在通信需求上,則產生了語言,而非面對面通信的需求又進一步產生了文字。
文字的本質則是信息的符號化。
借由文字,我們可以做到跨越時間和空間的通信,例如各種古代器物上的銘文。
到了信息化時代,由于信息傳輸的需要,文字(聲音、圖像)信息,需要被進一步抽象成數字化,于是產生了例如摩爾斯電碼、ASCII 碼、Unicode 碼等信息編碼方式。例如:
- 在摩爾斯電碼中,字母「A」使用「·-」表示。
- 在 ASCII 碼中字母「A」使用十六進制數「0x41」表示。
- 在 Unicode 碼中漢字「山」使用十六進制數「0x5c71」表示。
當信息經過這個逐步抽象的發展過程之后,隨著人類文明的發展,我們便進入了到了數字化時代,也可以開始討論密碼學了。
密碼學發展史
密碼,本質就是信息的非標準編碼。
密碼幾乎和人類文明一樣悠久。宮闈大內的隱秘符號、江湖幫派的黑話切口、古書上的不明索引、耳機里的奇怪電波……無不是為了滿足人類隱秘通信的需要。
1. 古代密碼術
古代密碼術,由于人類文明還沒有發展到數字化時代,所以加密通常不摻雜復雜的數學運算,相對來說,加密還處于比較樸素的時代。
古代密碼術通常使用兩類方案進行加密:
-
符號替換法
-
順序改變法
如先秦兵書《太公兵法》就有記載使用「陰符」進行軍隊通信,就是通過特定長度的「符」來表示不同的信息,屬于符號替換法。
大勝克敵之符,長一尺;
破軍擒將之符,長九寸;
降城得邑之符,長八寸;
卻敵報遠之符,長七寸;
警眾堅守之符,長六寸;
請糧益兵之符,長五寸;
敗軍亡將之符,長四寸;
失利亡士之符,長三寸。
同樣在公元前,古希臘時期,斯巴達軍隊捕獲了一名從波斯帝國回雅典送信的雅典信使。可搜查了好大一陣,除了從他身上搜出一條布滿雜亂無章的希臘字母的普通腰帶外,別無他獲。斯巴達軍隊統帥萊桑德百思不得其解,直到有一天,無意中把腰帶纏繞到劍鞘上,雜亂的字母竟組成了一段文字,因此獲得了情報取得了戰爭的勝利。
這就屬于加密方案中的順序改變法。
2. 近代戰爭時期
經過近年來諜戰片的熏陶,密碼學這個詞,在大眾的認知里,往往和「戰爭」和「情報」等關鍵詞聯系在一起。相關從業人群的桌面大概是這個畫風。
事實也確實如此,尤其是在20世紀的兩次世界大戰中。由于無線電和摩爾斯電碼的問世,密碼學也迎來了空前的繁榮。數學開始深刻地參與到密碼學,也逐漸發展出了現代密碼學。
「加密」與「破譯」成為信息保密傳輸與情報獲取的激烈對抗領域,雙方斗智斗勇。其中,最著名的就是一戰時期,英國成功破解德國「齊默爾曼電報」,使美國放棄中立地位而對德宣戰,最終以英國為首的協約國贏得了戰爭勝利。
二戰時期,納粹德國啟用了著名的「恩尼格瑪」密碼機,一時,盟軍完全無法破解出德國的情報。直到密碼學家組合「波蘭三杰」及圖靈為破解恩尼格瑪作出巨大貢獻,為盟軍破解了大量德軍的情報。
從設備可以看出,這個階段,密碼學已經進入機械化階段。
3. 計算機時代
進入計算機時代,終于迎來了密碼學的黃金時期。同時,誕生了一些極重要的理論,例如后面會重點介紹的消息摘要、非對稱加密。這些算法需要較強的計算能力支持,在沒有計算機的時代難以應用。同時,也正是這些密碼學理論奠定了互聯網的底層安全特性。
密碼學研究什么
說到密碼學,普通人想到的多是前面提到的摩爾斯電碼、移位加密、字符替換之類。在一些小說里,「字母e在英文里出現頻率最高」這種基本的破解方法很多人也都耳熟能詳。
但真正說到密碼學研究什么,大家其實都比較陌生。密碼學關注的事情主要有兩點:
- 加密解密的數學算法本身
- 如何在現有算法基礎上實現各種安全需求
這兩點的差別是什么呢,以防止「消息泄漏」舉例,我們首先想到的防止消息傳輸過程被第三方截獲,比如說話被偷聽、郵件被偷看、網絡數據被截獲。而事實上,小偷是防不住的,但我們可以保證數據被偷到了也沒有用,只需要雙方事先約定一套加密解密的方法,以密文的方式傳輸信息,就可以很好地防止信息泄漏。
但有時候「消息泄露」的內涵要更復雜,加密算法的方案并不適用。
考慮這樣一個情形:公司某小組有8個員工,他們想知道組內平均月薪是多少,但是大家都不愿意透露自己的月薪數額,公司制度也不允許討論薪水。有什么辦法可以得出答案又不泄漏薪水數額?
其實辦法很簡單,甚至不需要用到密碼學知識:
- 大家坐成一圈,A 隨便想一個大數,比如123456,然后他在紙上寫下自己月薪和這個數字之和,傳給 B;
- B 再在這個數字上加上自己的月薪寫到另一張紙上傳給 C;
- 直到最后一個人把紙條傳回 A,A 把最終結果減去只有自己知道的123456,就得到了所有人的月薪總和。
就這樣,沒有人泄漏敏感信息又得到了需要的結果,還沒有違反公司制度!
以上兩種情況分別對應了密碼學的兩個研究方向,可以看到,密碼學不僅研究加密解密的數學算法。更多的時候,密碼學研究保護信息安全的策略,我們稱之為「協議」。
密碼學三板斧
《一代宗師》中,葉問靠詠春三板斧「攤、膀、伏」闖關金樓。
在密碼學中也有類似的三板斧,對于科普讀者來說,無論是希望理解 HTTPS、暗網,還是比特幣等密碼學應用,其實只需要理解三個概念:
- 單向散列(Hash)
- 對稱加密
- 非對稱加密
下面逐一解釋:
1. 硬幣扔出的 Hash
現在設想這樣一個場景:周末公司有臨時事務要加班,Alice 和 Bob 商量誰去處理,但大家都不想去。于是 Bob 想了一個辦法,說:「我扔一個硬幣,你猜是正面還是反面?如果猜對了,我就去加班。如果猜錯了,嘿嘿……」。
如果 Alice 和 Bob 此時是面對面在一起,那么這個策略可以說相當公平,甚至可以用更簡單的辦法做到,兩人玩一盤石頭剪子布就好了。可是如果他們是通過網絡聊天在商量呢,那 Alice 顯然不會同意這個辦法,因為她擔心自己無論猜正面還是反面,Bob 都會說她錯了。
有沒有辦法在網絡聊天也能做到公平扔硬幣呢,有人會說,那我們給扔硬幣的結果加個密吧。現在假設任意奇數都代表硬幣的正面,任意偶數都代表硬幣的反面。Bob隨便想一個數,然后乘以另外一個數,把結果先告訴 Alice,比如1234 * 531 = 622254,Bob想的是1234,然后把622254告訴 Alice,并聲稱另一個秘密數531是密鑰,由他自己保管。這樣顯然也不行,因為驗證結果的時候,Bob 可以謊報說1234才是密鑰,531是結果,這樣 Bob 依然立于不敗之地。但是如果 Bob 事先把密鑰公布出來呢?這樣也不行,因為 Alice 知道密鑰后就能直接計算出原文了,便失去了保密作用。
傳統的加密方法不能公開的原因是,知道了加密方法也就知道了解密方法,只需要反過來計算就好了。那么,有沒有一種加密方法,使得即使知道了加密方法,也不能恢復出原文呢?有的,只需要在加密過程中加入一些不可逆運算就行了。這次 Bob 又設計了一種方案:
- Bob 先想一個數,并加上123456。
- 把結果平方,取第3至第10位,組成一個8位數。
- 再用這個數除以456789求余數,把這個結果告訴 Alice。
- Alice 猜測 Bob 想的是奇數還是偶數。
- Bob 告訴 Alice 原始值,Alice 驗算確認。
假設Bob想的依然是1234,按照上面的過程依次得到:
- 1234 + 123456 = 124690
- 124690 * 124690 = 15547596100
- 54759610 mod 456789 = 401719
Alice 拿到的結果是401719,既可以驗證 Bob 有沒有撒謊,同時 Alice 又很難根據401719算回1234。
但這樣也不能100%保證 Bob 不作弊,如果Bob想作弊,他就必須事先找到一奇一偶兩個數,按照上面的運算能得到一樣的結果。這個難度取決于上面算法的難度。
在密碼學中把這種會丟掉一部分信息的加密叫做「單向加密」,也叫做哈希(Hash)算法。 一個可靠的哈希算法至少需要滿足下面幾個條件:
- 對于給定的數據 M,很容易算出哈希值 X = F(M)。
- 根據 X,很難算出 M。
- 很難找到 M 和 N,令 F(M) = F(N)。
真實世界的哈希算法比上面的過程要復雜得多,但原理是類似的。而且即使對于很長一段數據,僅僅改變一個字母,也會造成2次哈希結果的巨大差異。被認為安全且在互聯網中被廣泛使用的哈希算法包括 MD5、SHA-1、SHA-256 、國密 SM3 等。比如「1234」使用 MD5 算法計算的結果是「81DC9BDB52D04DC20036DBD8313ED055」。
這種單向加密算法,并不能用來進行普通的信息傳輸,更多的是用來進行數據的完整性驗證。
2. 歷久彌新的對稱加密
對稱加密就是大眾心里認為的那種加密,使用密碼 A 加密,同樣使用密碼 A 解密。這其實是最符合直覺的一件事情。
- 比如我向左移動了3米,要回到原點,那么就再向右移動3米就好了。
- 比如做了個乘法,要還原數字,就做一次同樣的除法就好。
傳統的密碼學其實使用的都是對稱加密,無論是移位、變換、混淆、擴散,本質上都可以通過逆運算恢復原始信息。
所以,這塊不詳細解說,只需要知道這叫做對稱加密就好。常用的對稱加密算法有 DES、3DES、AES、國密 SM4,算法細節本文不細聊。對稱加密具有優秀的性能和安全性,關鍵就在于如何商定密鑰,此時就需要下面的非對稱加密了。
3. 數學魔術和非對稱加密
來看真正要進行秘密信息傳輸的情況。
假設 Alice 和 Bob 要通過互聯網進行一份絕密情報的傳輸,如何阻止第三方在網絡上截獲信息?
如果用對稱加密的思路,可能的步驟是使用壓縮工具對文件進行加密壓縮,然后通過 Email 把加密過的文件發過去,為了更安全或許還會另外通過發短信或者打電話把解壓密碼告訴對方。但是作為絕密情報傳輸,面對國家機器的力量,上面的過程依然可能泄密。如果想辦法把密碼加密后再發過去,但是給密碼加密的方式又該如何確定呢?如果 Alice 和 Bob 事先認識,或許可以見面約定一個生日加上手機號作為密碼,但更多的情形下,雙方并沒有可以利用的公共秘密。
對稱加密世界里這是個看似死循環的無解問題。這里我們有2種思路來嘗試解決:
- 設計一個秘密的加密算法,即使對方拿到密碼也沒有辦法解密。
- 設計一種神奇的加密系統,可以讓加密和解密用不同的密碼。這樣 Bob 可以大大方方的把加密密鑰告訴 Alice,Alice 加密完發給 Bob 就行了,完全不怕監聽。
秘密算法顯然是不考慮的,密碼學有一個公認的原則——加密的安全性永遠不能建立在算法的保密上。
回到我們設想的神奇加密算法上,似乎這是一個完美的方案,但是這樣的技術存在嗎?聽上去似乎并不可能,直覺上知道了加密方法一定就知道解密方法了,只需要反過來計算就可以了。加密方法和解密方法是否可能不對稱?
話都說到這份上了,當然是必須可能!其實這門技術在小學就學過。
來看一個小時候《趣味數學》這類書里的數學小魔術:
讓對方任意想一個3位數,并把這個數和91相乘,然后告訴我積的最后三位數,我就可以猜出對方想的是什么數字!
- 比如 A 想的是123,計算出123 * 91 = 11193,并把結果的末三位193告訴我。
- 我只需要把193乘以11,乘積的末三位就是對方剛開始想的數了。可以驗證一下,193 * 11 = 2123。
其實原理很簡單,91乘以11等于1001,而任何一個三位數乘以1001后,末三位顯然都不變(例如123乘以1001就等于123123)。
知道原理后,我們可以構造一個定義域和值域更大的加密解密系統。
- 任意一個數乘以400000001后,末8位都不變,而400000001 = 19801 * 20201,于是你來乘以19801,我來乘以20201,又一個加密解密不對稱的系統就構造好了。
- 甚至可以構造得更大一些:4000000000000000000000000000001 = 1199481995446957 * 3334772856269093,這樣我們就成功構造了一個30位的加密系統。
這是一件非常 cooooooool 的事情,任何人都可以按照我公布的方法加密一個數,但是只有我才知道怎么把所得的密文變回去。其安全性就建立在算乘積非常容易,但是要把4000000000000000000000000000001分解成后面兩個數相乘,在沒有計算機的時代幾乎不可能成功!
但如果僅僅按照上面的思路,如果對方知道原理,非常很容易窮舉出400000001這個目標值。要解決這個問題,真實世界就不是使用乘法了,比如 RSA 算法使用的是指數和取模運算,但本質上就是上面這套思想。
在非對稱加密的基礎上,就能衍生出數字證書、數字簽名、HTTPS 等等互聯網底層安全機制。常見的非對稱加密算法有 RSA、ECC 、國密 SM2 等。
真實世界
在真實場景中,會將三板斧組合使用來構造協議,比如「Hash + 對稱加密」可以組合成「消息認證碼(MAC)」機制;而非對稱加密反向使用,用私鑰加密信息向外發布,所有人可用公鑰解密,則可以起到「數字簽名」的效果。
回到前面設想的場景,Alice 和 Bob 進行絕密通信時,應該如何構造協議呢?大概會是這樣:
- Bob 生成一對非對稱密鑰,分別為公鑰 A 和私鑰 B,A/B 互相可解密對方加密的數據。
- Bob 將公鑰 A 告訴 Alice。
- Alice 生成一個對稱密鑰 C,并加密情報得到密文 D(性能原因,一般不用非對稱算法加密大段信息)。
- Alice 用公鑰 A 加密 C 得到密文 E,并計算情報的 Hash 值 F。
- Alice 將 D、E、F 全部發給 Bob。
- Bob 使用私鑰 B 解密 E 得到密鑰 C,并用 C 解密密文 D,再計算解密結果的 Hash 是否等于 F。
當然上面還有一些問題要解決,比如如何保證 Bob 告訴 Alice 的公鑰 A 沒有在傳輸過程中被篡改。可見,在擁有安全算法之后,密碼學的協議研究也是至關重要的。
寫在最后
從密碼學退回符號學領域,其實符號的應用遠超人們的注意,除了文字本身也是符號外,更廣義的符號如:從 QQ 表情到電路圖,從十字架到八卦圖,從比心動作到金字塔造型,從樂譜到天干地支,從表情包大戰到道士抓鬼畫「符」……人類發明了太多符號用來傳遞信息。
很多學問的本質其實就是從符號還原出原始信息,比如把樂譜演奏成音樂、讀詩歌和作者共鳴、禪宗的拈花微笑、斗圖時的會心一擊,無不充滿意趣。《莊子·知北游》言:「天地有大美而不言」,此等無法描繪無法言說之信息,卻讓人有醍醐灌頂般的美妙,大概就是通信的巔峰了。
密碼學其實只是廣義通信的一個極小分支,并且里面還有太多基礎數學、算法、協議場景,需要進行專門的學習。本篇只講這么多,只要理解了密碼學三板斧,就有更多應用就等著我們研究了,下期請關注密碼學界近年的當紅辣子雞——比特幣。
騰訊安全云鼎實驗室
關注云主機與云內流量的安全研究和安全運營。利用機器學習與大數據技術實時監控并分析各類風險信息,幫助客戶抵御高級可持續攻擊;聯合騰訊所有安全實驗室進行安全漏洞的研究,確保云計算平臺整體的安全性。相關能力通過騰訊云開放出來,為用戶提供黑客入侵檢測和漏洞風險預警等服務,幫助企業解決服務器安全問題。
本文由 Seebug Paper 發布,如需轉載請注明來源。本文地址:http://www.bjnorthway.com/778/
暫無評論