RSA加密
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公鑰加密本地文件。使本地文件不可被正常使用,進而勒索機主。待勒索成功後,只要將私鑰文件再發送到本機對文件進行解密即可。思路簡單,但是非常有效,難以破解,每臺機器的私鑰文件也幾乎不會相同。
RSA加密