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公鑰加密本地檔案。使本地檔案不可被正常使用,進而勒索機主。待勒索成功後,只要將私鑰檔案再傳送到本機對檔案進行解密即可。思路簡單,但是非常有效,難以破解,每臺機器的私鑰檔案也幾乎不會相同。
相關文章
- javascript RSA 加密JavaScript加密
- C# RSA 加密C#加密
- RSA加密與解密加密解密
- RSA加密演算法加密演算法
- RSA加密遇到的坑加密
- php rsa長文加密解密PHP加密解密
- nodejs常用加密方式 RSA & AESNodeJS加密
- framewrok RSA SHA512加密加密
- RSA 非對稱加密&解密加密解密
- 對稱加密、非對稱加密、RSA(總結)加密
- php中aes加密和rsa加密的區別PHP加密
- Android、Java RSA加密踩坑記AndroidJava加密
- 安全篇-AES/RSA加密機制加密
- RSA加密原理&密碼學&HASH加密密碼學
- RSA加密解密示例程式碼加密解密
- 關於php rsa加密處理PHP加密
- 非對稱加密--RSA原理淺析加密
- RSA加密解密原理深度剖析(附CTF中RSA題型實戰分析)加密解密
- 前後端資料加密傳輸 RSA非對稱加密後端加密
- 利用RSA對前後端加密的探索後端加密
- 經典加密演算法入門-RSA加密演算法
- PHP中RSA加密演算法的使用PHP加密演算法
- 第四篇:非對稱加密及RSA加密演算法加密演算法
- 微信小程式使用JSEncrypt進行RSA加密微信小程式JS加密
- iOS端基於RSA公鑰加密和解密iOS加密解密
- RSA非對稱加密演算法淺析加密演算法
- springboot~configserver裡對重要資訊進行RSA加密Spring BootGseServer加密
- RSA演算法揭秘:加密世界的守護者演算法加密
- 10:c# mds5與des與rsa加密C#加密
- security.js RSA加密與java客戶端解密JS加密Java客戶端解密
- 非對稱加密演算法-RSA演算法加密演算法
- 在VUE中使用RSA加密解密加簽解籤Vue加密解密
- 前後端API互動資料加密——AES與RSA混合加密完整例項後端API加密
- C# Rsa加密(私鑰加密、公鑰解密、金鑰格式轉換、支援超大長度分段加密)C#加密解密
- C#通過java生成的RSA公鑰加密和解密C#Java加密解密
- RSA der加密 p12解密以及配合AES使用詳解加密解密
- RSA加密演算法簡單介紹以及python實現加密演算法Python
- RSA 非對稱加密&解密,超長字串分塊處理加密解密字串