前言
總括: 本文詳細講述了RSA演算法詳解,包括內部使用數學原理以及產生的過程。
- 原文部落格地址:RSA演算法詳解
- 知乎專欄&&簡書專題:前端進擊者(知乎)&&前端進擊者(簡書)
- 博主部落格地址:Damonare的個人部落格
相濡以沫。到底需要愛淡如水。
正文
之前寫過一篇文章SSL協議之資料加密過程,裡面詳細講述了資料加密的過程以及需要的演算法。SSL協議很巧妙的利用對稱加密和非對稱加密兩種演算法來對資料進行加密。這篇文章主要是針對一種最常見的非對稱加密演算法——RSA演算法進行講解。其實也就是對私鑰和公鑰產生的一種方式進行描述。首先先來了解下這個演算法的歷史:
RSA演算法的歷史
RSA是1977年由羅納德·李維斯特(Ron Rivest)、阿迪·薩莫爾(Adi Shamir)和倫納德·阿德曼(Leonard Adleman)一起提出的。當時他們三人都在麻省理工學院工作。RSA就是他們三人姓氏開頭字母拼在一起組成的。
但實際上,在1973年,在英國政府通訊總部工作的數學家克利福德·柯克斯(Clifford Cocks)在一個內部檔案中提出了一個相同的演算法,但他的發現被列入機密,一直到1997年才被髮表。
所以誰是RSA演算法的發明人呢?不好說,就好像貝爾並不是第一個發明電話的人但大家都記住的是貝爾一樣,這個地方我們作為旁觀者倒不用較真,重要的是這個演算法的內容:
RSA演算法的過程
RSA演算法用到的數學知識特別多,所以在中間介紹這個演算法生成私鑰和公鑰的過程中會穿插一些數學知識。生成步驟如下:
1. 尋找兩個不相同的質數
隨意選擇兩個大的質數p和q,p不等於q,計算N=p*q;
什麼是質數?我想可能會有一部分人已經忘記了,定義如下:
除了1和該數自身外,無法被其他自然數整除的數(也可定義為只有1該數本身兩個正因數]的數)。
比如2,3,5,7這些都是質數,9就不是了,因為3*3=9了
2. 根據尤拉函式獲取r
r = φ(N) = φ(p)φ(q) = (p-1)(q-1)。
這裡的數學概念就是什麼是尤拉函式了,什麼是尤拉函式呢?
尤拉函式的定義:
尤拉函式 φ(n)是小於或等於n的正整數中與n互質的數的數目。
互質的定義:
如果兩個或兩個以上的整數的最大公約數是 1,則稱它們為互質
例如:φ(8) = 4,因為1,3,5,7均和8互質。
推導尤拉函式:
(1)如果n = 1, φ(1) = 1;(小於等於1的正整數中唯一和1互質的數就是1本身);
(2)如果n為質數,φ(n) = n - 1;因為質數和每一個比它小的數字都互質。比如5,比它小的正整數1,2,3,4都和他互質;
(3) 如果n是a的k次冪,則 φ(n) = φ(a^k) = a^k - a^(k-1) = (a-1)a^(k-1);
(4) 若m,n互質,則φ(mn) = φ(m)φ(n)
證明:設A, B, C是跟m, n, mn互質的數的集,據中國剩餘定理(經常看數學典故的童鞋應該瞭解,剩餘定理又叫韓信點兵,也叫孫子定理),A*B和C可建立雙射一一對應)的關係。(或者也可以從初等代數角度給出尤拉函式積性的簡單證明) 因此的φ(n)值使用算術基本定理便知。(來自維基百科)
3. 選擇一個小於r並與r互質的整數e
選擇一個小於r並與r互質的整數e,求得e關於r的模反元素,命名為d(ed = 1(mod r)模反元素存在,當且僅當e與r互質),e我們通常取65537。
模反元素:
如果兩個正整數a和n互質,那麼一定可以找到整數b,使得 ab-1 被n整除,或者說ab被n除的餘數是1。
比如3和5互質,3關於5的模反元素就可能是2,因為3*2-1=5可以被5整除。所以很明顯模反元素不止一個,2加減5的整數倍都是3關於5的模反元素{...-3, 2,7,12…} 放在公式裡就是3*2 = 1 (mod 5)
上面所提到的尤拉函式用處實際上在於尤拉定理:
尤拉定理:
如果兩個正整數a和n互質,則n的尤拉函式 φ(n) 可以讓下面的等式成立:a^φ(n) = 1(mod n)
由此可得:a的φ(n - 1)次方肯定是a關於n的模反元素。
尤拉定理就可以用來證明模反元素必然存在。
由模反元素的定義和尤拉定理我們知道,a的φ(n)次方減去1,可以被n整除。比如,3和5互質,而5的尤拉函式φ(5)等於4,所以3的4次方(81)減去1,可以被5整除(80/5=16)。
小費馬定理:
假設正整數a與質數p互質,因為質數p的φ(p)等於p-1,則尤拉定理可以寫成a^(p-1) = 1 (mod p)
這其實是尤拉定理的一個特例。
4. 銷燬p和q
此時我們的(N , e)是公鑰,(N, d)為私鑰,愛麗絲會把公鑰(N, e)傳給鮑勃,然後將(N, d)自己藏起來。一對公鑰和私鑰就產生了,然後具體的使用方法呢?請看:SSL協議之資料加密過程詳解
RSA演算法的安全性
我們知道像RSA這種非對稱加密演算法很安全,那麼到底為啥子安全呢?
我們來看看上面這幾個過程產生的幾個數字:
- p,q:我們隨機挑選的兩個大質數;
- N:是由兩個大質數p和q相乘得到的。N = p * q;
- r:由尤拉函式得到的N的值,r = φ(N) = φ(p)φ(q) = (p-1)(q-1)。
- e:隨機選擇和和r互質的數字,實際中通常選擇65537;
- d: d是以尤拉定理為基礎求得的e關於r的模反元素,ed = 1 (mod r);
N和e我們都會公開使用,最為重要的就是私鑰中的d,d一旦洩露,加密也就失去了意義。那麼得到d的過程是如何的呢?如下:
- 比如知道e和r,因為d是e關於r的模反元素;r是φ(N) 的值
- 而φ(N)=(p-1)(q-1),所以知道p和q我們就能得到d;
- N = pq,從公開的資料中我們只知道N和e,所以問題的關鍵就是對N做因式分解能不能得出p和q
所以得出了在上篇部落格說到的結論,非對稱加密的原理:
將a和b相乘得出乘積c很容易,但要是想要通過乘積c推匯出a和b極難。即對一個大數進行因式分解極難
目前公開破譯的位數是768位,實際使用一般是1024位或是2048位,所以理論上特別的安全。