帶你徹底理解RSA演算法原理
1. 什麼是RSA
RSA演算法是現今使用最廣泛的公鑰密碼演算法,也是號稱地球上最安全的加密演算法。在瞭解RSA演算法之前,先熟悉下幾個術語
根據金鑰的使用方法,可以將密碼分為對稱密碼和公鑰密碼
對稱密碼:加密和解密使用同一種金鑰的方式
公鑰密碼:加密和解密使用不同的密碼的方式,因此公鑰密碼通常也稱為非對稱密碼。
2. RSA加密
RSA的加密過程可以使用一個通式來表達
密文=明文EmodN密文=明文EmodN
也就是說RSA加密是對明文的E次方後除以N後求餘數的過程。就這麼簡單?對,就是這麼簡單。
從通式可知,只要知道E和N任何人都可以進行RSA加密了,所以說E、N是RSA加密的金鑰,也就是說E和N的組合就是公鑰
公鑰=(E,N)公鑰=(E,N)
不過E和N不併不是隨便什麼數都可以的,它們都是經過嚴格的數學計算得出的,關於E和N擁有什麼樣的要求及其特性後面會講到。順便囉嗦一句E是加密(Encryption)的首字母,N是數字(Number)的首字母
3. RSA解密
RSA的解密同樣可以使用一個通式來表達
明文=密文DmodN明文=密文DmodN
也就是說對密文進行D次方後除以N的餘數就是明文,這就是RSA解密過程。知道D和N就能進行解密密文了,所以D和N的組合就是私鑰
私鑰=(D,N)私鑰=(D,N)
從上述可以看出RSA的加密方式和解密方式是相同的,加密是求“E次方的mod N”;解密是求“D次方的mod N”
此處D是解密(Decryption)的首字母;N是數字(Number)的首字母。
小結下
公鑰 | (E,N) |
私鑰 | (D,N) |
金鑰對 | (E,D,N) |
加密 | 密文=明文EmodN密文=明文EmodN |
解密 | 明文=密文DmodN明文=密文DmodN |
4. 生成金鑰對
既然公鑰是(E,N),私鑰是(D,N)所以金鑰對即為(E,D,N)但金鑰對是怎樣生成的?步驟如下:
- 求N
- 求L(L為中間過程的中間數)
- 求E
- 求D
4.1 求N
準備兩個質數p,q。這兩個數不能太小,太小則會容易破解,將p乘以q就是N
N=p∗qN=p∗q
4.2 求L
L 是 p-1 和 q-1的最小公倍數,可用如下表達式表示
L=lcm(p-1,q-1)L=lcm(p-1,q-1)
4.3 求E
E必須滿足兩個條件:E是一個比1大比L小的數,E和L的最大公約數為1
用gcd(X,Y)來表示X,Y的最大公約數則E條件如下:
1 < E < L
gcd(E,L)=1
之所以需要E和L的最大公約數為1是為了保證一定存在解密時需要使用的數D。現在我們已經求出了E和N也就是說我們已經生成了金鑰對中的公鑰了。
4.4 求D
數D是由數E計算出來的。D、E和L之間必須滿足以下關係:
1 < D < L
E*D mod L = 1
只要D滿足上述2個條件,則通過E和N進行加密的密文就可以用D和N進行解密。
簡單地說條件2是為了保證密文解密後的資料就是明文。
現在私鑰自然也已經生成了,金鑰對也就自然生成了。
小結下:
求N | N= p * q ;p,q為質數 |
求L | L=lcm(p-1,q-1) ;L為p-1、q-1的最小公倍數 |
求E | 1 < E < L,gcd(E,L)=1;E,L最大公約數為1(E和L互質) |
求D | 1 < D < L,E*D mod L = 1 |
5 實踐下吧
我們用具體的數字來實踐下RSA的金鑰對對生成,及其加解密對全過程。為方便我們使用較小數字來模擬。
5.1 求N
我們準備兩個很小對質數,
p = 17
q = 19
N = p * q = 323
5.2 求L
L = lcm(p-1, q-1)= lcm(16,18) = 144
144為16和18對最小公倍數
5.3 求E
求E必須要滿足2個條件:1 < E < L ,gcd(E,L)=1
即1 < E < 144,gcd(E,144) = 1
E和144互為質數,5顯然滿足上述2個條件
故E = 5
此時公鑰=(E,N)= (5,323)
5.4 求D
求D也必須滿足2個條件:1 < D < L,E*D mod L = 1
即1 < D < 144,5 * D mod 144 = 1
顯然當D= 29 時滿足上述兩個條件
1 < 29 < 144
5*29 mod 144 = 145 mod 144 = 1
此時私鑰=(D,N)=(29,323)
5.5 加密
準備的明文必須時小於N的數,因為加密或者解密都要mod N其結果必須小於N
假設明文 = 123
則 密文=明文EmodN=1235mod323=225密文=明文EmodN=1235mod323=225
5.6 解密
明文=密文DmodN=22529mod323=123明文=密文DmodN=22529mod323=123
解密後的明文為123。
好了至此RSA的演算法原理已經講解完畢,是不是很簡單?
相關推薦
帶你徹底理解RSA演算法原理
1. 什麼是RSARSA演算法是現今使用最廣泛的公鑰密碼演算法,也是號稱地球上最安全的加密演算法。在瞭解RSA演算法之前,先熟悉下幾個術語 根據金鑰的使用方法,可以將密碼分為對稱密碼和公鑰密碼 對稱密碼:加密和解密使用同一種金鑰的方式 公鑰密碼:加密和解密使用不同的密碼的方式,因此公鑰密碼通常也稱為非對稱密碼
Android 帶你徹底理解 Window 和 WindowManager
有時候我們需要在桌面上顯示一個類似懸浮窗的東西,這種效果就需要用 Window 來實現,Window 是一個抽象類,表示一個視窗,它的具體實現類是 PhoneWindow,實現位於 WindowManagerService 中。相信看到 WindowManage
理解RSA演算法原理,將有助於理解計算機
計算機通訊安全的基石 - 公鑰加密演算法 公開金鑰加密(英語:public-key cryptography,又譯為公開金鑰加密),也稱為非對稱加密(asymmetric cryptography),一種密碼學演算法型別,在這種密碼學方法中,需要一對金鑰,一個是私人金鑰,另
圖文並茂的帶你徹底理解悲觀鎖與樂觀鎖
這是一篇介紹悲觀鎖和樂觀鎖的入門文章。旨在讓那些不瞭解悲觀鎖和樂觀鎖的小白們弄清楚什麼是悲觀鎖,什麼是樂觀鎖。不同於其他文章,本文
一文帶你徹底理解 JavaScript 原型物件
一、什麼是原型 原型是Javascript中的繼承的基礎,JavaScript的繼承就是基於原型的繼承。 1.1 函式的原型物件 在JavaScript中,我們建立一個函式A(就是宣告一個函式), 那麼瀏覽器就會在記憶體中建立一個物件B,而且每個函式都預設會有一個屬性 prototype 指向了這個物件( 即
簡直不要太硬了!一文帶你徹底理解檔案系統
所有的應用程式都需要儲存和檢索資訊。程序執行時,它能夠在自己的儲存空間記憶體儲一定量的資訊。然而,儲存容量受虛擬地址空間大小的限制。對於一些應用程式來說,儲存空間的大小是充足的,但是對於其他一些應用程式,比如航空訂票系統、銀行系統、企業記賬系統來說,這些容量又顯得太小了。 第二個問題是,當程序終止時資訊會
吐血整理!這篇帶你徹底理解主存中儲存單元地址的分配
在閱讀本文之前,建議沒有基礎的讀者先閱讀下主存的基本組成結構: [五分鐘理解主儲存器的基本組成結構](https://blog.csdn.net/weixin_41695995/article/details/105009429) ## 儲存單元的字地址: 我們來看張圖: ![在這裡插入圖片描述](ht
看完讓你徹底理解 WebSocket 原理,附完整的實戰代碼(包含前端和後端)
tcp 協議 learn php 握手 live 雙向 簡單 再次 註意 1、前言 最近有同學問我有沒有做過在線咨詢功能。同時,公司也剛好讓我接手一個 IM 項目。所以今天抽時間記錄一下最近學習的內容。本文主要剖析了 WebSocket 的原理,以及附上一個完整的聊天室實戰
併發程式設計之美,帶你深入理解java多執行緒原理
1.什麼是多執行緒? 多執行緒是為了使得多個執行緒並行的工作以完成多項任務,以提高系統的效率。執行緒是在同一時間需要完成多項任務的時候被實現的。 2.瞭解多執行緒 瞭解多執行緒之前我們先搞清楚幾個重要的概念! 如上圖所示:對我們的專案有一個主記憶體,這個主記憶體裡面存放了我們的共享變數、方法區、堆中的物件等
(教你徹底理解)網路流:基本概念與演算法 最大流最小割
一.網路流:流&網路&割 1.網路流問題(NetWork Flow Problem): 給定指定的一個有向圖,其中有兩個特殊的點源S(Sources)和匯T(Sinks),每條邊有指定的容量(Capacity),求滿足條件的從S到T的最大流(Max
【python測試開發棧】帶你徹底搞明白python3編碼原理
在之前的文章中,我們介紹過編碼格式的發展史:[文章傳送門-todo]。今天我們通過幾個例子,來徹底搞清楚python3中的編碼格式原理,這樣你之後寫python指令碼時碰到編碼問題,才能有章可循。 我們先搞清楚幾個概念: 系統預設編碼:指python直譯器預設的編碼格式,在python檔案頭部沒有宣告其他編
教你寫Http框架(二)——三個樣例帶你深入理解AsyncTask
func implement oncreate 其它 層疊 worker dcl 例如 人員 這個標題大家不要奇怪,扯Http框架怎麽扯到AsyncTask去了,有兩個原因:首先是Http框架除了核心http理論外。其技術實現核心也是線程池 + 模板 +
看完讓你徹底搞懂Websocket原理
找到 說了 成了 原理 兩層 cep 告訴 edi 純粹 偶然在知乎上看到一篇回帖,瞬間覺得之前看的那麽多資料都不及這一篇回帖讓我對 websocket 的認識深刻有木有。所以轉到我博客裏,分享一下。比較喜歡看這種博客,讀起來很輕松,不枯燥,沒有布道師的陣仗,純粹為分享。廢
親自實驗讓你徹底理解表連接
lec 一個人 相同 bsp 技術 指定 個人 add 冗余 1.表連接的根本條件是共同字段,也叫關聯字段也叫冗余字段,有關聯字段(冗余字段)才能將兩張表的記錄匹配起來嘛。 其中關聯字段,也即形成了表之間的關系,即1對1,還是1對多,還是多對多。 這些表之間的關系,就是
轉--看完讓你徹底搞懂Websocket原理
接下來 lur 耗資源 最終 ive img pro -- 傳遞 偶然在知乎上看到一篇回帖,瞬間覺得之前看的那麽多資料都不及這一篇回帖讓我對 websocket 的認識深刻有木有。所以轉到我博客裏,分享一下。比較喜歡看這種博客,讀起來很輕松,不枯燥,沒有布道師的陣仗,純粹為
一張圖讓你徹底理解js原型鏈
function Person() { this.name = 'sanlyshi'; this.age = '23'; this.eat = function () { console.log(this.name +' is eating!')
websocket(轉) 看完讓你徹底搞懂Websocket原理
看完讓你徹底搞懂Websocket原理 偶然在知乎上看到一篇回帖,瞬間覺得之前看的那麼多資料都不及這一篇回帖讓我對 websocket 的認識深刻有木有。所以轉到我部落格裡,分享一下。比較喜歡看這種部落格,讀起來很輕鬆,不枯燥,沒有佈道師的陣仗,純粹為分享。廢話這麼多了,最後再贊一
Websocket原理 看完讓你徹底搞懂Websocket原理
看完讓你徹底搞懂Websocket原理 偶然在知乎上看到一篇回帖,瞬間覺得之前看的那麼多資料都不及這一篇回帖讓我對 websocket 的認識深刻有木有。所以轉到我部落格裡,分享一下。比較喜歡看這種部落格,讀起來很輕鬆,不枯燥,沒有佈道師的陣仗,純粹為分享。廢話這麼多了,最後再贊一
帶你徹底看懂React Native和Android原生控制元件之間的對映關係
此文基於react natve的 September 2018 - revision 5 版本 本人學校畢業後就當了安卓爬坑專業戶,3年來總算爬習慣了,不料今年掉進了RN這個天坑,從此開始了我的悲慘人生。。。Anyway,RN的思想還是值得學習的,今天就從Android的角度開始分析一下react nati
一文讓你徹底理解 Java NIO 核心元件
背景知識 同步、非同步、阻塞、非阻塞 首先,這幾個概念非常容易搞混淆,但NIO中又有涉及,所以總結一下[1]。 同步:API呼叫返回時呼叫者就知道操作的結果如何了(實際讀取/寫入了多少位元組)。 非同步:相對於同步,API呼叫返回時呼叫者不知道操作的結果,後面才會回撥通知結果