天天看點

一起學習密碼學:對稱加密與非對稱加密

本文是 一起學習密碼學 系列第 1 篇。

作者:

碼神說
一起學習密碼學:對稱加密與非對稱加密

  • 導讀
  • 密鑰與加密算法
  • 對稱加密
  • 非對稱加密
  • 加密速度測試
  • 混合加密
  • 參考

1導讀

密碼學(cryptography)是一門研究如何隐密地傳遞資訊的學科,是數學和計算機科學的分支。

在近代以前,密碼學隻考慮到消息的機密性,即如何将可了解的消息轉換成難以了解的消息,并且使得收到機密消息的人能夠逆向恢複。近數十年來,這個領域已經擴充到涵蓋身份認證/鑒權(authentication)、消息完整性檢查(message integrity)、數字簽名(signature)、互動證明、安全多方計算等各類技術。

自工作以來,自己對于密碼學的基礎知識,一直是懵懵懂懂,不成體系,為此,我決心要來一次系統化的梳理,廓清迷霧。此外,也為後面介紹 WebRTC 的 DTLS-SRTP 技術做好鋪墊。本文主要梳理對稱加密與非對稱加密的基本原理。

2密鑰與加密算法

密鑰是指用來完成加密、解密、完整性驗證等密碼學應用的秘密資訊(不能洩露),是一串非常大的數字,可以通過随機數生成器(random number generator, RNG)或僞随機數生成器(pseudorandom number generator, PRNG)随機生成。

密鑰的度量機關是 “位” bit,而不是 “位元組” byte。比如,密鑰長度是 128 位,就是 16 位元組的二進制串;密鑰長度是 1024 位,就是 128 位元組的二進制串。

密鑰是加密算法的輸入參數,加密算法使用密鑰加解密,但是密鑰并不是由加密算法本身生成的。

remark: 密鑰與加密算法沒有直接的關系,密鑰實質是很大的整數,但不同的加密算法對密鑰有不同的要求。比如對稱加密算法 AES128,要求密鑰是 128 位的整數,再如非對稱加密算法 RSA1024,要求密鑰是 1024 位的整數,且必須是質數,這些大整數都是由随機數生成,與加密算法無關。

我們可以用鎖和鑰匙來比喻加密算法中的密鑰與加密算法。現實世界中的鑰匙通常是具有一定形狀的金屬片,用來打開鎖,而密碼學中的 “鑰匙”(密鑰)則是用來 “打開” 密文。密鑰就是鑰匙,加密算法就是鎖,上鎖和開鎖必須要有鑰匙,而加密和解密就是上鎖和開鎖的動作。

機密性是資訊安全的基礎。實作機密性的最常用的手段是 “加密”,按照密鑰的使用方式,加密可以分為兩大類:對稱加密和非對稱加密。

3對稱加密

對稱加密的 “對稱” 就是指加密和解密使用同一個密鑰,對稱密鑰又稱為共享密鑰(Pre-Shared key,PSK)。由于對稱加密隻有一個密鑰,是以一定要保證密鑰的安全,才能保證通信的機密性。

對稱加密的原理很簡單。比如,Bob 給 Alice 發消息,在此之前雙方先約定好使用一個對稱密鑰,在雙方通信的過程中傳輸的消息全是密鑰加密後的密文,除了 Bob 和 Alice 之外,沒有人能夠解密。即使有黑客竊聽,看到的也隻是亂碼,因為黑客沒有密鑰,無法解密密文,是以對稱加密實作了機密性。

一起學習密碼學:對稱加密與非對稱加密

目前最流行的對稱加密算法莫過于 AES(Advanced Encryption Standrad),中文譯為 “進階加密标準”。密鑰長度可以是 128,192 或 256 位。因為該算法由比利時密碼學家 Joan Daemen 和 Vincent Rijmen 共同設計,是以又稱 Rijndael 加密法。

