http://baijiahao.baidu.com/s?id=1581684919791448393&wfr=spider&for=pc
https://blog.csdn.net/u014079662/article/details/61169607
一 , 概述
在現代密碼學誕生以前,就已經有很多的加密方法了。例如,最古老的斯巴達加密棒,廣泛應用於公元前7世紀的古希臘。16世紀意大利數學家卡爾達諾發明的柵格密碼,基於單表代換的凱撒密碼、豬圈密碼,基於多表代換的維吉尼亞密碼,二戰中德軍廣泛使用的恩格瑪加密機….但最終都找到了有效的破解算法。
現代密碼學的誕生標志是1977年1月由美國國家標准局公布的數據加密標准(Data Encryption Standard,DES)。
在經過20多年之后,為適應現代的安全要求,2000年美國國家和標准技術協會篩選和評測出了被稱為AES(Advanced Encryption Standard)的加密算法作為新的加密標准。目前,AES已被廣泛使用,且未發現致命缺陷。到目前為止,AES是一個安全的加密算法。
然而,在加密算法之外,面臨一個問題,那就是:秘鑰的分發。就是說,解密方如何獲得加密方的秘鑰呢? 從而出現了:對稱加密和非對稱加密。
二,對稱加密和非對稱加密
1. 對稱加密
對稱加密指的就是加密和解密使用同一個秘鑰,所以叫做對稱加密。對稱加密只有一個秘鑰,作為私鑰。
常見的對稱加密算法:DES,AES,3DES等等。
2. 非對稱加密
非對稱加密指的是:加密和解密使用不同的秘鑰,一把作為公開的公鑰,另一把作為私鑰。公鑰加密的信息,只有私鑰才能解密。私鑰加密的信息,只有公鑰才能解密。
常見的非對稱加密算法:RSA,ECC
3. 區別
對稱加密算法相比非對稱加密算法來說,加解密的效率要高得多。但是缺陷在於對於秘鑰的管理上,以及在非安全信道中通訊時,密鑰交換的安全性不能保障。所以在實際的網絡環境中,會將兩者混合使用.
例如針對C/S模型,
1. 服務端計算出一對秘鑰pub/pri。將私鑰保密,將公鑰公開。
2. 客戶端請求服務端時,拿到服務端的公鑰pub。
3. 客戶端通過AES計算出一個對稱加密的秘鑰X。 然后使用pub將X進行加密。
4. 客戶端將加密后的密文發送給服務端。服務端通過pri解密獲得X。
5. 然后兩邊的通訊內容就通過對稱密鑰X以對稱加密算法來加解密。
三,RSA原理
我們先來看這樣一些基礎知識,並且以下我們討論全都是整數:
整數運算
在整數運算中 我們定義一個整數x
,那么他的負數為-x,並且有x+(-x
)=0;
他的倒數為x
, 並且有x
=1;
同余運算
有整數a,b,正整數m。 假如a除以m余b。我們稱為a模m同余b,模數為m。並且記為a≡b(modm)
,例如10除以3余1
我們稱10模3同余1,記為10≡1(mod3)
。
我們分別討論模數為合數和質數情況下,基於同余運算的負數和倒數。
1. 當模數為合數n
時
簡單起見,我們討論當n
為10的情況,10是兩個質數乘積
當模數為10的時候,參與運算的都是小於10的數。因為大於10的數除模取余之后都會小於10,所以只需要考慮小於模的數。
那么在同余運算中
一個小於10的數a,他的負數x
是什么? 也就是說使得(a+x ; 那就是n−a,即x。這里的x就像是常規運算下的-a。常規運算下a+(−a)=0,我們說−a是a的負數,這里(a+x,我們說x是a
的負數。;
有a+(n−a)=a+(−a)+n=n≡0(modn)
。 當n=10
的時候 ,有如下表
a |
---|
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | |
---|---|---|---|---|---|---|---|---|---|---|
x |
0 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 |
那么,a
的倒數a−1是什么呢? 它要使得a×a−1在模數為n的情況下等於1,即a×a−1≡1(modn)
當n=10
的時候我們會發現,對於有的數我們可以找到它的倒數,有的數卻找不到
例如當a=3
,我們可以找到7,使得3×7=21≡1(mod10)
;
而當a=4的時候,我們有4×0=0
,4×1=4,4×2=8,4×3=12,4×4=16,4×5=20,4×6=24,4×7=28,4×8=32,4×9=36
,在模10的情況下,都不會等於1。
我們對於所有小於10的a
都找他的倒數a−1
,有下表
a |
---|
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | |
---|---|---|---|---|---|---|---|---|---|
a−1 |
1 | 不存在 | 7 | 不存在 | 不存在 | 不存在 | 3 | 不存在 | 9 |
有什么規律呢?
數學界已證明:當a<n
時,只有當a和n互質才能找到a−1。 同時還有以下結論,當n=p×q ,且p和q都為質數時,所有小於n的數中,能找到倒數的個數為(p−1)×(q−1)
個。如果n有更多的質因子,那么計算會更復雜點。
我們把所有小於n,並且能和n互質的數的總個數記為一個函數φ(n)
,這個函數叫做歐拉函數。例
即當n=p×q
,且p和q都為質數時,有φ(n)=(p−1)×(q−1), 那么就有φ(10)=(2−1)×(5−1)=4
同時這些數還有以下兩個有趣的情況
-
這些數之間進行互乘的同余運算,結果還是這些數。
例如對於1:1×1≡1(mod10)
, 1×3≡3(mod10), 1×7≡7(mod10), 1×9≡9(mod10)
對於3:3×1≡3(mod10)
, 3×3≡9(mod10), 3×7≡1(mod10), 3×9≡7(mod10)
對於7:7×1≡7(mod10)
,7×3≡1(mod10),7×7≡9(mod10),7×9≡3(mod10)
對於9:9×1≡9(mod10)
,9×3≡7(mod10),9×7≡3(mod10),9×9≡1(mod10)
-
如果一些數在互相運算之后,得到的結果還是這些數中,我們稱這些數在這個運算條件下具有封閉性。
-
對這些數進行求冪運算,並且再模10,結果如下表
a |
---|
1 | 3 | 7 | 9 | |
---|---|---|---|---|
a0 |
1 | 1 | 1 | 1 | |
a1 |
1 | 3 | 7 | 9 | |
a2 |
1×1=1 |
3×3=9 |
7×7=9 |
9×9=1 |
a3 |
1×1×1=1 |
3×3×3=7 |
7×7×7=3 |
9×9×9=9 |
a4 |
1×1×1×1=1 |
3×3×3×3=1 |
7×7×7×7=1 |
1×1×1×1=1 |
其中,
-
我們規定a0≡1(mod10)
-
所有aφ(10)
的結果都為1,即有aφ(n)≡1(mod10)。(根據前面的介紹可知這里的φ(10)=(2−1)×(5−1)=4
-
)
-
對於3和7來說,他們的a0
、a1、a2、a3剛好把1,3,7,9各得到了一遍。到a4
時剛好又回到了1,如果大於4之后,又會開始循環
在模n的情況下一定能找到一個數g
,使得g0、g1、g2、……gφ(n)−1
-
剛好把所有與n互質並且小於n的數各得到一遍。我們把滿足這種條件的數稱為 生成元。
2. 當模數為質數p
的時候
當模p
為質數的時候,我們假設p=7
時。
同樣求小於 p
的數 a 的負數 x 使得(a+x
有如下表
a |
---|
1 | 2 | 3 | 4 | 5 | 6 | |
---|---|---|---|---|---|---|
x |
6 | 5 | 4 | 3 | 2 | 1 |
而求a
的倒數時,因為p是質數,所有小於p的數都和它互質。所以,所有小於p的數a都能找到它的倒數−a。它的歐拉函數φ(n)=p−1
。
如下表
a |
---|
1 | 2 | 3 | 4 | 5 | 6 | |
---|---|---|---|---|---|---|
a−1 |
1 | 4 | 5 | 2 | 3 | 6 |
它同樣有模數為合數n
時的性質
- 這些數在同余運算規則下進行乘法運算,同樣具有封閉性
- 任意的a
求冪依然滿足aφ(n)=1
- 的規則,且同樣有生成元
3. 離散對數問題
前面我們得到了有這么一個結論:
在模n的情況下一定能找到一個數g
,使得g0, g1 ,g2、……gφ(n)−1
剛好把所有與n互質並且小於n的數各得到一遍。我們把滿足這種條件的數稱為 生成元。
那么,在模n
的條件下,給定它的生成元g,以及一個小於n的正整數a。通過一個叫做同余冪的算法能夠快速的算出ga的值,我們把算得的結果記為b。 即我們在模n的條件下,能夠快速的算出b=ga
的值。
由於生成元的特性,我們知道,在模n
的條件下,給定生成元g,以及b的值,一定存在一個小於n的正整數a,使得b=ga
。那么如何求a的值?
我們發現,這個問題沒有任何規律。例如,當n=11,g=2時,有如下表
g |
---|
2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | |
---|---|---|---|---|---|---|---|---|---|---|---|
b=ga |
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 1 | |
a |
0 | 1 | 8 | 2 | 4 | 9 | 7 | 3 | 6 | 5 | 10 |
在實數計算中,我們知道當b=ga
時,a=l。然而這個計算在模n的條件下非常困難。這樣一個問題被稱為離散對數問題。在目前的技術條件下,這是一個極為困難的計算。當這個n
值達到十進制兩三百位時,即便是有大型計算機的情況下,所要花費的時間依然是個天文數字。
4.RSA原理
當n=p×q
,p與q是兩個大質數。只知道n的值,想要計算p和q
,這是一個世界性的極為困難的數學難題。RSA的基礎就是基於的n的兩個質數分解難題。
具體過程如下:
-
Alice選擇兩個大質數p
和q,求得n=p×q。計算φ(n)=(p−1)×(q−1),接下來,Alice選擇一個與φ(n)互質的數e,並計算e−1在模為φ(n)下的值,將計算出的值記為s
。
我們知道,e
與φ(n)互質,所以一定存在e−1, 這一步,service 就算出了公鑰和私鑰,其中,公鑰為(e,n),私鑰為(s,n
-
)
-
接下來,Bob可以在非安全信道請求Alice獲得公鑰。Evl通過中間攻擊,只能獲得(e,n)
,以及密文D。假定Bob需要發送的內容為m,計算D=me(modn)
-
,然后把D發送給Alice
-
Alice收到D之后,計算me(e−1)(modn)=me×e−1(modn)≡m(modn)
-
.
其中,在不安全信道中傳輸的是n
和e。然而,p和q只有Alice才知道,即便Eval獲得了n,基於質數分解難題,他無法算出p和q,也就無法算出私鑰s
來揭秘被加密的消息。
且,m不能是大於n的數,當m大於n時可以拆分之后分段加密。
舉個例子吧
- 假設取兩個質數p=11
, q=13,那么n=143.
φ(n)=(p−1)×(q−1)=120。
隨意選取一個和φ(n)互質的數e,假定這個數字為7,即e=7,
那么e−1=63,使得e×e−1再模φ(n)等於1,即e×e−1≡1(modφ(n)),即7×63=143≡1(mod120)
- .
- 公鑰為(e,n)
,即(7,143)。
私鑰為(s,n), 即(63,143)。
要加密的原始數據為m,假設m=13
- 。(計算機中任何數據,最后傳輸或者保存都會轉換成二進制的數據)
- 加密過程:Bob請求Alice,獲得公鑰,密文為D
, D=137(mod143)=117
- 。 Bob將D傳輸出去。
- Evl通過中間攻擊,只能獲得(e,n)
,以及密文D
- 解密過程:Alice獲得D
,通過只有Alice才有的私鑰進行解密。11763(mod143)=13
- ,獲得了原始數據。
這里的11和13比較小,知道公鑰為(7,143)之后,容易將143做因式分解求的11與13,從而可以算出e−1
。但是當p和q是兩個非常大的的質數的時候,就很難將其分解出來。 這樣,就無法算出e−1。從而不能從密文中獲得原始數據。