RSA加密

lazybreak發表於2024-10-16

RSA背景

在1976年以前,傳統的加解密過程是:

1、A採用某種手段對資料進行加密。

2、資料傳輸到B的手中。

3、B逆向的實施A加密採用的步驟。

4、資料被還原。

這就是所謂的對稱加密。

解密和加密的互為彼此的逆過程。加密的人必定知道解密的手段。解密的人也必定知道加密的手段。

這種加解密手段的最大特點就是對稱(易於操作),但這也正是它的最大缺點。因為加密方,必須將加密規則告知解密方。

這就造成兩個問題:

1、加解密規則定期就要更新,如何將加解密規則順利的告訴對方。

2、如何安全的儲存加解密規則。因為只要有一方將加解密規則洩露。那麼這種加密手段就可以說被破解了。

基於此,在1976年由兩位美國電腦科學家提出了一種全新的思路("Diffie-Hellman金鑰交換演算法"),即採用公鑰-私鑰對的形式進行加解密。

1、解密方生成一對金鑰:公鑰-私鑰對。兩者不存在互相推匯出彼此的可能。

2、公鑰隨普通網路到達加密方,私鑰則始終保留在解密者手中。

3、加密方使用公鑰將檔案轉為密文

4、將密文傳輸給解密方。

5、解密方使用私鑰將密文轉為明文,完成解密。

由於公鑰和私鑰在邏輯上無法互相推算出彼此。這樣只要私鑰不被洩露,那麼密文就不會解密。基於此對稱加密的第一個問題的風險被解決,第二個問題的風險被縮小了一半。

受這種思路的啟發,在次年,也就是1977年,由三位數學家(Rivest、Shamir 和 Adleman )聯合發表了RSA演算法,演算法名稱的來源是三位科學家的首字母的和。在隨後的幾十年,RSA加密演算法,在密碼領域中大放異彩,成為非對稱加密的代表加密演算法。並且隨著金鑰長度的不斷增加,以當下的計算機運算水平,是不可能在有限的時間下,暴力破解出金鑰,而攻破該演算法的。

RSA加密演算法的實現邏輯

在RSA演算法中,需要存在五個重要的數字元素:

  p、q:這是隨機選取的兩個不相等質數

  n:n=p*q,也就是p和q的乘積

  φ(n):φ(n) = (p-1)(q-1) ,也就是p-1和q-1的乘積

  e:隨機選取一個和φ(n)互質的正整數。並且保證 e < φ(n)

d:根據ed ≡ 1 (mod φ(n)),計算出對於φ(n)的模反元素d

ed ≡ 1 (mod φ(n)) 的含義是,ed整除φ(n)之後,餘數為1。

也就是ed=k*φ(n)+1

可以看作

ed=φ(n)x+1最終利用輾轉相除法(看了一下網上的推導邏輯,覺得純數學領域了,純記住意義不大),可以計算出一組滿足的解(d,x)。

這樣(n,e)是公鑰,(n,d)是私鑰。

由於e,d的推導是依賴的φ(n)的,而φ(n)的值來自於p、q。p、q儘管是隨機取得的,但是可以由n因式分解而成。因此n的因式分解速度就成為整個解密的瓶頸。n的因式分解換言之,類似於判斷n是否是質數,目前除去不斷的暴力嘗試,並沒有好的辦法。目前已知的最大分解數目的量級是10^232,佔768bit位,所以一旦n突破了768位,就可以說很難破解了。(但是據說量子計算機非常適合於計算因式分解,可惜現在還是雛形)

知道了,公鑰和私鑰的生成後。來看下公鑰私鑰是如何使用的:

1、將原始資訊轉化為數字:無論是ascii碼值,還是Unicode碼,或者是其他base64轉碼等等,生成數字序列之後。依次迴圈按照下文進行加密:

公鑰(n,e)、原文m

m^e ≡ c (mod n)

換言之c等於m^e除以n的餘數

也就是計算出密文c

2、將密文傳送給解密者,解密者依次按照下文進行還原

c^d ≡ m (mod n)公式

換言之m等於c^d除以n的餘數

反向求出m即為明文

證明過程這裡就忽略了,有興趣的可以看下阮一峰寫的RSA加密部落格。裡邊的算式推理比較嚴謹。

此外有一點需要說明的是,在公鑰加密的過程中,需要m小於n,如果在加密的過程中,發現有元素比公鑰的n還要大,則需要將原文進行切割成更小的元素,然後再進行加密。

其它

另外最近流行面非常廣的病毒“永恆之藍”,始於歐洲,通過網路傳播了半個世界的勒索病毒,其核心的思路就是將RSA公鑰傳播到本機,接著用RSA公鑰加密本地檔案。使本地檔案不可被正常使用,進而勒索機主。待勒索成功後,只要將私鑰檔案再傳送到本機對檔案進行解密即可。思路簡單,但是非常有效,難以破解,每臺機器的私鑰檔案也幾乎不會相同。

本文轉自帥氣的頭頭部落格51CTO部落格,原文連結http://blog.51cto.com/12902932/1926487如需轉載請自行聯絡原作者

sshpp

相關文章