note: 說到對稱加密算法,不得不提一下分組加密工作模式的概念。分組加密又稱為塊加密,是一種對稱密鑰算法,它将明文分成多個等長的子產品(block),使用确定的算法和對稱密鑰對每組分别加解密。而工作模式則是用來進行加密和認證,最早有 ECB、CBC、CFB、OFB、CTR 等幾種工作模式,最新的工作模式被稱為 AEAD,常用的是 GCM 和 CCM。

對稱加密看上去實作了通信的機密性,但是卻存在密鑰交換的問題,即密鑰如何安全的傳遞給對方。在上圖中,我們假設黑客沒有對稱密鑰,是以即使竊聽到密文也無法解密。但是如果黑客在密鑰傳遞的途中竊取了密鑰,如下圖所示,那麼他就可以随意加解密收發的資料,通信過程的機密性就蕩然無存了。

一起學習密碼學:對稱加密與非對稱加密

正因為對稱加密無法解決密鑰安全交換的問題,是以出現了非對稱加密。

4非對稱加密

非對稱加密也叫公鑰加密算法。它的 “不對稱” 在于它有兩個密鑰,一個叫 “公鑰”,可以傳遞給任何人(往往通過數字證書的方式傳遞),另一個叫 “私鑰”,必須嚴格保密,公鑰和私鑰是 “一對”,稱為密鑰對(key pair),且具有數學關系。

和對稱加密的密鑰一樣,非對稱加密的公鑰和私鑰也是都可以用來加密與解密的。不過,公鑰加密後隻能用私鑰解密,反過來,私鑰加密後也隻能用公鑰解密,是以,非對稱加密具有 “單向” 性”。

那麼,非對稱加密究竟是如何解決了 “密鑰交換” 的問題呢?很簡單:因為非對稱加密具有 “單向性”,是以公鑰加密後隻能用私鑰解密。又因為用于密鑰交換的是公鑰,私鑰由持有者嚴格保密,是以黑客是拿不到私鑰的,拿不到私鑰就沒法解密。

舉個例子,Alice 生成了一對密鑰,給 Bob 和 Eve 每人一把公鑰,而私鑰則自己持有。這樣當 Bob 和 Eve 給 Alice 發消息的時候就可以用公鑰加密,Alice 則使用自己的私鑰解密,因為黑客 Eve 是無法拿到 Alice 的私鑰的,是以即使他竊聽到密文也無法解密。

一起學習密碼學:對稱加密與非對稱加密

在上面的圖中,我們假設 Bob 隻是單向的給 Alice 發消息,是以需要 Alice 生成一對密鑰對,私鑰自己儲存,公鑰發給 Bob。那麼同理,如果 Alice 要給 Bob 發消息,就需要 Bob 的公鑰,是以 Bob 同樣也要生成一對密鑰對,私鑰自己儲存,公鑰發給 Alice。

關于非對稱加密算法,最著名的莫過于 RSA。1977 年,三位數學家 Rivest、Shamir 和 Adleman 設計了一種算法,可以實作非對稱加密。這種算法用他們三個人的名字命名,叫做 RSA 算法。RSA 這種非對稱加密算法應用在我們熟知的 TLS、DTLS、HTTPS、SSH 協定中。隻要有計算機網絡的地方,就有 RSA 算法,是以,說它是計算機通信安全的基石也不為過。

一起學習密碼學:對稱加密與非對稱加密

RSA 密鑰長度一般取 1024 或者 2048 位 ,密鑰長度越長,就越難被破解。到目前為止,世界上還沒有任何可靠的攻擊 RSA 算法的方式。RSA 算法的原理涉及到一些數論知識,本文就不做介紹了,感興趣的讀者可以看 這篇文章。

公鑰和私鑰的生成方式有很多,比如銀行常見的 U 盾,就是在硬體内部生成。在 Linux/Mac 上,我們則可以使用 ssh-keygen 指令和 openssl 指令來生成 RSA 的公鑰和私鑰,大家可以親自去敲一下指令,加深了解。

