非對稱加密--RSA原理淺析
來龍去脈
在1976年以前,所有的加密方法都是同一種模式:加密、解密使用同一種演算法。在互動資料的時候,彼此通訊的雙方就必須將規則告訴對方,否則沒法解密。那麼加密和解密的規則(簡稱金鑰),它保護就顯得尤其重要。傳遞金鑰就成為了最大的隱患。這種加密方式被成為對稱加密演算法。
直到1976年,兩位美國計算機學家:迪菲(W.Diffie)、赫爾曼(M.Hellman)提出了一種嶄新構思,可以在不直接傳遞金鑰的情況下完成金鑰交換,開創了密碼學研究的新方向。這就是“迪菲赫爾曼金鑰交換”演算法,其仍然是一種對稱加密演算法,只是金鑰不再需要傳遞。交換原理如下圖所示:
1977年,三位麻省理工學院的數學家 羅納德·李維斯特(Ron Rivest)、阿迪·薩莫爾(Adi Shamir)和倫納德·阿德曼(Leonard Adleman)一起設計了一種演算法,可以實現非對稱加密。這就是用他們三個人的名字命名的演算法-- RSA演算法。
要弄清楚RSA的加密原理,先要知道 尤拉定理:
對於兩個互質的正整數m、n,m^φ(n) ≡ 1
當m<n時不難推匯出:m^(k*φ(n)) ≡ 1
進一步得到:m^(k*φ(n)+1) ≡ 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是加密後的密文。
補充:
- n會非常大,長度一般為1024個二進位制位,現在穩妥一點的長度為2048個二進位制位。(目前人類已經分解的最大整數,232個十進位制位,768個二進位制位)
- 由於需要求出φ(n),所以根據歐函式特點,最簡單的方式n 由兩個質數相乘得到: 質數:p1、p2 Φ(n) = (p1 -1) * (p2 - 1)
- 最終由φ(n)得到 e 和 d 。
總共生成6個數字:p1、p2、n、φ(n)、e、d
關於RSA的安全:
除了公鑰用到了n和e 其餘的4個數字是不公開的。 目前破解RSA得到d的方式如下:
- 要想求出私鑰 d 。由於e*d = φ(n)*k + 1。要知道e和φ(n);
- e是知道的,但是要得到 φ(n),必須知道p1 和 p2。
- 由於 n=p1*p2。只有將n因數分解才能算出。
- 量子計算機如果成功誕生,現在通行於銀行及網路等處的RSA加密演算法可以破解,也會瓦解所有基於大質數因式分解算力逆天而衍生出的加密演算法。
後面我會繼續對iOS證書籤名相關原理進行分析,同時把常見的加密演算法做一下梳理和比較,並附上每種演算法在iOS中的程式碼實現。歡迎一起交流學習心得~