1. 程式人生 > >RSA加密演算法詳解

RSA加密演算法詳解

研究RSA

不知為何,這幾天突然有些心煩。望蒼茫大地,憑添幾分憂傷,可能是下雨的緣故。本篇主要想詳細介紹RSA加密演算法的原理,經常聽別人說,這裡是自己想搞清楚,弄明白。首先介紹了基本的數學原理,然後給出一個具體的計算例子和相關的理論充分性證明。

皓眸大前端開發學習皓眸大前端開發學習


轉載請註明出處:http://www.haomou.net/2014/08/27/2014_rsa/

RSA由來

1976年以前,所有的加密方法都是同一種模式:
  (1)甲方選擇某一種加密規則,對資訊進行加密;
  (2)乙方使用同一種規則,對資訊進行解密。
由於加密和解密使用同樣規則(簡稱”金鑰”),這被稱為”對稱加密演算法”(Symmetric-key algorithm)。這種加密模式有一個最大弱點:甲方必須把加密規則告訴乙方,否則無法解密。儲存和傳遞金鑰,就成了最頭疼的問題。
皓眸大前端開發學習

皓眸大前端開發學習
1976年,兩位美國計算機學家Whitfield Diffie 和 Martin、Hellman,提出了一種嶄新構思,可以在不直接傳遞金鑰的情況下,完成解密。這被稱為”Diffie-Hellman金鑰交換演算法”。這個演算法啟發了其他科學家。人們認識到,加密和解密可以使用不同的規則,只要這兩種規則之間存在某種對應關係即可,這樣就避免了直接傳遞金鑰。這種新的加密模式被稱為”非對稱加密演算法”。
  (1)乙方生成兩把金鑰(公鑰和私鑰)。公鑰是公開的,任何人都可以獲得,私鑰則是保密的。
  (2)甲方獲取乙方的公鑰,然後用它對資訊加密。
  (3)乙方得到加密後的資訊,用私鑰解密。
如果公鑰加密的資訊只有私鑰解得開,那麼只要私鑰不洩漏,通訊就是安全的。
皓眸大前端開發學習
皓眸大前端開發學習
1977年,三位數學家Rivest、Shamir 和 Adleman 設計了一種演算法,可以實現非對稱加密。這種演算法用他們三個人的名字命名,叫做RSA演算法。從那時直到現在,RSA演算法一直是最廣為使用的”非對稱加密演算法”。毫不誇張地說,只要有計算機網路的地方,就有RSA演算法。
這種演算法非常可靠,金鑰越長,它就越難破解。根據已經披露的文獻,目前被破解的最長RSA金鑰是768個二進位制位。也就是說,長度超過768位的金鑰,還無法破解(至少沒人公開宣佈)。因此可以認為,1024位的RSA金鑰基本安全,2048位的金鑰極其安全。
下面,我就進入正題,解釋RSA演算法的原理。文章共分成兩部分,今天是第一部分,介紹要用到的四個數學概念。你可以看到,RSA演算法並不難,只需要一點數論知識就可以理解。

理論基礎

這裡介紹一點理論基礎,都是比較簡單的,小學的數學知識。看我細細道來~

####什麼是“素數”?
素數是這樣的整數,它除了能表示為它自己和1的乘積以外,不能表示為任何其它兩個整數的乘積。例如,15=3*5,所以15不是素數;又如,12=6*2=4*3,所以12也不是素數。另一方面,13除了等於13*1以外,不能表示為其它任何兩個整數的乘積,所以13是一個素數。素數也稱為“質數”。

####什麼是“互質數”(或“互素數”)?
小學數學教材對互質數是這樣定義的:“公約數只有1的兩個數,叫做互質數。”這裡所說的“兩個數”是指自然數。
  判別方法主要有以下幾種(不限於此):
(1)兩個質數一定是互質數。例如,2與7、13與19。
(2)一個質數如果不能整除另一個合數,這兩個數為互質數。例如,3與10、5與 26。
(3)1不是質數也不是合數,它和任何一個自然數在一起都是互質數。如1和9908。
(4)相鄰的兩個自然數是互質數。如 15與 16。
(5)相鄰的兩個奇數是互質數。如 49與 51。
(6)大數是質數的兩個數是互質數。如97與88。
(7)小數是質數,大數不是小數的倍數的兩個數是互質數。如 7和 16。
(8)兩個數都是合數(二數差又較大),小數所有的質因數,都不是大數的約數,這兩個數是互質數。如357與715,357=3×7×17,而3、7和17都不是715的約數,這兩個數為互質數。等等。