remark: 密鑰是個很大的數字(二進制串),然而使用 ssh-keygen 或者 openssl 生成的密鑰是一串很長的字元串,看起來似乎并不是數字。這是因為密鑰經過了 base64 編碼,将二進制資料轉換為了字元串,這樣就增加了密鑰的可讀性,便于密鑰的分發,也便于用編輯器打開密鑰檔案後粘貼複制。而且,在計算機中,一切皆數字,是以字元串也是數字。

5加密速度測試

既然非對稱加密解決了密鑰交換的問題,保證了密鑰的安全性,那麼是否可以用它取代對稱加密呢?答案是,不能。這是因為非對稱加密算法進行的都是大數運算,這使得 RSA 的速度比同樣安全級别的對稱加密算法要慢 1000 倍左右,這一點從 AES 和 RSA 的密鑰長度的差異中就能感受到。

我用 go 寫了 AES 和 RSA 加解密的代碼,來對比二者的加密速度,機器配置是 mac pro 2019,6 核 16 G,程式輸出結果如下圖所示:

一起學習密碼學:對稱加密與非對稱加密

可以知道,在明文相同,加解密次數相同的情況下,RSA 的耗時是 AES 的 1270 倍。在我的 github 有完整的 加解密速度測試代碼。

6混合加密

現在,我們知道了:對稱加密速度快,但是密鑰交換不夠安全,非對稱加密保證了密鑰交換的安全,但是速度又太慢。那麼,有沒有一種能夠魚與熊掌兼得的加密方法呢?

當然有,這就是混合加密,WebRTC 的 DTLS-SRTP 就是使用了混合加密的方式,其大緻原理是:

  1. 通信雙方選擇非對稱加密算法,比如 RSA,準備進行安全的密鑰交換。
  2. 通信雙方使用随機數生成對稱加密算法的會話密鑰,用公鑰加密後發給對方。
  3. 通信雙方各自用私鑰解密,得到對稱加密的會話密鑰。
  4. 之後雙方全部使用對稱加密進行通信。
remark: 由于會話密鑰通過非對稱加密安全傳輸,是以很難被黑客破解。而且會話密鑰一般是一次一密,是一個會話級别的随機數,是以即使被破解也隻是本次會話受影響。

混合加密融合了對稱加密和非對稱加密兩種方式,兼具了性能和安全,保證了通信的機密性,然而這并不代表絕對的安全。在上文介紹非對稱加密的圖中,黑客 Eve 确實是拿不到 Alice 的私鑰了,但是他可以截獲到 Alice 發給 Bob 的公鑰,并且黑客 Eve 也可以生成一對密鑰,私鑰自己儲存,然後把公鑰發給 Alice,讓 Alice 誤以為這是 Bob 的公鑰。也就是說黑客 Eve 對 Alice 扮演了 Bob 的角色,他的這種攻擊行為稱為中間人攻擊。

那麼,該如何解決中間人攻擊的問題呢?一個核心的解決這個問題的思想是:認證消息發送者的身份,也就是證明消息确實是你發的。下一篇我會詳細介紹身份認證的細節,感謝閱讀。

7參考

https://time.geekbang.org/column/article/109062

http://www.ruanyifeng.com/blog/2013/06/rsa_algorithm_part_one.html

https://studygolang.com/articles/28458

https://segmentfault.com/a/1190000021267253

https://zh.wikipedia.org/wiki/進階加密标準 https://zh.wikipedia.org/wiki/密鑰 https://zh.wikipedia.org/wiki/密鑰生成 https://zh.wikipedia.org/wiki/公開密鑰加密 https://zh.wikipedia.org/wiki/密碼學 https://baike.baidu.com/item/RSA算法 https://zh.wikipedia.org/wiki/分組密碼

掃碼入群和作者一起探讨音視訊技術

擷取更多視訊雲行業最新資訊👇

一起學習密碼學:對稱加密與非對稱加密
「視訊雲技術」你最值得關注的音視訊技術公衆号,每周推送來自阿裡雲一線的實踐技術文章,在這裡與音視訊領域一流工程師交流切磋。公衆号背景回複【技術】可加入阿裡雲視訊雲産品技術交流群,和業内大咖一起探讨音視訊技術,擷取更多行業最新資訊。

繼續閱讀