一、前言
RSA算法是一種非對稱的加密算法,它通常是先生成一對RSA密鑰,其中之一是保密密鑰(私鑰),由用戶保存;另一個為公開密鑰(公鑰),
可對外公開;要加密傳輸內容時,比如A要給B傳輸信息,此時A先用B的公鑰將內容加密后傳輸,B收到A傳輸過來的信息后用自己的私鑰解密.

該過程中,只要B不泄露自己的私鑰,那么就算第三方截取到了該信息,沒有B的私鑰也無法解密獲得內容信息.
RSA算法的安全性依賴於大數分解,計算兩個大素數的乘積很容易,但是反過來由該乘積分解成兩個素數相乘,如果該乘積夠大的話,分解的難
度是極其大的.正式進入RSA算法的討論之前,先來了解一下歐拉函數、歐拉定理、模反元素.
二、歐拉函數
2.1 什么是歐拉函數
歐拉函數是小於x的整數中與x互素的數的個數,一般用φ(x)表示。特殊的,φ(1)=1.
2.2 如何計算歐拉函數
通式:φ(n)=n*(1-1/p1)*(1-1/p2)*(1-1/p3)*(1-1/p4)*…*(1-1/pn),其中p1, p2……pn為n的所有素因數,n是不為0的整數.
2.3 歐拉函數的一些性質
1. 對於素數p,φ(p)=p−1
2. 若p為素數,n=p^k,則φ(n)=p^k-p^(k-1)
3. 歐拉函數是積性函數,但不是完全積性函數;若m,n互素,則φ(m∗n)=φ(m)∗φ(n),特殊的,當m=2,n為奇數時,φ(2*n)=φ(n)
4. 當n>2時,φ(n)是偶數
5. 小於n的數中,與n互素的數的總和為:φ(n) * n / 2 (n>1)
6. n=∑d∣nφ(d),即n的因數(包括1和它自己)的歐拉函數之和等於n
三、歐拉定理
歐拉定理是指:如果兩個正整數a和n互素,則n的歐拉函數φ(n)可以讓下面的式子成立:

即a的φ(n)次方減去1,可以被n整除. 比如,3和4互質,φ(4)=2,(3^2-1)/4=2. 當a為正整數,n為素數且a不能被n整除時,則有
a^(n-1) ≡ 1 (mod n)
這就是費馬小定理.
四、模反元素
如果兩個正整數a和n互素,那么一定可以找到整數b,使得 ab-1 被n整除,或者說ab被n除的余數是1. 這時,b就叫做a對模數n的模反元素.

歐拉定理可以用來證明模反元素必然存在,如下圖,可以看到:a的 φ(n)-1 次方,就是a對模數n的模反元素.