####什麼是模指數運算?
指數運算誰都懂,不必說了,先說說模運算。模運算是整數運算,有一個整數m,以n為模做模運算,即m mod n。怎樣做呢?讓m去被n整除,只取所得的餘數作為結果,就叫做模運算。例如,10 mod 3=1;26 mod 6=2;28 mod 2 =0等等。
  模指數運算就是先做指數運算,取其結果再做模運算。如2^3 mod 5 = 3

什麼是同餘式

表示同餘關係的數學表示式,與等式相似。將等式中的等號“=”換成同餘符號“≡”,必要時在式尾綴以(mod m) 註明模m(即除數),就是同餘式。含有未知數的同餘式叫做同餘方程,通常要求整數解。
如果兩個正整數 a和 b之差能被 n整除,那麼我們就說 a和 b對模n同餘,記作:
a ≡b (mod n)

####什麼是費馬定理
若p是素數,a與p互素,則
a^(p-1)≡1 (mod p)

什麼是尤拉定理

尤拉函式φ(n)表示不大於n且與n互素的正整數的個數。
當n是素數,φ(n)=n-1。n=pq,p,q均為素數時,則φ(n)= φ(p)φ(q)=(p-1)(q-1)。
對於互素的a和n,有a^φ(n)≡1(mod n)

什麼是模反元素?

如果兩個正整數a和n互質,那麼一定可以找到整數b,使得ab-1被n整除或者說ab被n除的餘數是1。這時,b就叫做a的”模反元素”。
比如,3和11互質,那麼3的模反元素就是4,因為 (3 × 4)-1 可以被11整除。顯然,模反元素不止一個, 4加減11的整數倍都是3的模反元素 {…,-18,-7,4,15,26,…},即如果b是a的模反元素,則 b+kn 都是a的模反元素。尤拉定理可以用來證明模反元素必然存在。

金鑰生成步驟

這裡通過例項來說明。假設愛麗絲要與鮑勃進行加密通訊,她該怎麼生成公鑰和私鑰呢?
皓眸大前端開發學習皓眸大前端開發學習
第一步,隨機選擇兩個不相等的質數p和q。
愛麗絲選擇了61和53。(實際應用中,這兩個質數越大,就越難破解。)
第二步,計算p和q的乘積n。
愛麗絲就把61和53相乘。
  n = 61×53 = 3233
n的長度就是金鑰長度。3233寫成二進位制是110010100001,一共有12位,所以這個金鑰就是12位。實際應用中,RSA金鑰一般是1024位,重要場合則為2048位。
第三步,計算n的尤拉函式φ(n)。
根據公式:
  φ(n) = (p-1)(q-1)
愛麗絲算出φ(3233)等於60×52,即3120。
第四步,隨機選擇一個整數e,條件是1< e < φ(n),且e與φ(n) 互質。
愛麗絲就在1到3120之間,隨機選擇了17。(實際應用中,常常選擇65537。)
第五步,計算e對於φ(n)的模反元素d。
所謂”模反元素”就是指有一個整數d,可以使得ed被φ(n)除的餘數為1。
  ed ≡ 1 (mod φ(n))
這個式子等價於
  ed - 1 = kφ(n)
於是,找到模反元素d,實質上就是對下面這個二元一次方程求解。
  ex + φ(n)y = 1
已知 e=17, φ(n)=3120,
  17x + 3120y = 1
這個方程可以用”擴充套件歐幾里得演算法”求解,此處省略具體過程。總之,愛麗絲算出一組整數解為 (x,y)=(2753,-15),即 d=2753。
至此所有計算完成。
第六步,將n和e封裝成公鑰,n和d封裝成私鑰。
在愛麗絲的例子中,n=3233,e=17,d=2753,所以公鑰就是 (3233,17),私鑰就是(3233, 2753)。
實際應用中,公鑰和私鑰的資料都採用ASN.1格式表達。如下:
皓眸大前端開發學習皓眸大前端開發學習
比如上面顯示的這個公鑰,那麼怎麼看出加密指數和模數呢?

