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位。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM