RSA加密算法是一種非對稱加密算法。RSA是1977年由羅納德·李維斯特(Ron Rivest)、阿迪·薩莫爾(Adi Shamir)和倫納德·阿德曼(Leonard Adleman)一塊兒提出的。當時他們三人都在麻省理工學院工做。RSA就是他們三人姓氏開頭字母拼在一塊兒組成的。nginx
1973年,在英國政府通信總部工做的數學家克利福德·柯克斯(Clifford Cocks)在一個內部文件中提出了一個相同的算法,但他的發現被列入機密,一直到1997年才被髮表。web
對極大整數作因數分解的難度決定了RSA算法的可靠性。 換言之,對一極大整數作因數分解愈困難,RSA算法愈可靠。假若有人找到一種快速因數分解的算法的話,那麼用RSA加密的信息的可靠性就確定會極度降低。 但找到這樣的算法的可能性是很是小的。今天只有短的RSA鑰匙纔可能被強力方式解破。到目前爲止,世界上尚未任何可靠的攻擊RSA算法的方式。只要其鑰匙的長度足夠長,用RSA加密的信息其實是不能被解破的。算法
看一個數學小魔術:app
讓A寫下一個任意3位數,並將這個數和91相乘;而後將積的最後三位數告訴B,這樣B就能夠計算出A寫下的是什麼數字了。函數
道理很簡單,91乘以11等於1001,而任何一個三位數乘以1001後,末三位顯然都不變(例如123乘以1001就等於123123)。post
知道原理後,能夠構造一個定義域和值域更大的加密解密系統。
例如:學習
若是僅僅按照上面的思路,若是對方知道原理,很是容易窮舉出400000001這個目標值;RSA算法使用的是指數和取模運算,本質上就是上面這套思想。加密
此段落轉載自:
如何用通俗易懂的話來解釋非對稱加密?spa
對極大整數作因數分解的難度決定了RSA算法的可靠性。code
先看一下維基百科的算法描述:
r = φ(N) = φ(p)φ(q) = (p-1)(q-1)
複製代碼
假設Bob想給Alice發送一個消息 n
,他知道Alice產生的 N
和 e
;用下面這個公式他能夠將 n
加密爲 c
:
c ≡ n^e (mod N)
複製代碼
計算 c
並不複雜。Bob算出 c
後就能夠將它傳遞給Alice。
Alice獲得Bob的消息 c
後就能夠利用她的密鑰d
來解碼。能夠用如下這個公式來將 c
轉換爲 n
:
n ≡ c^d (mod N)
複製代碼
此段落轉載自:
維基百科——RSA加密算法
依照算法公式來舉個例子
質數 定義:
除了1和該數自身外,沒法被其餘天然數整除的數。
複製代碼
舉例:
p = 3;
q = 5;
N = 3*5 = 15;
複製代碼
r = φ(N) = φ(p)φ(q) = (p-1)(q-1)。
複製代碼
歐拉函數 定義:
歐拉函數 φ(n)是小於或等於n的正整數中與n互質的數的數目。
例如:φ(8) = 4,由於1,3,5,7均和8互質。
複製代碼
舉例:
r = φ(N) = φ(p)φ(q) = (p-1)(q-1) ;
r = φ(15) = φ(3)φ(5) = (3-1)(5-1) ;
r = 8
複製代碼
互質 定義:
若是兩個或兩個以上的整數的最大公約數是 1,則稱它們爲互質
例如:1,3,5,7均和8互質
複製代碼
模反元素 定義:
若是兩個正整數a和n互質,那麼必定能夠找到整數b,使得 ab-1 被n整除,或者說ab被n除的餘數是1。
例如:好比3和5互質,3關於5的模反元素就多是2,由於 (3*2)%5=1 。
複製代碼
舉例:
// 選擇一個小於r並與r互質的整數e (1,3,5,7均和8互質):
e = 7;
// 求得e關於r的模反元素,命名爲d ( ed ≡ 1(mod r) )
ed ≡ 1(mod r) ;
7*d ≡ 1(mod 8) ;
7*d%8 = 1;
// 這裏取d = 15
d = 15;
複製代碼
// 公鑰 (N , e)
( 15,7 )
// 私鑰 (N, d)
( 15,15 )
複製代碼
假設Bob想給Alice發送一個消息 n
,他知道Alice產生的 N
和 e
;用下面這個公式他能夠將 n
加密爲 c
舉例:
// 假設
n = 2;
// 計算c
c ≡ n^e (mod N) ;
(c^-1 * n^e)%N = 1 ;
(c^-1 * 2^7)%15 = 1 ;
//
c = 8;
複製代碼
Alice獲得Bob的消息 c
後就能夠利用她的密鑰d
來解碼。能夠用如下這個公式來將 c
轉換爲 n
:
舉例:
// 計算n
n ≡ c^d (mod N)
n ≡ 8^15 (mod 15) ;
(n^-1 * 8^15)%15 = 1 ;
//
n = 2;
複製代碼