1. 程式人生 > 實用技巧 >RSA加密的原理——為什麼被公鑰加密的可以被私鑰解密?

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。