RSA加密的原理——為什麼被公鑰加密的可以被私鑰解密?
轉自:https://blog.csdn.net/doujinlong1/article/details/82051986
目錄
一,RSA 數學理論基礎
二,RSA實現原理
三,RSA加密的過程
引言
在密碼學最開始,都是使用的普通加密模式
A 用加密規則加密了字串m 然後發給B
B 用A的加密規則來解密,得到原始資訊m
在這個過程中A必須把自己的加密規則告訴B,否則B無法解密這段密文,但是如果把加密規則也告訴B,在傳遞金鑰的過程中,可能就會被攔截獲取,這就是最大的問題。
所以,後來又3位數學家提供了一種演算法,實現非對稱加密,後來演算法也以他們三個的首字母命名,R(Rivest)S(Shamir )A(Adleman )演算法。
最開始,我一直理解不了為什麼公鑰加密的可以被私鑰解密,一直停留在使用層面,直到今天看到一篇部落格,才解決了心中的疑惑。
一,RSA 必備數學理論基礎
要理解整個rsa的流程,需要以下數學基礎
1,互質關係
兩個正整數,除1以外,再沒有別的公因子。 比如 2 和3, 2和 9。
2,尤拉函式
任意給定正整數n,請問在小於等於n的正整數之中,有多少個與n構成互質關係?(比如,在1到8之中,有多少個數與8構成互質關係?)
計算上面這個多少個的函式就被成為尤拉函式,以φ(n)表示。在1到8之中,與8形成互質關係的是1、3、5、7,所以 φ(n) = 4。
3,尤拉定理
由上面的尤拉函式可以經過一系列的推導,得到尤拉定理
如果兩個正整數a和n互質,則n的尤拉函式 φ(n) 可以讓下面的等式成立:
4,特殊情況——費馬小定理
尤拉定理的特殊情況,當第二個數n為質數的情況。
假設正整數a與質數p互質,因為質數p的φ§等於p-1,
5,模反元素
如果兩個正整數a和n互質,那麼一定可以找到整數b,使得 ab-1 被n整除,或者說ab被n除的餘數是1。
比如a = 3 ,n = 5,則一定有(a*b)%n =1 ,即3b -1 = 5y,即一定存在一個數2,可以滿足上式。
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-1M5YCtQO-1596075907121)(https://www.z4a.net/images/2018/08/25/image939be76f8b625518.png)]
6,快速冪取模計算
如果有兩個大數a,b,ab可能是一個計算機無法表示的大數,則(ab)%c的值如何計算?
這裡可以使用快速冪取模演算法。
java程式碼如下:
/** * 快速冪取模 計算 (a^b) %c * @param a * @param b * @param c * @return 計算結果 */ private static int quick(int a,int b,int c) { int ans=1; //記錄結果 a=a%c; //預處理,使得a處於c的資料範圍之下 while(b!=0) { if((b&1)==1){ //1即是0000000000000001,判斷個位是否是1.如果b的二進位制位是1,那麼我們的結果是要參與運算的 ans=(ans*a)%c; } b>>=1; //二進位制的移位操作,相當於每次除以2,用二進位制看,就是我們不斷的遍歷b的二進位制位 a=(a*a)%c; //不斷的加倍 } return ans; }
二,RSA實現原理
第一步,選擇兩個不等質數p,q(實際金鑰一般為1024位或2048位)
這裡我們選擇 61 和53。
第二步,計算乘積n
n = p*q = 3233 (二進位制110010100001,只有12位)
第三步,計算n的尤拉函式φ(n)
φ(n) = φ§*φ(q)= (p-1)(q-1) = 3120 。一個質數p的尤拉函式等於p-1
第四步,隨機選擇一個整數e,條件是1< e < φ(n),且e與φ(n) 互質。
取e = 17 (實際應用中,常常選擇65537)。
第五步,計算e對於φ(n)的模反元素d。
即找出一個d滿足 ed互質,且對於φ(n) 取模為1 ,即 ed = 1 (mod φ(n))。
即 ed -1 = kφ(n) ,帶入上面已知條件:
17d -1 = k3120 即 17x +3120y = 1 (據說可以使用 擴充套件歐幾里得演算法求解)
這裡直接給出答案 d = 2753。
第六步,將n和e封裝成公鑰,n和d封裝成私鑰。
代入本次的推導過程中的數字,n = 3233,e = 17, d=2753。公鑰為(3233,17),私鑰為(3233,2723)。
加密使用 (3233,17),解密使用(3233,2723)。
第七步,分析,私鑰的獲取
由六可以看出來,公鑰和私鑰的區別其實只是d,也就是說d的推導是否可以在已知n,e的情況下推匯出來。
由第五步,要得出d,已知n,e。需要φ(n)。
由第三部,要得出φ(n),需要p,q。
而已知n=p*q。而n已知,只需要分解n因子即可。
結論:只要n可以被分解,公私玥加密即可被破解。
第八步,n可以被分解嗎?
在本例中,3233可以很快被破解,但是實際應用中,兩個大質數的積是不容易被分解出來的
例如:
1230186684530117755130494958384962720772853569595334792197322452151726400507263657518745202199786469389956474942774063845925192557326303453731548268507917026122142913461670429214311602221240479274737794080665351419597459856902143413
是以下兩個質數的乘積:
a:
33478071698956898786044169848212690817704794983713768568912431388982883793878002287614711652531743087737814467999489
b:
36746043666799590428244633799627952632279158164343087642676032283815739666511279233373417143396810270092798736308917
人類已經分解的最大整數(232個十進位制位,768個二進位制位)。比它更大的因數分解,還沒有被報道過,因此目前被破解的最長RSA金鑰就是768位。而RSA加密一般使用1024位或者2048位,基本可以理解為不可破解
三,RSA加密的過程
1,公鑰(n,e)加密
所有字串都可以使用ascil碼/unicode值來表示,假設一個字元 m = a,ascii碼為65,需要滿足 m < n 對他進行加密。
m^e ≡ c (mod n),c為加密字串
n = 3233,e = 17。 上式可以表示為: (65^17)%3233 = c ,c = 2790。
2,私鑰(n,d)解密
(n,d) = (3233,2723) 。在拿到c = 2790之後,進行以下操作:
c^d ≡ m (mod n) 即可得到m 。
推導,m = (2790^2723) %3233 ,在這裡使用 必備知識六中的快速冪取模,可以輕鬆得到答案,m = 65。