RSA加密演算法原理
RSA概述
RSA加密演算法是一種 非對稱加密演算法 。在公開金鑰加密和電子商業中RSA被廣泛使用。RSA是1977年由羅納德·李維斯特(Ron Rivest)、阿迪·薩莫爾(Adi Shamir)和倫納德·阿德曼(Leonard Adleman)一起提出的。當時他們三人都在麻省理工學院工作。RSA就是他們三人姓氏開頭字母拼在一起組成的
數論基礎
其實RSA加密演算法最主要的就是兩個公式,在理解這兩個公式之前需要學習數論中的四個概念: 互質 、 尤拉函式 、 尤拉定理 、 模反元素
互質
如果兩個正整數,除了1以外沒有其他公因子,則稱這兩個數互質,比如6和21的公因子有3和1,所以6和21就不互質;而10和21只有一個公因子1,所以它們互質。 不是質數也可以構成互質關係
只要滿足以下幾點就可構成互質關係:
- 任意兩個質數構成互質關係,比如13和61
- 1和任意一個自然數是都是互質關係,比如1和99
- p是大於1的整數,則p和p-1構成互質關係,比如57和56
- p是大於1的奇數,則p和p-2構成互質關係,比如17和15
- 如果兩個數之中,較大的那個數是質數,則兩者構成互質關係,比如97和10
- 一個數是質數,另一個數只要不是前者的倍數,兩者就構成互質關係,比如3和10
尤拉函式
請問10以內的正整數有哪些與10互質呢?
答案是:{1,3,7,9},10以內用手就可以算的過來,那100呢?1000呢?數字越大越難手算出來,有公式可以計算,就是 尤拉函式
尤拉函式以$\psi(n)$表示。在1到10之中,與10形成互質關係的是{1,3,7,9},所以$\psi(10) = 4$
$\psi(n)$的計算方法並不複雜,推到步驟可以在網上找到,這裡只要記住最終結論就行
第一種情況
如果n = 1,則$\psi(1)=1$,因為1與任何數(包括自身)都構成互質關係
第二種情況
如果n是質數,則$\psi(n) = n - 1$。因為質數與小於他的每一個數都構成互質關係。比如5與1、2、3、4都構成互質關係
第三種情況如果n是質數的某一個次方值,即$n = p^k$(p為質數,k為大於等於1的整數),則:
$$
\psi(p^k) = p^k - p^{k-1}
$$
例如,$\psi(8) = \psi(2^3) = 2^3 - 2^2 = 4$
這是因為只有當一個數不包含質數p,才可能與n互質,而包含質數p的數共有$p^{k-1}$個,即$p,2p,3p...p^k$,把他們去除,剩下的就是與n互質的數
上面的式子還可以寫成下面的形式:
$$
\psi(p^k) = p^k - p^{k-1} = p^k(1-\frac{1}{p})
$$
可以看出,上面的第二種情況是k=1時的特例
第四種情況
如果n可以分解成兩個互質的整數之積$n = p_1 * p_2$,則:
$$
\psi(n) = \psi(p_1p_2) = \psi(p_1)\psi(p_2)
$$
積的尤拉函式等於各個因子的尤拉函式之積。例如,$\psi(56) = \psi(8*7) = \psi(8)*\psi(7)=4*6=24$
第五種情況
因為任意一個大於1的正整數,都可以寫成一系列質數的積$n=p^{k_1}_1p^{k_2}_2...p^{k_r}_r$
根據第四條結論,得到:
$$
\psi(n)=\psi(p^{k_1}_1)\psi(p^{k_2}_2)...\psi(p^{k_r}_r)
$$
再根據第三條結論,得到:
$$
\psi(n) = p^{k_1}_{1} p^{k_2}_{2} ... p^{k_r}_{r} (1-\frac{1}{p_1})(1-\frac{1}{p_2})...(1-\frac{1}{p_r})
$$
也就等於
$$
\psi(n) = n(1-\frac{1}{p_1})(1-\frac{1}{p_2})...(1-\frac{1}{p_r})
$$
這就是尤拉函式的通用計算公式。比如1323的尤拉函式,計算過程如下
$$
\psi(1323) = \psi(3^3 * 7^2) = 1323(1-\frac{1}{3})(1-\frac{1}{7})=756
$$
尤拉定理
尤拉定理指的是: 如果兩個正整數a和n互質,則n的尤拉函式 φ(n) 可以讓下面的等式成立:
$$
a^{\psi(n)} \equiv 1(mod\; n)
$$
也就是說,a的$\psi(n)$次方除以n的餘數為1。或者說,a的$\psi(n)次方減1可以整除n$。例如,3和7互質,而7的尤拉函式$\psi(7)=6$,所以$(3^6 - 1) / 7 = 728 / 7 = 104$
科普:mod為取模,取模運算與取餘運算還是有區別。取餘的商靠近0,而取模的商是靠近負無窮的
尤拉定理可以大大簡化某些運算。比如,7和10互質,根據尤拉定理,則$7^{\psi(10)} \equiv 1(mod\; 10)$
因此,7的任意次方的個位數(例如7的222次方),心算就可以算出來,因為$7^{222} = (7^4)^{55} * 7^2$,又因為某個整數的個位數,就是這個整數mod 10,所以$(7^{\psi(10)})^{55} * 7^2 \equiv 9 (mod\; 10)$
尤拉定理是RSA演算法的核心,只有理解這個定理,才能理解RSA
模反元素
如果兩個正整數a和n互質,那麼一定可以找到整數b,使得(a*b)-1整除n
$$
a * b \equiv 1(mod\; n)
$$
這時,b就叫a的“模反元素”
比如,3和11互質,找到3的模反元素4,使得(3*4)-1可以整除11。顯然,模反元素不止一個,4加減11的非零整數倍都是3的模反元素{...,-18,-7,4,15,...}。即如果b是a的模反元素,則$b+kn$都是a的模反元素
尤拉定理可以用來證明模反元素必然存在
$$
a^{\psi(n)} = a * a^{\psi(n) - 1} \equiv 1 (mod\; n)
$$
可以看到,$a^{\psi(n) - 1}$就是a的模反元素
RSA金鑰生成過程
首先假設小紅和小明兩個人進行通訊
因為RSA是非對稱加密演算法,這也就意味著加密和解密使用的是不同的金鑰,生成金鑰具體分為六步:
(1)隨機選擇兩個不相等的質數p和q
小紅隨機選擇61和53(實際應用中,兩個質數越大,就越難破解)
(2)計算p和q的乘積nn = 61*53 = 3233
(3)計算n的尤拉函式
這裡利用尤拉函式求解的第四種情況:
如果n可以分解成兩個互質的整數之積,即$n = p_1 * p_2$,則$\psi(n)=\psi(p_1p_2) = \psi(p_1)\psi(p_2)$,所以$\psi(3233)=\psi(61*53)=\psi(61)*\psi(53)$
又因為61和53都是質數,於是可以根據尤拉函式求解的第二種情況:
如果n是質數,則$\psi(n)=n-1$,所以$\psi(65) * \psi(53)=60*52=3120$
所以$\psi(n)=3120$
(4)隨機選擇一個整數$e$,條件是$1 < e < \psi(n)$,且$e$與$\psi(n)$互質小紅在1到3120之間,隨機選擇了17
(5)計算$e$對於$\psi(n)$的模反元素d
所謂模反元素就是指有一個整數d,可以使得e*d除以$\psi(n)$的餘數為1,公式表示為
$e * d = 1(mod \; \psi(n))$
這個公式等價於
$e * d - k * \psi(n) = 1$
將$e=17,\psi(n)=3120$帶入得
$17d - 3120k = 1$
令$d = x,-k = y$,則
$17x + 3120y = 1$
所以我們要求的模反元素d就是對上面的二元一次方程求解,根據擴充套件歐幾里得演算法(輾轉相除法)得