下面是我隨便從IE裡匯出的一個證書的公鑰

1
30 81 89 02 81 81 00 ee fa 1f c9 b0 43 df 7e 75 81 4e 31 71 91 0b fc 15 9d d9 4a 8a 51 f5 09 18 c6 7c c5 f1 27 c4 01 62 fc bf fc 84 29 a6 2f e6 1e 02 06 0b 96 89 d3 42 b1 73 9f 02 ae 75 62 09 3f 83 80 34 46 60 39 0a e3 21 4e e7 04 42 d5 7e 5e 98 45 27 5d 04 b9 27 32 c0 65 a4 94 85 13 25 db 16 f2 fb 51 c7 ff 28 62 d1 83 31 4f a9 a4 f4 c5 4f 9d 00 2e 14 3f 95 16 9c 4e 25 07 1b d5 7d 38 71 d8 40 f8 aa 71 02 03 01 00 01

在PKCS#1中的RSA的公鑰的標準格式為

1
2
3
4
5
6
7
PKCS#1 :
An RSA public key should be represented with the ASN.1 type RSAPublickey:

RSAPublickey ::= SEQUENCE {
   modulus         INTEGER, -- n
   publicExponent INTEGER   -- e
}

然後按照ASN的標準編碼,所以說:

1
2
3
4
5
6
30 81 89 02 81 81 00 ee fa 1f c9 b0 43 df 7e 75 81 4e 31 71 91 0b fc 15 
9d d9 4a 8a 51 f5 09 18 c6 7c c5 f1 27 c4 01 62 fc bf fc 84 29 a6 2f e6 1e 
02 06 0b 96 89 d3 42 b1 73 9f 02 ae 75 62 09 3f 83 80 34 46 60 39 0a e3 
21 4e e7 04 42 d5 7e 5e 98 45 27 5d 04 b9 27 32 c0 65 a4 94 85 13 25 db 
16 f2 fb 51 c7 ff 28 62 d1 83 31 4f a9 a4 f4 c5 4f 9d 00 2e 14 3f 95 16 9c 4e 
25 07 1b d5 7d 38 71 d8 40 f8 aa 71 02 03 01 00 01

0x30 0x81 0x89 是一個標識頭,整個編碼應該是:

1
2
3
4
5
6
02 81 81 00 ee fa 1f c9 b0 43 df 7e 75 81 4e 31 71 91 0b fc 15 9d d9 4a 
8a 51 f5 09 18 c6 7c c5 f1 27 c4 01 62 fc bf fc 84 29 a6 2f e6 1e 02 06 0b 
96 89 d3 42 b1 73 9f 02 ae 75 62 09 3f 83 80 34 46 60 39 0a e3 21 4e e7 
04 42 d5 7e 5e 98 45 27 5d 04 b9 27 32 c0 65 a4 94 85 13 25 db 16 f2 fb 
51 c7 ff 28 62 d1 83 31 4f a9 a4 f4 c5 4f 9d 00 2e 14 3f 95 16 9c 4e 25 07 
1b d5 7d 38 71 d8 40 f8 aa 71 02 03 01 00 01


1
2
3
4
5
6
02 81 81 00 ee fa 1f c9 b0 43 df 7e 75 81 4e 31 71 91 0b fc 15 9d d9 4a 
8a 51 f5 09 18 c6 7c c5 f1 27 c4 01 62 fc bf fc 84 29 a6 2f e6 1e 02 06 0b 
96 89 d3 42 b1 73 9f 02 ae 75 62 09 3f 83 80 34 46 60 39 0a e3 21 4e e7
04 42 d5 7e 5e 98 45 27 5d 04 b9 27 32 c0 65 a4 94 85 13 25 db 16 f2 fb 
51 c7 ff 28 62 d1 83 31 4f a9 a4 f4 c5 4f 9d 00 2e 14 3f 95 16 9c 4e 25 07 
1b d5 7d 38 71 d8 40 f8 aa 71

是n的編碼。

