非對稱加密--RSA原理淺析

小可長江發表於2019-01-07

來龍去脈

 在1976年以前,所有的加密方法都是同一種模式:加密、解密使用同一種演算法。在互動資料的時候,彼此通訊的雙方就必須將規則告訴對方,否則沒法解密。這種加密與解密使用同一規則的加密方式被稱為對稱加密演算法。那麼加密和解密的規則(簡稱金鑰)的保護就顯得尤其重要,傳遞金鑰的風險也一直是個隱患。
 直到1976年,兩位美國計算機學家:迪菲(W.Diffie)、赫爾曼(M.Hellman)提出了一種嶄新構思,可以在不直接傳遞金鑰的情況下完成金鑰交換,開創了密碼學研究的新方向。這就是“迪菲赫爾曼金鑰交換”演算法,其仍然是一種對稱加密演算法,只是金鑰不再需要傳遞。交換原理如下圖所示:

迪菲赫爾曼金鑰交換原理
其中a,b是在通訊兩端本地的隨機數,g是模p的一個原根,K是交換後產生的金鑰,安全性來源於當p非常大時,已知g,p,A,B很難反算出a,b。離散對數問題是該演算法的基礎。
 1977年,三位麻省理工學院的數學家 羅納德·李維斯特(Ron Rivest)、阿迪·薩莫爾(Adi Shamir)和倫納德·阿德曼(Leonard Adleman)一起設計了一種演算法,可以實現非對稱加密。這就是用他們三個人的名字命名的演算法--RSA演算法。
 要弄清楚RSA的加密原理,先要知道尤拉定理

對於兩個互質的正整數m、n,m^φ(n) mod n ≡ 1
當m<n時不難推匯出:m^(k*φ(n)) mod n ≡ 1
進一步得到:m^(k*φ(n)+1) mod n ≡ m

基於此還需要理解一個概念,模反元素

如果兩個正整數e和x互質,那麼一定可以找到整數d,使得 e*d-1 被x整除。那麼d就是e對於x的“模反元素”
即e*d mod x ≡ 1
等同於 e*d ≡ k*x + 1,k為正整數

敲黑板!!!關鍵來了,上面兩個轉換的結果一碰撞,Duang!就碰出了我們RSA的核心演算法:

當e與φ(n)互質時,m^(e*d) mod n ≡ m

雞不雞凍,開不開森!還有點迷糊?沒關係,來繼續:

假設我們對m進行加密傳輸
加密:m^e mod n = c,
解密:c^d mod n = m^(e*d) mod n = m

上述過程中,n+e就是RSA中的公鑰,n+d就是RSA中的私鑰,c是加密後的密文。

補充:

  1. n會非常大,長度一般為1024個二進位制位,現在穩妥一點的長度為2048個二進位制位。(目前人類已經分解的最大整數,232個十進位制位,768個二進位制位)
  2. 因為需要求出φ(n),所以根據尤拉函式特點,最簡單得到n的方式是由兩個質數相乘: 質數:p1、p2 Φ(n) = (p1 - 1) * (p2 - 1)
  3. 最終由φ(n)得到 e 和 d

總共生成6個數字:p1、p2、n、φ(n)、e、d

關於RSA的安全:

除了公鑰用到了n和e 其餘的4個數字是不公開的。 目前破解RSA得到私鑰d的思路如下:

  1. 由於e*d = φ(n)*k + 1。e是公開的,那必須要知道φ(n)
  2. 要得到φ(n),必須知道p1 和 p2
  3. 由於 n = p1 * p2,所以只有將n因數分解才能算出p1 p2
  4. 量子計算機如果成功誕生,現在通行於銀行及網路等處的RSA加密演算法可以破解,也會瓦解所有基於大質數因式分解算力逆天而衍生出的加密演算法。

後面我會繼續對iOS證書籤名相關原理進行分析,同時把常見的加密演算法做一下梳理和比較,並附上每種演算法在iOS中的程式碼實現。歡迎一起交流學習心得~

相關文章