上圖我們使用拓展歐幾里得求得d=-367,但通常我們習慣取正整數,利用模反元素的特性
3和11互質,那麼3的模反元素就是4,因為 (3 × 4)-1 可以被11整除。顯然,模反元素不止一個, 4加減11的整數倍都是3的模反元素 {…,-18,-7,4,15,26,…},即如果b是a的模反元素,則 b+kn 都是a的模反元素
所以取$d = d + k\psi(n) = -367+1*3120=2753$
到現在為止,所有的計算都已結束
(6)將n和e封裝成公鑰,n和d封裝成私鑰
首先回歸一下一共出現的6個數字:
- $p = 61$ 隨機數,與$q$互質
- $q = 53$ 隨機數,與$p$互質
- $n = p * q = 3233$
- $\psi(n) = 3120$
- $e = 17$ 隨機數,條件是$1 < e < \psi(n)$,且$e$與$\psi(n)$互質
- $d = 2753$ $e$對於$\psi(n)$的模反元素$d$
在這個例子中n=3233,e=17,d=2753,所以公鑰就是 (n,e)=(3233,17),私鑰就是(n,d)=(3233, 2753),這樣小紅就可以將公鑰公佈出去,自己儲存好私鑰就可以了
RSA加解密演示
加密要用公鑰(n,e)
假設小明先試探性的給小紅髮一個字母m = 'A',由於在通訊傳輸中只能傳輸0和1,所以我們先將'A'轉ASCII碼為65,所以m = 65 (m必須是整數,且m必須小於n)
所謂加密,就是使用下面的加密公式算出密文c
$m^e = c(mod \; n)$
小明得到的公鑰是(n,e) = (3233,17),m = 65,那麼得到下面的等式
$65^{17} = c (mod \; 3233)$
小明通過計算得到c = 2790,所以他就把2790發給小紅了
(2)揭祕要用私鑰(n,d)
小紅拿到小明發過來的密文c = 2790,就用下面的公式進行解密出明文m:
$c^d \equiv m (mod \; n)$
而小紅的私鑰為(n,d) = (3233,2753),所以得到下面的等式:
$2790^{2753} \equiv m (mod \; 3233)$
小紅通過計算器以算,得m = 65,然後小紅對著ASCII碼錶得出65對應的字母為A
至此,整個加密過程就演示完了,總結一下:
- 小明獲取到小紅的公鑰(n,e) = (3233,17)
- 小明選取傳送的訊息m = 'A' = 65, 注意m要小於n,如果訊息大於n,必須分段加密!
- 小明通過加密公式:$m^e \equiv c (mod \; n)$ 算出密文c = 2790
- 小紅獲取到小明的密文c = 2790
- 小紅使用解密公式:$c^d \equiv m (mod \; n)$ 演算法明文m = 65 = 'A'