1. 程式人生 > >安防之詳談RSA原理

安防之詳談RSA原理

密碼學發展史

討論RSA原理之前,我們先了解一下密碼學的發展史。因為RSA最終形成的數學演算法,也是不斷演變而來的。

歷史上最早的加密演算法

  • 中國
    話說歷史上最早的加密演算法的記載出自於周朝兵書《六韜.龍韜》中的《陰符》和《陰書》。其原理是使用文字拆分和符號代替等方式來加密資料。其實密碼學的誕生,就是為了運用在戰場。
  • 西方
    無獨有偶,在遙遠的西方加密演算法也大規模使用於戰爭之中。在希羅多德(Herodotus)的《歷史》中記載了公元前五世紀,希臘城邦和波斯帝國的戰爭中,廣泛使用了移位法進行加密處理戰爭通訊資訊。

凱撒密碼

由古代密碼演變而來的凱撒密碼

。相傳凱撒大帝為了防止敵人竊取資訊,就使用加密的方式傳遞資訊。那麼當時的加密方式非常的簡單,就是對二十幾個羅馬字母建立一張對照表,將明文對應成為密文。那麼這種方式其實持續了很久。甚至在二戰時期,日本的電報加密就是採用的這種原始加密方式。(更多內容推薦大家閱讀吳軍老師《數學之美》)

凱撒密碼

早期的密碼學一直沒有什麼改進,幾乎都是根據經驗慢慢發展的。直到20世紀中葉,密碼學的發展進入了”快車道“。由夏農發表的《祕密體制的通訊理論》一文,標誌著加密演算法的重心轉移往應用數學上的轉移。於是,逐漸衍生出了當今重要的三類加密演算法:非對稱加密對稱加密以及雜湊演算法(當然HASH嚴格說不是加密演算法,但由於其不可逆性,已成為加密演算法中的一個重要構成部分)。

1976年前

這段時間,所有的加密方式都是同一種模式:加密、解密使用同一種演算法。加密和解密的規則(金鑰)必須雙方都知道。那麼它的傳遞就成為了最大的隱患。這種加密方式被稱為對稱加密演算法

1976年

正是因為對稱加密演算法盛行(非對稱那個時候還沒有出現,但有些瘋狂的數學家已經開始構思這種方案,但並未成功)。人們為了更好的保護金鑰而絞盡腦汁。直到1976年,兩位美國計算機學家。迪菲(W.Diffie)、赫爾曼( M.Hellman ) 提出了一種嶄新構思,可以在不直接傳遞金鑰的情況下,完成金鑰交換。這被稱為**“迪菲赫爾曼金鑰交換”**演算法。也正是因為這個演算法的產生!人類終於可以實現非對稱加密了。那麼我們一起來看看這個演算法的數學原理。

牛人

由尤拉函式開始

在討論迪菲赫爾曼金鑰交換演算法之前,我們先了解幾個數學知識。並做一些公式的轉換。這樣你才能更好的體會到迪菲赫爾曼金鑰交換演算法它到底能發揮多麼神奇的作用。

尤拉函式

什麼是尤拉函式?先思考下面的問題。
思考
任意給定正整數n,請問在小於等於n的正整數之中,有多少個與n構成互質關係?

關於互質關係
如果兩個正整數,除了1以外,沒有其他公因數,我們就稱這兩個數是互質關係(coprime)。

計算這個值的方式叫做尤拉函式,使用:Φ(n)表示
如:

  • 計算8的尤拉函式,和8互質的 1、2、3、4、5、6、7、8
    φ(8) = 4
  • 計算7的尤拉函式,和7互質的 **1、2、3、4、5、6、**7
    φ(7) = 6
  • 計算56的尤拉函式
    φ(56) = φ(8) * φ(7) = 4 * 6 = 24

現在你會發現,並不是所有的尤拉函式都可以口算出來,有些甚至計算機都算不出來。當然你也發現了φ(56)似乎有些特殊。對了!尤拉函式有些特點是必須要知道的!
尤拉函式特點

  • 當n是質數的時候,φ(n)=n-1。
  • 如果n可以分解成兩個互質的整數之積,如n=AB則:
    φ(A
    B)=φ(A)* φ(B)
  • 根據以上兩點得到:
    如果N是兩個質數P1 和 P2的乘積則
    φ(N)=φ(P1)* φ(P2)=(P1-1)*(P2-1)

尤拉定理

