1. 程式人生 > >帶你徹底理解RSA演算法原理

帶你徹底理解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和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)但金鑰對是怎樣生成的?步驟如下:

  1. 求N
  2. 求L(L為中間過程的中間數)
  3. 求E
  4. 求D

4.1 求N

準備兩個質數p,q。這兩個數不能太小,太小則會容易破解,將p乘以q就是N

N=pqN=p∗q

4.2 求L

L 是 p-1 和 q-1的最小公倍數,可用如下表達式表示

L=lcmp1q1L=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是為了保證密文解密後的資料就是明文。 
現在私鑰自然也已經生成了,金鑰對也就自然生成了。 
小結下:

求NN= p * q ;p,q為質數
求LL=lcm(p-1,q-1) ;L為p-1、q-1的最小公倍數
求E1 < E < L,gcd(E,L)=1;E,L最大公約數為1(E和L互質)
求D1 < 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 
則 EmodN1235mod323=225密文=明文EmodN=1235mod323=225

5.6 解密

DmodN22529mod323=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呼叫返回時呼叫者不知道操作的結果,後面才會回撥通知結果