0x02 0x03 0x01 0x00 0x01是e的編碼,不過你還是看不出來這什麼整數,
舉個例子
對於上面的0x02,0x03,0x01,0x00,0x01 其中0x02,0x03是e的編碼的標識頭
e的表示是0x01,0x00,0x01,所以e就是0x01256^2+0x00256^1+1=65537

同理n就是

1
2
3
4
5
6
81 00 ee fa 1f c9 b0 43 df 7e 75 81 4e 31 71 91 0b fc 15 9d d9 4a 8a 51 f5 
09 18 c6 7c c5 f1 27 c4 01 62 fc bf fc 84 29 a6 2f e6 1e 02 06 0b 96 89 d3 
42 b1 73 9f 02 ae 75 62 09 3f 83 80 34 46 60 39 0a e3 21 4e e7 04 42 d5 
7e 5e 98 45 27 5d 04 b9 27 32 c0 65 a4 94 85 13 25 db 16 f2 fb 51 c7 ff 28 
62 d1 83 31 4f a9 a4 f4 c5 4f 9d 00 2e 14 3f 95 16 9c 4e 25 07 1b d5 7d 38 
71 d8 40 f8 aa 71 02 03 01 00 01

注意,這個是一個整數的編碼,也要像e,那樣解碼。

RSA演算法的可靠性

回顧上面的金鑰生成步驟,一共出現六個數字:

1
2
3
4
5
6
  p
  q
  n
  φ(n)
  e
  d

這六個數字之中,公鑰用到了兩個(n和e),其餘四個數字都是不公開的。其中最關鍵的是d,因為n和d組成了私鑰,一旦d洩漏,就等於私鑰洩漏。
那麼,有無可能在已知n和e的情況下,推匯出d?
  (1)ed≡1 (mod φ(n))。只有知道e和φ(n),才能算出d。
  (2)φ(n)=(p-1)(q-1)。只有知道p和q,才能算出φ(n)。
  (3)n=pq。只有將n因數分解,才能算出p和q。
結論:如果n可以被因數分解,d就可以算出,也就意味著私鑰被破解。
可是,大整數的因數分解,是一件非常困難的事情。目前,除了暴力破解,還沒有發現別的有效方法。維基百科這樣寫道:
  “對極大整數做因數分解的難度決定了RSA演算法的可靠性。換言之,對一極大整數做因數分解愈困難,RSA演算法愈可靠。
  假如有人找到一種快速因數分解的演算法,那麼RSA的可靠性就會極度下降。但找到這樣的演算法的可能性是非常小的。今天只有短的RSA金鑰才可能被暴力破解。到2008年為止,世界上還沒有任何可靠的攻擊RSA演算法的方式。
  只要金鑰長度足夠長,用RSA加密的資訊實際上是不能被解破的。”
舉例來說,你可以對3233進行因數分解(61×53),但是你沒法對下面這個整數進行因數分解。

1
2
3
4
5
6
7
8
9
  12301866845301177551304949
  58384962720772853569595334
  79219732245215172640050726
  36575187452021997864693899
  56474942774063845925192557
  32630345373154826850791702
  61221429134616704292143116
  02221240479274737794080665
  351419597459856902143413

它等於這樣兩個質數的乘積:

1
2
3
4
5
6
7
8
9
10
11
  33478071698956898786044169
  84821269081770479498371376
  85689124313889828837938780
  02287614711652531743087737
  814467999489
    ×
  36746043666799590428244633
  79962795263227915816434308
  76426760322838157396665112
  79233373417143396810270092
  798736308917

事實上,這大概是人類已經分解的最大整數(232個十進位制位,768個二進位制位)。比它更大的因數分解,還沒有被報道過,因此目前被破解的最長RSA金鑰就是768位。

加密和解密

有了公鑰和金鑰,就能進行加密和解密了。
(1)加密要用公鑰 (n,e)
假設鮑勃要向愛麗絲髮送加密資訊m,他就要用愛麗絲的公鑰 (n,e) 對m進行加密。這裡需要注意,m必須是整數(字串可以取ascii值或unicode值),且m必須小於n。
所謂”加密”,就是算出下式的c:

1
  me ≡ c (mod n)

愛麗絲的公鑰是 (3233, 17),鮑勃的m假設是65,那麼可以算出下面的等式:

1
  6517 ≡ 2790 (mod 3233)

