RSA的加解密原理
歡迎轉載,但請指明出處:https://www.cnblogs.com/zhizaixingzou/p/10241100.html
RSA演算法是三位數學家Rivest、Shamir和Adleman於1977年設計出來的,關於RSA演算法的原理有文章已講得很清晰,請見:
http://www.ruanyifeng.com/blog/2013/06/rsa_algorithm_part_one.html
http://www.ruanyifeng.com/blog/2013/07/rsa_algorithm_part_two.html
1)生成金鑰對的過程
隨機選擇兩個不相等的質數p和q。
n=p*q。n的二進位制表示的位數即金鑰長度。
φ(n)= φ(p)* φ(q)=(p-1)*(q-1)。此等式源自於兩個數論規律,其一互質的兩個數的積的尤拉函式值等於兩個數的尤拉函式值的積,其二質數的尤拉函式值比該質數少1。
隨機選擇一個整數e,滿足1< e < φ(n),且e與φ(n) 互質。
找到一個整數的,滿足ed ≡ 1 (mod φ(n))。
(n, e)即為公鑰,(n, d)即為私鑰。
2)加解密的過程
假設加密使用公鑰。傳送方握有的公鑰是(n, e),要加密的是整數m。m必須小於n。
通過me ≡ c (mod n)得到的整數c就是密文。
接收方握有的私鑰是(n, d),他或她接收到了整數c。
通過cd ≡ m (mod n)得到的整數m就是傳送方實際傳送的明文。
加密實際上是針對小於n的整數來的,這是前提。
但如果n是1024位(128位元組),那麼m也可以足夠大,通常可以選擇64位元組表示。也正因為如此,一段長訊息,我們將它編碼為位元組陣列,然後每64位元組成為一個整數,逐個整數加密,得到的密文整數也為固定個數的位元組來表示,解密就按此固定位元組數逐個完成後在拼接。
另外,之所以這樣加解密是成立的,在於me ≡ c (mod n)和cd ≡ m (mod n)互為充分必要條件,即互相可以推到出。顯然,反過來使用私鑰加密、公鑰解密也是成立的,它們的形式也具有完美的對稱性。
3)演算法的安全性
金鑰對生成的過程中共出現5個數字p、q、n、e和d,它的安全性在於對d的保密:
ed ≡ 1 (mod φ(n))。要得到d,需要知道φ(n)。
φ(n)=(p-1)(q-1)。要得到φ(n),需要知道p和q。
n=pq。要得到p和q,需要對n進行質因數分解。
通過這個過程,提示我們要做到三點:
其一,妥善保管祕鑰,只能自己知道。
其二,對極大整數的質因數分解是足夠難的,這個依賴於數學規律的不被發現。而我們要做或者說能做的是滿足這個前提,即選取的p和q應該足夠大。
其三,在數學規律不被發現的情況下,也可以通過暴力破解(也就是指定n,不斷假設p,到q是整數且與p互質),為了增加破解的難度,也要求n=p*q足夠大。
總之,該演算法被證明非常可靠,而且金鑰越長則越難破解,常用1024位,更高等級的安全性要求中則使用2048位。