一、RSA演算法
RSA是非對稱加密演算法中的代表,它的重要性不言而喻,為了弄清楚RSA演算法,我們一起來完成一項任務:
背景:現在是疫情時代,假如小明和女朋友被迫在兩個城市,小明為了表達感情,想發給對方一句蜜語,但是不能讓其他任何人知道。
蜜語用計算機語言表達:105 ,32 ,73,111,118,101,32,117,因為明文,所以想用RSA演算法加密。如何做呢?
分為三步:
1、先搞清楚RSA的演算法步驟
2、對每一個數字加密
3、對方能夠解密
下來,我們一起完成幫小明完成心願。
RSA的演算法步驟:
1、隨機選兩個不相等的質數p和q
2、計算p和q的乘積n
3、計算n的尤拉函式 φ(n)
4、隨機選擇一個整數e,條件是1<e<φ(n),且e與φ(n)互質
5、計算e對於φ(n)的模反元素d
6、n和e為公鑰,n和d為私鑰
我們按照步驟,首先生成公鑰和私鑰
1、選兩個質數 13和7
2、n=13*7=91
3、φ(143)=φ(13*7)=φ(13)*φ(7)=12*6=72
4、隨機取一個數為5
5、通過擴充套件歐幾里得演算法,可以得出d=29
6、公鑰:(91,5) 私鑰:(91,29)
然後加密
m ^e ≡ c (mod n)
已知:m等於要傳送的蜜語,e=5,n=91,求c (c為加密後的資訊)
m=105,32 ,73,111,118,101,32,117
加密後的蜜語:14,2, 47,76,27, 82,2,52
最後解密
c ^d ≡ m (mod n)
已知:加密後的蜜語c,d=29,n=91 求m (m為原始蜜語)
c=14,2, 47,76,27, 82,2,52
解密後:14,32,73,20,27,10,32,26
存在問題:
1、當n比較小的時候,要加密的數比n大時,可能存在解密出來的數和原來的數差一個模。比如111,加密後是76,解密後是20, 20+91=111,其中91是模
2、模反元素求出的結果是負數
負數+模
解決思路:
選n的時候,選大一點,我們學習演算法的時候,為了好計算,所以取的值比較小。如果原始數值也很大的時候,就考慮分割加密,比如,我們的n=91,要加密105,就分成兩部分加密,比如加密一個10,再加密一個5,解密後,還是105,因為它只不過是字元序列而已。
二、質數
也稱素數:大於1的自然數中,除了1和它自身外,不能被其它自然數整除
質數分佈規律,隨著數字越大,質數分佈越稀疏
孿生質數:相差為2的質數對,如(3,5)(5,7)
在這裡,我介紹下數學界數論的四大猜想
孿生素數猜想
存在無限個孿生質數對
尤拉:瑞士數學家、自然科學家1707年4月15日~1783年9月18日
13歲讀大學、15歲大學畢業、16歲獲得碩士學位,18世紀最傑出的數學家之一,不滿十歲,就開始自學《代數學》,1766年患白內障,幾乎失明。
哥德巴赫:德國的一箇中學數學老師,1742年,給尤拉寫信,提出了哥德巴赫猜想
哥德巴赫猜想
(a)任何一個>=6之偶數,都可以表示成兩個奇質數之和。
(b) 任何一個>=9之奇數,都可以表示成三個奇質數之和。
從 9+9開始,逐步減少每個數裡所含質數因子的個數,直到最後使每個數裡都是一個質數為止,這樣就證明了哥德巴赫猜想。中國的數學家在這個問題上是領先世界的。
華羅庚只有初中學歷,由於家庭原因,被迫輟學,但是他的自學能力特別強,出版的數學著作數不勝數,上學的時候學習過他的文章,主要講統籌,比如,燒水的時候,同時乾點別的事情。我只是簡單地提下。
陳景潤有口吃,被停職,但是他的研究能力很厲害,上帝關了一道門,但是同時開了一扇窗。華羅庚發現了陳景潤的才能,被帶到研究院,陳景潤研究哥德巴赫猜想,證明了1+2,大偶數為一個素數及一個不超過兩個素數的乘積之和。迄今為止,是這個問題研究的終結點。
四色猜想
四色問題的內容是:“任何一張平面地圖只用四種顏色就能使具有共同邊界的國家著上不同的顏色。”用數學語言表示,即“將平面任意地細分為不相重疊的區域,每一個區域總可以用1,2,3,4這四個數字之一來標記,而不會使相鄰的兩個區域得到相同的數字。”
費馬猜想
形如xn+yn=zn的方程,當n>2時不可能有整數解。“關於此,我確信已發現了一種美妙的證法 ,可惜這裡空白的地方太小,寫不下”,費馬很有趣,美妙的證法,沒法讓其他人知道。
費馬 1601年8月17日~1665年1月12日, 法國律師和業餘數學家
三、尤拉函式
同餘類:模m同餘的整數構成的集合
完系:在模m同餘類中每一個類取一個數構成的集合叫m的一個完全剩餘系,簡稱完系
最小非負完系:0,1,2,... ,m-1
互質是公約數只有1的兩個整數,叫做互質整數,互質也稱互素。
縮系(既約剩餘系):{1,2,...m}中與m互素的數的集合
Φ(m)=s,s為縮系的個數
換句話說,對正整數n,小於n的正整數中與n互質的數的數目
積性函式:f(ab)=f(a)*f(b)
尤拉函式φ(n)是積性函式。如果m,n互素,Φ(m*n)=Φ(m)*Φ(n)
例如,3和5互素,由於φ(3)=2,φ(5)=4,φ(15)=φ(3)*φ(5)=2*4=8
積性函式證明
構造了一個nm的矩陣,找到同時與nm互素的元素
GCD(km+r,m)=GCD(r, m),所以每一列的 n 個元素同時與 m 互素,當且僅當 GCD(r,m)=1
與m互素的列共有Φ(m)個,假設第r列與m互素,r,m+r,2m+r, (n-1)m+r 是mod n的一個完系,在這一列中與n互素的共有Φ(n)個,所以Φ(mm)=Φ(m)*Φ(n)
尤拉定理:
mφ(n) ≡ 1 (mod n)
它能做什麼?簡化冪的模運算,還能做什麼,與RSA演算法有什麼關係?這個後面就會知道
尤拉定理證明:
設x1,x2...xφn 與n互質
ax1 (mod n),ax2 (mod n)...axφn ( mod n) 也與n互質,經過排序後與x1,x2...xφn相同
所以aX1 * aX2 * ... * aXφn ≡ X1 * X2 * ...* Xφn (mod n)
(aφ(n-1)X1 * X2 * ...* Xφn ≡ 0 (mod n)
因為X1 * X2 * ...... * Xφn與n互質,所以 (aφ(n-1)|n 即 aφ(n) ≡ 1 (mod n)
費馬小定理:
引理1:
若a,b,c為任意3個整數,m為正整數,且(m,c)=1,則當a·c≡b·c(mod m)時,有a≡b(mod m)
引理2:
設m是一個整數且m>1,b是一個整數且(m,b)=1。如果a[1],a[2],a[3],a[4],…a[m]是模m的一個完全剩餘系,則b·a[1],b·a[2],b·a[3],b·a[4],…b·a[m]也構成模m的一個完全剩餘系。
構造一個p的完全剩餘系
P={1,2,3,...,p-1}
因為 (a,p)=1,由引理2可得
A={a,2a,3a,...,(p-1)a},也是p的一個完全剩餘系。由完全剩餘系的性質
a*2a*3a*...*(p-1)a≡1*2*3*...*(p-1) (mod p)
所以1*2*3*...*(p-1)*ap-1≡1*2*3*...*(p-1) (mod p)
(p-1)! *ap-1≡(p-1)! (mod p)
((p-1),p)=1,兩邊同時約去 (p-1)!
ap-1≡1(mod p)
它是尤拉定理的一個特殊情況,當p為質數時,φ(p) =p-1
四、模反元素
ed ≡ 1 mod φ(n),已知e和φ(n),求d,用擴充套件歐幾里得演算法
歐幾里得是古希臘雅典著名的數學家,他著有《幾何原本》,是當時的一本教科書,是歐式幾何學的開創人。
歐幾里得演算法,就是碾轉相除法,求兩個正整數的最大公約數,已知a,b 求gcd(a,b)=gcd(b,a mod b),程式設計中經常用遞迴去計算
擴充套件歐幾里得演算法
ed=kφ(n)+1
ed-kφ(n)=1
符合ax+by=1,求解x
裴蜀定理:對於任何整數a、b和gcd(a,b)=d,則一定存在整數x,y,使得ax+by=d
推論,a,b互質的充分必要條件是存在整數x,y,使得ax+by=1
a*x+b*y = gcd(a , b)
= gcd(b , a mod b)
= b * x1 + (a mod b) * y1
= b * x1 + (a - a / b * b) * y1 即
a*x+b*y = b * x1 + (a - a / b * b) * y1
化簡上式,得
a*x+b*y = a*y1 - b*a/b*y1 + b*x1 , 即
a * x + b * y
= a * y1 + b * (x1-a/b*y1)
所以
x=y1
y=x1 - a/b*y1
用程式碼表示:
void exgcd(int a, int b, int &d, int &x ,int &y) { if ( !b ) { d = a; x = 1; y = 0; return; } int x1,y1; exgcd( b , a % b , d , x1 , y1 ); x = y1; y = x1 - ( a / b ) * y1; return ; }
中國剩餘定理,也叫孫子定理
《孫子算經》中有這樣一個問題:有物不知其數,三三數之剩二,五五數之剩三,七七數之剩二。問物幾何?
x mod 3=2
x mod 5=3
x mod 7=2
直接解決,似乎很困難,但是每一項分開求,就簡單了
x1 mod 3=2
x2 mod 5=3
x3 mod 7=2
針對同餘方程組,我們假設 x=x1+x2+x3,於是可以推出
x2+x3 mod 3 = 0
x1+x3 mod 5 = 0
x1+x2 mod 7 = 0
兩個數之和可以被3整除,姑且認為每個數都可以被3整除,簡化問題,通過觀察上面的式子就會發現,x1是5和7的公倍數,取最小公倍數35,x2和x3同理。同餘方程組變為:
35m1 ≡2 (mod 3)
21m2 ≡3(mod 5)
15m3≡ 2(mod 7)
根據引理1,可知被除數和餘數同時縮小相同的倍數, 同餘方程不變
35w1 ≡1 (mod 3)
21w2 ≡1(mod 5)
15w3≡ 1(mod 7)
問題轉換到求逆元,求出w1,w2,w3後,在依次計算
已知 m1=2w1,m2=3w2, m3=2w3 ,求出 m1,m2,m3,
已知 x1=35m1 ,x2=21m2 ,x3=15m3 ,求出x1,x2,x3
已知 x=x1+x2+x3,求出x
求出x的最小值
介紹中國剩餘定理的目的,一方面是因為它在數論裡很重要,另一方面,是它可以用擴充套件歐幾里得求解。
可是中國古人在研究這個問題的時候,歐幾里得擴充套件法是否已廣為人知。
五、解密證明
已知模反元素,證明解密
已知me ≡ c (mod n) ,證明cd ≡ m (mod n)
me= kn+c
c=me-kn
(me-kn)d ≡ m (mod n)
展開後,med≡ m (mod n)
因為ed ≡ 1 mod φ(n)
ed=hφ(n)+1
mhφ(n)+1 ≡ m (mod n)
假設m,n互質
根據尤拉定理 mφ(n) ≡ 1 (mod n)
(mφ(n))h *m ≡ m (mod n)
m,n 不互質的情況,這裡不再陳述,我覺得比較繁瑣。
已知加解密過程,倒推模反元素
me ≡ c (mod n) cd ≡ m (mod n)
med ≡ m (mod n)
med-1 ≡ 1 (mod n)
由尤拉定理可知 kφ(n)=ed-1
ed=kφ(n)+1
後記:
1、第一部分的例子中,由於n選的不夠大,所以導致加密比n的數字後,解密出來後就不準了。這個問題,希望真正想學習RSA演算法的益友,可以換個稍微大一點的n,再手動走一遍演算法。
2、網上參考的文章都是先介紹數學知識,然後很多人可能連演算法的全貌沒有看到,直接退出去了,因為數學知識不容易懂。所以我反其道而行之,先體驗加密解密的過程,然後再去弄懂演算法背後的數學知識。
3、為了搞清楚RSA演算法,我準備了好幾周,補習數學知識,這些知識是演算法的基石。RSA演算法的可靠性,建立在大數難以分解的數學原理之上。
4、例子要傳輸的原文是 i love u的ASCII碼,包括中間的空格
主要參考文章:
https://www.cnblogs.com/zylAK/p/9569668.html
https://zhuanlan.zhihu.com/p/58241990