0x00 前言
網絡中存在兩大類加解密算法-對稱加密和非對稱加密。對稱加密例如DES、AES、TEA、RC4等算法,對稱加密的特性使得和服務器交互的客戶端也必須知道密鑰,所以在一般在應用中(例如安卓的APK)通過逆向手段能夠輕鬆獲取加解密密鑰,從而解密網絡數據(所以外面的免費wifi可不能亂連接,一不小心不法份子就能夠獲取到你的私人信息)。爲了增強加密強度,出現了非對稱加密算法,例如RSA、DH、ECDH等算法。通俗來說就是客戶端和服務器各自保存了一個具有某種關係的不同密鑰,客戶端加密的數據需要使用服務器的密鑰才能解密,只要服務器私鑰不泄露就難以破解出數據。
目前非對稱加密實現有兩種方式:
一種是公私鑰形式,訪問服務器的用戶將會首先獲取服務器下放的公鑰或者APK發佈時就攜帶了公鑰數據文件。客戶端直接使用公鑰進行加密發送,服務器接收到數據使用私鑰解密得到明文數據。例如RSA算法。
另一種則是密鑰協商機制,用戶通訊前雙方密鑰是不存在的,而是在通過網絡數據交換後,通過交換的數據客戶端和服務器將會生成相同的一個用於對稱加密算法的密鑰。例如DH和ECDH。密鑰協商的目的就是爲了在不安全的網絡中生成一個安全的密鑰用於下一步的對稱加密。
非對稱加密應用廣泛,在於其破解難度極其極其極其的高。不同的非對稱加密算法使用了不同的方法保證了破解難度,而實際上都是使用了目前一些無法求解的數學難題。基本上分爲大數的質因數分解、離散對數計算和橢圓曲線離散對數的計算。下文將分別介紹RSA、DH和ECDH算法。
0x01 RSA加密-大素數的質因數分解難度
首先給出RSA加解密步驟:https://blog.csdn.net/jijianshuai/article/details/80582187
- 找出質數 P 、Q
- 計算公共模數 N = P * Q
- 歐拉函數 φ(N) = (P-1)(Q-1)
- 計算公鑰E 1 < E < φ(N) E的取值必須是整數E 和 φ(N) 必須是互質數
- 計算私鑰D E * D % φ(N) = 1
- 加密 C:密文 M:明文
- 解密 C:密文 M:明文
公鑰=(E , N) 私鑰=(D, N)。對外,我們只暴露公鑰。
問題就是從暴露的公鑰中獲取解密私鑰。從上述步驟5生成私鑰的公式中可以看出:需要知道φ(N)的值,就能夠比較容易得到私鑰指數E值,然而 φ(N) = (P-1)(Q-1) ,而公鑰中僅有相關的N= P * Q。簡單的做法就是枚舉N的所有質因數分解,計算φ(N),通過公式5找到一個可能的私鑰結合D去解密數據。若不能解密使用下一組質因數。然而在實際使用中時N是一個非常大的素數,因爲數學中大素數分解困難,目前還沒有很好的辦法,難以從公鑰推出私鑰。
位數較少時還能夠快速解密,操作如下:https://blog.csdn.net/c465869935/article/details/52266867/
該形式算法可直接加密數據。 但是一般而言RSA算法加密數據效率低下,經常採用“RSA+對稱加密“”的方式進行數據通訊。也就是先隨機生成一個對稱加密算法的密鑰A,然後利用RSA算法使用公鑰對該對稱密鑰A加密傳輸給對方,接收方收到數據後利用RSA算法使用私鑰進行解密得到一個相同的密鑰A。此時雙方就有相同的一個密鑰A。後續的數據通訊就使用密鑰A進行對稱加密。例如下面是使用RSA+AES算法進行了一次數據加密傳輸過程:
0x02 DH密鑰協商-離散對數的計算難度
DH(Diffie-Hellman)算法加解密的步驟爲:
https://blog.csdn.net/billbonaparte1/article/details/51471131
https://blog.csdn.net/mrpre/article/details/78025940
假如用戶A和用戶B希望協商一個密鑰。
- 取素數p和整數a,a是p的一個原根,公開a和p。
- A選擇隨機數XA < p,並計算YA = a^XA mod p。
- B選擇隨機數XB < p,並計算YB = a^XB mod p。
- 每一方都將X保密而將Y公開讓另一方得到。
- A計算密鑰的方式是:K = (YB)^XA mod p
- B計算密鑰的方式是:K = (YA)^XB mod p
最後雙方產生了同一個數據,該數據可直接作爲密鑰或者用同一個方法生成其他密鑰的種子。
由於XA和XB是保密的,而第三方只能獲取到p、a、YB、YA,根據步驟2或者3中的公式只有通過取離散對數來確定密鑰,但對於大的素數p,計算離散對數是十分困難的。簡單的說就是在公開a和p情況下,P和XA都是非常大的數,已知XA很容易得到YA。但是已知YA求XA目前是數學中未解決的難題。
0x03 ECDH密鑰協商-橢圓曲線離散對數的計算難度
ECDH算法加解密步驟爲:https://blog.csdn.net/qq_35517886/article/details/78071378
ECDH是EC是“ elliptic curves”的意思,DH是“ Diffie-Hellman”的意思。它實際上是密鑰協商算法,而不是加解密算法。
ECC算法和DH結合使用,用於密鑰磋商,這個密鑰交換算法稱爲ECDH。交換雙方可以在不共享任何祕密的情況下協商出一個密鑰。ECC是建立在基於橢圓曲線的離散對數問題上的密碼體制,給定橢圓曲線上的一個點P,一個整數k,求解Q=kP很容易;給定一個點P、Q,知道Q=kP,求整數k確是一個難題。ECDH即建立在此數學難題之上。密鑰磋商過程:
假設密鑰交換雙方爲Alice、Bob,其有共享曲線參數(橢圓曲線E、階N、基點G)。
- Alice生成隨機整數a,計算A=a*G。 #生成Alice公鑰
- Bob生成隨機整數b,計算B=b*G。 #生產Bob公鑰
- Alice將A傳遞給Bob。A的傳遞可以公開,即攻擊者可以獲取A。由於橢圓曲線的離散對數問題是難題,所以攻擊者不可以通過A、G計算出a。
- Bob將B傳遞給Alice。同理,B的傳遞可以公開。
- Bob收到Alice傳遞的A,計算Q =b*A #Bob通過自己的私鑰和Alice的公鑰得到對稱密鑰Q
- Alice收到Bob傳遞的B,計算Q`=a*B #Alice通過自己的私鑰和Bob的公鑰得到對稱密鑰Q'
- Alice、Bob雙方即得Q=b*A=b*(a*G)=(b*a)*G=(a*b)*G=a*(b*G)=a*B=Q' (交換律和結合律),即雙方得到一致的密鑰Q。
這裏只是給了一個便於理解的說明,大致過程就如上述步驟一樣。至於橢圓曲線其中的原理感興趣的可以進行研究。
0x04 中間人攻擊
這幾個算法利用了數學上難以求解的問題使得第三方無法破解。然而密鑰交換本身並沒有提供通訊雙方的身份驗證服務,第三方可通過中間人攻擊手段直接得到明文數據,例如在DH協商算法中,一箇中間人在信道的中央進行兩次DH密鑰交換,一次和Alice另一次和Bob,就能夠成功的向Alice假裝自己是Bob,反之亦然。而攻擊者可以解密(讀取和存儲)任何一個人的信息並重新加密信息,然後傳遞給另一個人。
一般在密鑰協商算法中爲雙方增加公鑰基礎設施,其實就是https中服務器首先會下發公鑰證書給客戶端,該證書是權威機構經過其數字簽名頒發的,通過公鑰證書爲協商過程中的數據進行數字簽名,達到身份驗證的目的。
使用Fiddler進行https抓包的時候,就類似一箇中間人攻擊。
在理解了這幾個非對稱加密算法加密原理後,前文提到的“RSA+對稱加密“”相比於DH的密鑰協商,RSA的密鑰協商是一個單向協商,而不是雙向獲取數據在生成密鑰。
本文是個總結性的文章,讀者若要了解細節,網絡中的資源以及書籍很豐富,不再贅述。推薦一本入門加解密算法的書:《圖解密碼技術》(日)結城浩(著)。幾天就能看完,輕鬆的能夠了解到加解密技術及其原理