(1)密碼學之RSA演算法

2021-10-01 03:24:49 字數 4718 閱讀 2183

開始前先講一下對稱加密演算法和公鑰加密演算法(我不喜歡叫非對稱加密演算法,這使我想起那個被問md5演算法屬於對稱還是非對稱的恐懼)

對稱加密演算法

(1)甲方選擇某一種加密規則,對資訊進行加密;

(2)乙方使用同一種規則,對資訊進行解密。

公鑰加密演算法

(1)乙方生成兩把金鑰(公鑰和私鑰)。公鑰是公開的,任何人都可以獲得,私鑰則是保密的。

(2)甲方獲取乙方的公鑰,然後用它對資訊加密。

(3)乙方得到加密後的資訊,用私鑰解密。

在開始rsa之前先來補充一些數論知識

(1)互質關係

如果兩個正整數,除了1以外,沒有其他公因子,我們就稱這兩個數是互質關係(coprime)。比如,15和32沒有公因子,所以它們是互質關係。這說明,不是質數也可以構成互質關係。

任意兩個質數構成互質關係,比如13和61。

乙個數是質數,另乙個數只要不是前者的倍數,兩者就構成互質關係,比如3和10。

如果兩個數之中,較大的那個數是質數,則兩者構成互質關係,比如97和57。

1和任意乙個自然數是都是互質關係,比如1和99。

p是大於1的整數,則p和p-1構成互質關係,比如57和56。

p是大於1的奇數,則p和p-2構成互質關係,比如17和15。

(2)尤拉函式(這裡有乙個博主的解釋很好,以下引用了他的例子)

請思考以下問題:

任意給定正整數n,請問在小於等於n的正整數之中,有多少個與n構成互質關係?(比如,在1到8之中,有多少個數與8構成互質關係?)

計算這個值的方法就叫做尤拉函式,以φ(n)表示。在1到8之中,與8形成互質關係的是1、3、5、7,所以 φ(n) = 4。

φ(n) 的計算方法並不複雜,但是為了得到最後那個公式,需要一步步討論。

第一種情況

如果n=1,則 φ(1) = 1 。因為1與任何數(包括自身)都構成互質關係。

第二種情況

如果n是質數,則 φ(n)=n-1 。因為質數與小於它的每乙個數,都構成互質關係。比如5與1、2、3、4都構成互質關係。

第三種情況

如果n是質數的某乙個次方,即 n = p^k (p為質數,k為大於等於1的整數),則

比如 φ(8) = φ(2^3) =2^3 - 2^2 = 8 -4 = 4。

這是因為只有當乙個數不包含質數p,才可能與n互質。而包含質數p的數一共有p(k-1)個,即1×p、2×p、3×p、…、p(k-1)×p,把它們去除,剩下的就是與n互質的數。

上面的式子還可以寫成下面的形式:

可以看出,上面的第二種情況是 k=1 時的特例。

第四種情況

如果n可以分解成兩個互質的整數之積,

n = p1 × p2

φ(n) = φ(p1p2) = φ(p1)φ(p2)

即積的尤拉函式等於各個因子的尤拉函式之積。比如,φ(56)=φ(8×7)=φ(8)×φ(7)=4×6=24。