五、RSA算法
5.1 密鑰的生成過程
- 1. 隨意選擇兩個大的素數p和q,p不等於q,計算n = pq.
- 2. 根據歐拉函數的性質3,求得r=φ(n)=φ(p)φ(q)=(p-1)(q-1).
- 3. 選擇一個小於r的整數e,且e與r互素;並求得e關於r的模反元素,命名為d.(模反元素存在,當且僅當e與r互質; 求d令ed≡1(mod r))
- 4. 將p和q的記錄銷毀
其中(n,e)是公鑰,(n,d)是私鑰. 例如:
- 1. A隨機選兩個不相等的質數61和53,並計算兩數的積n=61*53=3233,n的長度就是密鑰長度。3233的二進制是110010100001,一共12位,
- 所以這個密鑰就是12位. 實際應用中,RSA密鑰一般是1024位,重要的場合是2048位.
- 2. 計算n的歐拉函數; φ(n)=(p-1)(q-1)=60*52=3120.
- 3. A在1到3120上隨機選擇了一個隨機數e=17,與3120互素.
- 4. 計算e對φ(n)的模反元素d,即時,ed-1=kφ(n)。
- 即使求解:17x+3120y=1.用擴展歐幾里得算法求解。可以算出一組解(x,y)=(2753,-15),即d=2753. 公鑰(3233, 17),私鑰(3233,2753)
至此完成計算.
5.2 RSA的可靠性
在RSA私鑰和公鑰生成的過程中,共出現過p,q,n,φ(N),e,d,其中n,e組成公鑰,其他的都不是公開的,一旦d泄露,就等於私鑰泄露;
那么能不能根據n,e推導出d呢?
1. ed ≡ 1(mod φ(n)) 只有知道e和φ(n),才能算出d
2. φ(n)=(p-1)(q-1) 只有知道p和q,才能算出φ(n)
3. n=pq,只有將n分解才能算出p和q
所以,只有將n素因數分解,才能算出d; 也就意味着私鑰破譯. 但是,大整數的質因數分解是非常困難的. 所以理論上來說,如果我們找到
了快速對大整數進行質因數分解的方法,那么RSA加密也就沒什么安全性可言了;遺憾的是,目前數學上並沒有找到這樣快速的質因數分解方法.
5.3 RSA的加密過程
假設A要向B發送加密信息m,他就要用B的公鑰(n,e)對m進行加密,但m必須是整數(字符串可以取ascii值或unicode值),且m必須小
於n. 所謂加密就是計算下式的c:
m^e ≡ c (mod n)
假設m=65,B的公鑰(3233,17),所以等式如下:
65^17≡2790(mod 3233)
所以c等於2790,A就把2790發給B.
5.4 RSA的解密過程
B收到A發來的2790后,就用自己的私鑰(3233,2755)進行解密
c^d ≡ m (mod n)
也就是c的d次方除以n的余數就是m
2790^2753 ≡ 65 (mod 3233)
因此得到原文65.
六、解密可靠性的證明
即證明由 c^d ≡ m (mod n) (1)解密出的m一定是正確的消息.
證明: 加密公式為 m^e ≡ c (mod n),由該公式可以得到
c = m^e - nk (2)
將(2)代入(1)中,可以得到
(m^e - nk)^d ≡ m (mod n)
簡化之,得到:
m^(ed) ≡ m (mod n)(3)
已知:ed ≡ 1(mod φ(n)),由該式子可以得到
ed = hφ(n)+1 (4)
將(4)代入(3)中,可以得到
m^(hφ(n)+1) ≡ m (mod n) (5)
只要證明(3)(或(5))成立即可. 接下來分為 m、n 互素和 m、n 不互素兩種情況討論
I. m、n互素
由歐拉定理可以知道 m^φ(n) ≡ 1 (mod n)
證明:m^(hφ(n)) ≡ 1 (mod n)
即
m^(hφ(n)) ≡ 1 (mod n)
即
(m^(hφ(n)))*m ≡ m (mod n)
即
m^(hφ(n)+1) ≡ m (mod n)
所以當m、n互素時(5)成立.
II. m、n不互素
由於n=pq,且p、q均為素數,由歐拉定理,有:
(p)^(q-1) ≡ 1 (mod q)
又m、n不互素,則必有m=kp或m=kq;以 m = kp為例,此時k、p必然互素,又由歐拉定理,有:
(k)^(q-1) ≡ 1 (mod q)
證明:(kp)^(q-1) ≡ 1 (mod q)
即 (kp)^(q-1) ≡ 1 (mod q),進一步得到
[(kp)^(q-1)]^[h(p-1)] × kp ≡ kp (mod q)
即
(kp)^(ed) ≡ kp (mod q)
即
(kp)^(ed) = kp + tq
兩邊同時除以p,得到
[(k)^(ed)]*[(p)^(ed-1)] = k + (tq)/p
這時t必然能被p整除,即 t=t'p
(kp)^(ed) = t'pq + kp
因為 m=kp,n=pq,所以
m^(ed) ≡ m (mod n)
於是(3)得到證明. 證畢!
七、參考資料
https://blog.csdn.net/liuzibujian/article/details/81086324 https://blog.csdn.net/qq_36056315/article/details/7990229 https://baike.baidu.com/item/模反元素/20417595?fr=aladdin https://blog.csdn.net/gao131360144/article/details/79966094 http://www.ruanyifeng.com/blog/2013/07/rsa_algorithm_part_two.html