起因是恰好最近正在學密碼學相關的內容,然后看到知乎有梳理的很不錯的文章,就想看來自己再總結一下。
1 對稱加密與非對稱加密
首先,RSA是典型的非對稱加密算法。這里就需要與傳統的對稱加密進行區分。
從前有個女孩叫做Alice,她想告訴Bob一個秘密。然而有個叫Eve的人想要偷聽。所以Alice需要想辦法加密這條信息,防止Eve偷聽。
古典的思路是:Alice和Bob提前准備了一個盒子,並配了兩把鑰匙。每次Alice把秘密裝進盒子里,然后用鑰匙鎖起來寄給Bob。Bob接到盒子后用鑰匙打開,便可以知道這個秘密了。(這里的鑰匙其實是將加密秘鑰求逆得出的解密秘鑰,但可以直接由加密秘鑰推導出解密秘鑰,故可以理解為同一把鑰匙。)加密秘鑰和解密秘鑰相同,或實質上等同,即從一個易於推出另一個。
這種方式叫做對稱加密,又稱傳統密碼算法、秘密密鑰算法或單密鑰算法。
其中,這個秘密本身叫做明文,用來加密的鑰匙叫做密鑰,鎖好了的信息叫做密文。
Alice和Bob都有密鑰,所以他們都可以隨意地把明文翻譯成密文,或是把密文翻譯成明文。但Eve沒有密鑰,所以無法破解密文。
然而,在現代網絡的實際應用中,這種對稱加密卻有很多很多的問題!其中,最大的問題是:很多情況下,Alice和Bob可能沒有機會提前商量,所以無法生成相同密鑰!然而如果進行秘鑰商討,或對密鑰進行直接傳輸,將會有可能泄露密鑰。
所以我們需要更好的辦法,就是——非對稱加密。RSA是就是非對稱加密。一般的鑰匙都是既能上鎖、也能開鎖的。但是,非對稱加密中,密鑰有兩種:公有密鑰、私有秘鑰。
公有密鑰用於上鎖(加密),其他人都可以知道。私有密鑰用於解鎖(解密),只能自己知道。
因為Alice只需要上鎖,所以她只需要公有密匙就夠了。私有密匙只有Bob擁有。
Alice會先通知Bob:我要告訴你一件事。然后Bob接着就會生成一把鎖,並制作兩種鑰匙:公有密鑰和私有秘鑰。Bob會把公有密鑰發給Alice,然后Alice會用公有密鑰加密信息。Alice把上鎖的密文發回來后,Bob再用自己的私有密鑰解密,並得到明文。
整個過程中,只有Bob擁有私有密鑰。
Bob的私有秘鑰不會交給任何人的。
縱使Eve獲得了明文和公開密鑰,Eve也無法解密。因為只有私有密匙才可以解密。
非對稱加密的基本原理就是這樣。
這種加密方式的好處就是在加密解密信息的同時,還可以進行簽名和驗證(只需要將私鑰用來簽名,公鑰進行驗證即可)。
為了打造這兩把鑰匙,一把用於上鎖,一把用於開鎖,我們還需要利用一些數論方面的知識。
這里略過了對於相關算法時間復雜度的講解,只需要知道在密碼學中,很多時候密碼不是不可以破解的,只不過破解密碼需要大量的時間。 當破解密碼所要耗費的成本大於其收益時,我們就可以認為這個加密算法是絕對安全的,這也就是為什么隨着加密算法和計算能力在不斷的相互促進中共同發展。
而目前RSA理論上非常安全,因為破解RSA所要付出地計算成本遠遠高於使用RSA進行加密的計算成本。
(對於RSA來說,目前最大的威脅是量子計算機的快速發展,當然也會有相應的量子加密產生就是了。)
2 數論
2.1 歐拉函數——φ()
φ(n)表示:小於n的正整數中與n互質的數的數目。(互質表示公因數為1)
比如想要知道φ(10)的話,我們就可以看[1, 10)中和10互質的整數,也就是1、3、7、9這四個數。(2、4、6、8和10有公因數2,而5和10有公因數10)。所以φ(10)=4。
比如想要知道φ(21)的話,我們就可以看[1, 21)中和21互質的整數,也就是1、2、4、5、8、10、11、13、16、17、19、20這12個數。(3、6、9、12、15、18和21有公因數3,而7、14和21有公因數7)。所以φ(21)=12。
如果n能寫作兩個不同質數與
的乘積,那么
比如10=2*5,2和5是兩個質數,所以φ(10)=(2-1)*(5-1)=4。
比如21=3*7,3和7是兩個質數,所以φ(21)=(3-1)*(7-1)=12。
2.2 同余式
比如說,23÷7=3……2
再比如,65÷7=9……2
我們發現,這兩個數除以7都余2,於是我們就可以這樣寫:
23 ≡ 65(mod 7)
當然也可以這樣:
23 ≡ 2(mod 7)
65 ≡ 2(mod 7)
准確地說,如果a=b+km的話,a ≡ b(mod m)
同余式有這樣兩個性質:
同余式可以互相加:若a ≡ b(mod m)、c ≡ d(mod m),則a+c ≡ b+d(mod m)
同余式可以互相乘:若a ≡ b(mod m)、c ≡ d(mod m),則ac ≡ bd(mod m)
具體怎么用呢,舉個例子:
既然我們知道23×(23+65)≡ 2×(2+2) ≡ 8 ≡ 1(mod 7)
因為23×(23+65) =2024,也就是說2024÷7余數是1。
2.3 歐拉公式
2.4 乘法逆元
如果ab ≡ 1(mod m),則稱a和b為關於m互為乘法逆元。
已知a求b的方法:因為ab ≡ 1(mod m),所以不妨設ab+mk=1,其中a和m為已知數。
可以利用擴展歐幾里得算法,可以在多項式時間內,計算出來一個乘法逆元b。
(事實上,b的解不唯一,這里只是求出了一個b。之前對稱加密中,根據加密秘鑰求解密秘鑰的過程其實就是利用了乘法逆元。)
3 生成密鑰對
我們終於開始構造咱們需要的兩把鑰匙了。
第一把:公鑰,用於加密,送給Alice。
第二把:密鑰,用於解密,Bob自己留好。
對於一個與n互質的數a:
到這里,兩把鑰匙構造完成!
公鑰:(n, e)
私鑰:(n, d)
於是,對於明文a,Alice利用公鑰(n, e)就可以加密為密文c了。
除了Bob,沒有任何人可以知道φ(n),所以沒有人可以求出e關於φ(n)的乘法逆元d。
也就是說d的值從頭到尾只有Bob自己知道,不可能泄露。
現在,Bob需要做的,僅僅是把公鑰(n, e)交給Alice,讓Alice把密文a加密成c,得到密文c后再用自己的密鑰解密。
Eve就不可能竊聽了。
個人理解: 整個RSA算法的核心其實就在於歐拉公式,將mod n 與 求乘法逆元d的過程巧妙的結合卻又相隔開來,做到了在暴露n的情況下無法推出計算解密秘鑰需要的φ(n)。
即,依靠φ(n)產生的ed互為乘法逆元,同時又可以靠產生φ(n)的n構建同余等式完成加解密,同時保證不可以靠n推出φ(n),從而使得RSA算法十分安全。
參考:知乎