這一條的證明要用到"中國剩餘定理",這裡就不展開了,只簡單說一下思路:如果a與p1互質(a(3)尤拉定理

"尤拉定理"指的是:

如果兩個正整數a和n互質,則n的尤拉函式 φ(n) 可以讓下面的等式成立:

也就是說,a的φ(n)次方被n除的餘數為1。或者說,a的φ(n)次方減去1,可以被n整除。比如,3和7互質,而7的尤拉函式φ(7)等於6,所以3的6次方(729)減去1,可以被7整除(728/7=104)。

尤拉定理的證明比較複雜,這裡就省略了。我們只要記住它的結論就行了。

尤拉定理可以大大簡化某些運算。比如,7和10互質,根據尤拉定理,

已知 φ(10) 等於4,所以馬上得到7的4倍數次方的個位數肯定是1。

因此,7的任意次方的個位數(例如7的222次方),心算就可以算出來。

尤拉定理有乙個特殊情況。

(4)模反元素

如果兩個正整數a和n互質,那麼一定可以找到整數b,使得 ab-1 被n整除,或者說ab被n除的餘數是1。

這時,b就叫做a的"模反元素"。

比如,3和11互質,那麼3的模反元素就是4,因為 (3 × 4)-1 可以被11整除。顯然,模反元素不止乙個, 4加減11的整數倍都是3的模反元素 ,即如果b是a的模反元素,則 b+kn 都是a的模反元素。

尤拉定理可以用來證明模反元素必然存在。

另外舉一下歐幾里得和擴充套件歐幾里得(ax+by=c)的例子

歐幾里得:

舉例: 105和85的最大公約數

第一輪計算 105÷85=1…20

第二輪計算 85÷20=4…5

第三輪計算 20÷5=4

第三輪沒有餘數, 因此 105和85的最大公約數就是第三輪計算的被除數 5

擴充套件歐幾里得:

舉個例子 11 = 1(mod 20)求11的逆元

20 = 1 * 11 + 9 //注釋:此時x1 = 1, a = 11,p = 20,p1 = 9,執行p = a,a = p1

11 = 1 * 9 + 2 //注釋:x2 = 1,a = 9,p2 = 2。

9 = 2 * 4 + 1 //注釋:p3 = 1,

1 = 9-2 * 4。

從上述式子中可以得知 9 = 20-11

1 = 20-11-2 * 4

同時 2 = 11 -9

1 = 20 -11 -4 * (11-9)

已知 9 = 20 - 11

1 = 20 -11 -4 * (11-(20-11))

1 = 20 -11 -4 * (11-20+11)

合併同類項得

1 = 5 * 20 - 9 * 11

1 = y * 20 + x * 11

x為a的逆元 x = -9

x對p取餘,x = 11

驗證 11 * 11 = 121,121 mod 20 = 6 — 1

我們通過乙個例子,來理解rsa演算法。假設愛麗絲要與鮑勃進行加密通訊,她該怎麼生成公鑰和私鑰呢?

第一步,隨機選擇兩個不相等的質數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))

這個式子等價於

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)。

公鑰用到了兩個(n和e),其餘四個數字都是不公開的。其中最關鍵的是d,因為n和d組成了私鑰,一旦d洩漏,就等於私鑰洩漏。

一、加密和解密

(1)加密要用公鑰 (n,e)

假設鮑勃要向愛麗絲傳送加密資訊m,他就要用愛麗絲的公鑰 (n,e) 對m進行加密。這裡需要注意,m必須是整數(字串可以取ascii值或unicode值),且m必須小於n。

所謂"加密",就是算出下式的c:

me ≡ c (mod n)

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

6517 ≡ 2790 (mod 3233)

於是,c等於2790,鮑勃就把2790發給了愛麗絲。

2)解密要用私鑰(n,d)

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

cd ≡ m (mod n)

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

27902753 ≡ 65 (mod 3233)

因此,愛麗絲知道了鮑勃加密前的原文就是65。

密碼學演算法 RSA

rsa演算法安全瓶頸 rsa演算法的乘法同態特性 rsa第一次在r.l.rivest,a.shamir和l.adleman的1978年的 a method for obtaining digital signatures and public key cryptosystems 中,作為一種新的數字...

密碼學之RSA加密

最近在學習網易公開課上可汗學院現代密碼學的課程,整理了一下自己的筆記3 rsa加密 非對稱金鑰,公開金鑰演算法 rsa加密利用了單向函式正向求解很簡單,反向求解很複雜的特性。具體是利用了 1.對兩個質數相乘容易,而將其合數分解很難的這個特點進行的加密演算法。n p1 p2,已知p1 p2求n簡單,已...

密碼學之RSA加密

最近在學習網易公開課上可汗學院現代密碼學的課程,整理了一下自己的筆記3 rsa加密 非對稱金鑰,公開金鑰演算法 rsa加密利用了單向函式正向求解很簡單,反向求解很複雜的特性。具體是利用了 1.對兩個質數相乘容易,而將其合數分解很難的這個特點進行的加密演算法。n p1 p2,已知p1 p2求n簡單,已...