於是,c等於2790,鮑勃就把2790發給了愛麗絲。
(2)解密要用私鑰(n,d)
愛麗絲拿到鮑勃發來的2790以後,就用自己的私鑰(3233, 2753) 進行解密。可以證明,下面的等式一定成立:

1
  cd ≡ m (mod n)

也就是說,c的d次方除以n的餘數為m。現在,c等於2790,私鑰是(3233, 2753),那麼,愛麗絲算出

1
  27902753 ≡ 65 (mod 3233)

因此,愛麗絲知道了鮑勃加密前的原文就是65。
至此,”加密–解密”的整個過程全部完成。
我們可以看到,如果不知道d,就沒有辦法從c求出m。而前面已經說過,要知道d就必須分解n,這是極難做到的,所以RSA演算法保證了通訊安全。
你可能會問,公鑰(n,e) 只能加密小於n的整數m,那麼如果要加密大於n的整數,該怎麼辦?有兩種解決方法:一種是把長資訊分割成若干段短訊息,每段分別加密;另一種是先選擇一種”對稱性加密演算法”(比如DES),用這種演算法的金鑰加密資訊,再用RSA公鑰加密DES金鑰。

私鑰解密的證明

最後,我們來證明,為什麼用私鑰解密,一定可以正確地得到m。也就是證明下面這個式子:

1
c^d ≡ m (mod n)

因為,根據加密規則

1
m^e ≡ c (mod n)

於是,c可以寫成下面的形式:

1
c = m^e - kn

將c代入要我們要證明的那個解密規則:

1

            
           

相關推薦

RSA加密演算法

研究RSA 不知為何,這幾天突然有些心煩。望蒼茫大地,憑添幾分憂傷,可能是下雨的緣故。本篇主要想詳細介紹RSA加密演算法的原理,經常聽別人說,這裡是自己想搞清楚,弄明白。首先介紹了基本的數學原理,然後給出一個具體的計算例子和相關的理論充分性證明。皓眸大前端開發學習 轉載

密碼學:RSA加密演算法

概述  本文旨在說明RSA加密演算法的原理及實現,而其相關的數學部分的證明則不是本文內容。版權說明著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。發表日期: 2016年2月29日來源:CSDNRSA簡介  1977年,三位數學家Rivest、Shamir

php openssl_sign() 語法+RSA公私鑰加密解密,非對稱加密演算法

其實有時候覺得寫部落格好煩,就個函式就開篇部落格。很小的意見事情而已,知道的人看來多取一舉,或者說沒什麼必要,浪費時間,不知道的人就會很鬱悶。技術就是這樣的,懂的人覺得真的很簡單啊,不知道的人真的好難。。。 一般在跟第三方介面對接資料的時候,為了保證很多都使用的RSA簽名,沒性趣瞭解的同學只需要

加密演算法 DES、3DES、AES、RSA、MD5、sha1

DES、3DES、AES、RSA、MD5、sha1 加密演算法總結一、簡介DES:全稱為Data Encryption Standard,即資料加密標準,是一種使用金鑰加密的塊演算法;DES現在已經不是一種安全的加密方法,主要因為它使用的56位金鑰過短。1999年1月,di

加密演算法

 一、密碼學簡介        據記載,公元前400年,古希臘人發明了置換密碼。1881年世界上的第一個電話保密專利出現。在第二次世界大戰期間,德國軍方啟用“恩尼格瑪”密碼機,密碼學在戰爭中起著非常重要的作用。     &

AES加密演算法

AES 是一個對稱密碼分組演算法,分組長度為128bit,金鑰長度為128、192 和 256 bit。 整個加密過程如下圖所示。 1.金鑰生成演算法  金鑰擴充套件過程:     1)  將種子金鑰按下圖所示的格式排列,然後每32bit分別記為w[0]、w[1]、w[2]、w

加密演算法------DES加密演算法

一、加密演算法的分類1.對稱加解密演算法a.通訊雙方同時掌握一個金鑰,加密解密都是由一個金鑰完成的(即加密金鑰等於解密金鑰,加解密金鑰可以相互推倒出來)。b.雙方通訊前共同擬定一個金鑰,不對第三方公開。c.不具有個體原子性,一個金鑰被共享,洩漏機率增大2.公私鑰加解密演算法a

