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。


免責聲明!

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



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