開始前先講一下對稱加密演算法和公鑰加密演算法(我不喜歡叫非對稱加密演算法,這使我想起那個被問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。比如,3和11互質,那麼3的模反元素就是4,因為 (3 × 4)-1 可以被11整除。顯然,模反元素不止乙個, 4加減11的整數倍都是3的模反元素 ,即如果b是a的模反元素,則 b+kn 都是a的模反元素。這時,b就叫做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的逆元我們通過乙個例子,來理解rsa演算法。假設愛麗絲要與鮑勃進行加密通訊,她該怎麼生成公鑰和私鑰呢?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
第一步,隨機選擇兩個不相等的質數p和q。
愛麗絲選擇了61和53。(實際應用中,這兩個質數越大,就越難破解。)
第二步,計算p和q的乘積n。
愛麗絲就把61和53相乘。
n = 61×53 = 3233n的長度就是金鑰長度。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簡單,已...