DES加密演算法

在網上搜了一下關於DES的說明,發現有些雜亂,所以還是有必要整合一下。 寫了一點程式碼,還沒有完成,不過,還不能編譯通過,^_^ 剛看了一下,發現還是說得夠模糊的,有機會再整理一下。 昏倒,一直執行不對,今天才仔細查出來,原來問題是出在Des_Data_P(const _b3

密碼學_AES-加密演算法

參考文章:1.高階加密標準AES的工作模式(ECB、CBC、CFB、OFB)2.分組對稱加密模式:ECB/CBC/CFB/OFB3.aes加密解密,含 128、192、256位,cbc、cfb、ecb、ofb、pcbc模式4.AES模式和填充5.java加密演算法之AES小記

RSA加密解密

package cn.com.mink.util; import java.security.KeyFactory; import java.security.KeyPair; import java.security.KeyPairGenerator; im

PHP 遷移 Mcrypt 至 OpenSSL 加密演算法

浪費了“黃金五年”的Java程式設計師,還有救嗎? >>>   

非對稱加密過程(基於RSA非對稱加密演算法實現)

1、非對稱加密過程:         假如現實世界中存在A和B進行通訊,為了實現在非安全的通訊通道上實現資訊的保密性、完整性、可用性(即資訊保安的三個性質),A和B約定使用非對稱加密通道進行通訊,具體過程如下:   說明:         國內目前使用雙證書體系,即

RSA演算法及C語言實現

1、什麼是RSA RSA公鑰加密演算法是1977年由羅納德·李維斯特(Ron Rivest)、阿迪·薩莫爾(Adi Shamir)和倫納德·阿德曼(Leonard Adleman)一起提出的。1987年首次公佈,當時他們三人都在麻省理工學院工作。RSA就是他們

客戶端與伺服器互動使用AES+RSA混合加密原理

前言 最近維護公司APP應用的登入模組,由於測試人員用Fiddler抓包工具抓取到了公司關於登入時候的明文登入資訊。雖然使用的是HTTPS的方式進行http請求的,但還是被Fiddler抓到了明文內容。因此,需要對之前未加密的登入資訊進行加密。在網上搜到一篇關於AES

JAVA實現DES加密實現

ava util des算法 直接 print uri ret secure 過程 package util; import java.security.SecureRandom; import javax.crypto.spec.DESKeySpec; import j

2018最新視訊加密技術一機一碼怎麼用?

視訊加密技術應用範圍很廣,可以說大部分的視訊所有者都希望自己的視訊是有條件才能給使用者看的。尤其是線上教育、行業培訓、特殊單位(比如醫院、大學、出版社等)等等。不同的行業和加密的目的不同,使用的視訊加密技術也有所差距,不過在長期的基礎累積中,點量軟體發現有些對視訊加密的需求是通用的,這裡小編就做個詳細的解釋。

2018最新視頻加密技術一機一碼怎麽用?

設置 type 預覽圖片 行業 大學 ges 限制 字節 區分 視頻加密技術應用範圍很廣,可以說大部分的視頻所有者都希望自己的視頻是有條件才能給用戶看的。尤其是在線教育、行業培訓、特殊單位(比如醫院、大學、出版社等)等等。不同的行業和加密的目的不同,使用的視頻加密技術也有所

Show, attend and tell演算法及原始碼

mark一下,感謝作者分享! https://blog.csdn.net/shenxiaolu1984/article/details/51493673 原論文:https://arxiv.org/pdf/1502.03044v2.pdf 原始碼:https://github.c

資料分析學習之不得不知的八大演算法

學習資料分析的朋友們都知道,演算法是不可或缺的,或者說演算法在一定程度上可以更好的量化的一個人的學習能力和水平,本文感謝科多大資料的馮老師,由他整理了經典的八大演算法,相關的資料希望能幫助大家瞭解。 演算法一:快速排序法 快速排序是由東尼 · 霍爾所發展的一種排序演算法。在平均狀況下,排序

程式設計思想 - 五大常用演算法

https://www.cnblogs.com/brucemengbm/p/6875340.html https://blog.csdn.net/changyuanchn/article/details/51476281 https://www.cnblogs.com/chuninggao/p/