瞭解了尤拉函式,接下來需要知道一個定理。既然是定理,就是恆古不變的,已經被數學家們證明過的,所以建議讀者可以驗證,但最好不要試圖去證明,這個比較耗時(主要是耗腦,別玩著玩著懷疑智商了…)

尤拉定理
如果兩個正整數m和n互質,那麼m的φ(n)次方減去1,可以被n整除。
說白了就是:

尤拉定理

費馬小定理
尤拉定理的特殊情況:如果兩個正整數m和n互質,而且n為質數!那麼φ(n)結果就是n-1。
那麼也就是:

費馬小定理

等式轉換

1、根據尤拉定理

尤拉定理

2、由於1^k ≡ 1,等號左右兩邊都來個k次方

等式轉換2

3、由於1* m ≡ m,等號左右兩邊都乘上m

等式轉換3

接下來,我們還需要進行等式轉換。那麼等式轉換4的前提是 模反元素

模反元素
如果兩個正整數e和x互質,那麼一定可以找到整數d,使得 ed-1 被x整除。
那麼d就是e對於x的模反元素
說白了就是

d是模反元素

這個模反元素的等式也可以進一步轉換,因為e*d 一定是x的倍數加1。所以如下:

等式轉換

那麼千辛萬苦!我們通過多次的等式轉換。終於可以將這兩個等式進行合併了!如下:

等式終極轉換

這個等式成立有一個前提!就是關於模反元素的。說白了就是當整數e和φ(n)互質!一定有一個整數d是e相對於φ(n)的模反元素。
我們可以測試一下。
m 4
n 15
φ(n) 8
e 如果取值為3
d 可以為 11、19…(模反元素很明顯不止一個,其實就是解二元一次方程)

如果你測試了,那麼你可以改變m的值試一下。其實這個等式不需要m和n 互質。只要m小於n 等式依然成立。
這裡需要注意的是,我們可以看做 m 通過一系列運算 得到結果任然是 m。這一系列運算中,分別出現了多個引數n、φ(n)、e還有d 。

那麼我們思考一下!

m 的 e乘上d 次方為加密運算 得到結果 c
c 模以 n 為解密運算 得到結果 m
這似乎可以用於加密和解密。但這樣,加密的結果會非常大。明文資料將非常小(雖然RSA用於加密的資料也很小,但是沒這麼大懸殊)
真正的RSA要更加強大,那麼RSA是怎麼演變來的呢??
早期很多數學家也停留在了這一步!直到1967年迪菲赫爾曼金鑰交換打破了僵局!

迪菲赫爾曼金鑰交換

那麼為什麼說 這個金鑰交換當時轟動了整個數學界!而且對人類密碼學的發展非常重要呢?因為這個偉大的演算法!能夠拆分剛才的等式。
當非對稱加密演算法沒有出現以前,人類都是用的對稱加密。
所以金鑰的傳遞,就必須要非常小心。
迪菲赫爾曼金鑰交換 就是解決了 金鑰傳遞 的保密性!!我們來看一下

迪菲赫爾曼金鑰交換

們來假設一個傳遞金鑰的場景。演算法就是用3 的次方 去模以17。 三個角色

  • 伺服器 隨機數 15
    • 這個15只有伺服器才知道。通過演算法!! 得到結果 6 因為 3的15次方 mod 17 = 6 。然後將結果 6 公開發送出去!!
    • 拿到客戶端的 6 ,然後用6^15 mod 17 得到結果10(10就是交換得到的金鑰)
  • 客戶端 隨機數13
    • 得到結果 3 的 13次方 mod 17 = 12 然後將12公佈出去。
    • 拿到伺服器的 12 ,然後用12^13 mod 17 得到結果10(10就是交換得到的金鑰)
  • 黑客
    它只能拿到6 和 12 。因為沒有私密資料13、15所以它沒法得到結果10.

那麼這裡可能一眼看過去不好理解!對吧!!
為什麼 6的13次方會和12的15次方得到一樣的結果呢?
因為這就是規律!! 可以用小一點的數字測試一下!!
3^3 mod 17 = 10
10 ^ 2 mod 17 = 332 mod 17 結果都是15 !!

迪菲赫爾曼金鑰交換最核心的地方就在於這個規律!

迪菲赫爾曼金鑰交換

RSA的誕生

一張圖看懂一切

以上就是RSA的數學原理,關於RSA的運用後面再慢慢闡述。本人才疏學淺,如果有地方寫得不對,請留言指出。這是一個我的iOS交流群:624212887,不管你是小白還是大牛歡迎入駐 ,分享技術,討論技術, 大家一起交流學習成長!