最近由於畢業論文的須要開始閱讀馮登國老師的《密碼學原理與實踐》(第三版),一邊讀一邊作本身的讀書筆記,加深對密碼學的理解。ios
在密碼學中能夠看到大量的數論知識,這些都是抽象代數課程的一部份內容,有時間我會再以另一個分類的形式敘述抽象代數的內容。在這裏只敘述密碼學中應用到的內容及其擴充。c++
Def1 (羣)設G是一個非空集合,若在G上定義一個二元運算" · ",它知足算法
(1) 結合律:對任何 $ a,b,c \in G,有 (a \cdot b) \cdot c = a \cdot (b \cdot c) $,則稱G是一個半羣,記做 $ (G, \cdot ) $ ,若 $ (G, \cdot ) $還知足ide
(2) 存在單位元 $ e \in G $ ,使得對任何 $ a \in G $ 有 $ e \cdot a = a \cdot e = a $ 函數
(3) 對任何 $ a \in G $ ,有 $ a^{-1} \in G $ ,使得 $ a^{-1} \cdot a = a \cdot a^{-1} = e $ ,則稱 $ (G, \cdot ) $ 是一個羣。ui
若是半羣中也有單位元,則稱爲幺半羣。idea
Def2 (交換羣)若是羣 $ (G, \cdot ) $ 知足交換律:對任何 $ a,b \in G $ 有 $ a \cdot b = b \cdot a $ ,則稱G爲交換羣或者Abel羣。spa
Def3 (環)設R是一個非空集合,若是在R中有兩種運算 $ +,\cdot $ 知足一下條件:c++11
(1) R是加法Abel羣和乘法半羣。code
(2) $ a \cdot (b \cdot c) = (a \cdot b) \cdot c $
(3) $ (a + b) \cdot c = a \cdot c + b \cdot c $ 和 $ a \cdot (b + c) = a \cdot b + a \cdot c $ 對任何 $ a,b,c \in R $ 成立。
(4) 存在 $ e \in R $ ,使得 $ e \cdot a = a \cdot e = a $ 對任何 $ a \in R $ 成立,e稱爲R中的單位元(或幺元)
則稱R爲一個環。
PS:在許多抽象代數課本中,第(4)條不是環定義所必須的,不過在密碼學討論的環中通常都是包含有單位元的環。
Def4 (模m剩餘類環)集合 $ \{ 0,1,…, m-1 \} $ 與運算加法(+)和乘法($\times$)定義爲模m剩餘類環,記爲$ Z_{m} $ 。
Thm5 設 $ a \in Z_{m} $ ,對任意的 $ b \in Z_{m} $ ,同餘方程 $ ax \equiv b(mod \, m) $ 有惟一解 $ x \in Z_{m} $ 的充分必要條件是 $ gcd( a , m ) = 1 $。
證實:假設 $ gcd(a,m) ≠ 1 $,那麼設 $ gcd(a,m) = d > 1 $ ,那麼同餘方程 $ ax \equiv 0(mod \, m) $ 至少有兩個解,分別爲$ x = 0 $ 和$ x = m / d $ ,矛盾。
假設 $ gcd(a,m) = 1 $,若是存在 $ x_{1},x_{2} $ 使得$$ ax_{1} \equiv ax_{2}(mod \, m) $$
那麼有$$ a(x_{1} - x_{2}) \equiv 0(mod \, m) $$
因而$$ m \mid a(x_{1} - x_{2}) $$
根據整除的基本屬性,因爲$ gcd(a , m) = 1 $,即 $ m \mid (x_{1} - x_{2}) $,這就意味着 $ x_{1} \equiv x_{2}(mod \, m) $,因而同餘方程的解是惟一的。
Def6 (歐拉函數)設 $ a \geq 1 ,m \geq 2 $且均爲整數,若是 $ gcd( a , m ) = 1 $,則稱a與m互素,在 $ Z_{m} $中全部與m互素的數的個數使用 $ \phi (m) $來表示,稱爲歐拉函數。
Thm7 (歐拉函數的一種計算公式)假定 $$ \prod_{i=1}^{n} {p_{i}} ^ {e_{i}} $$這裏$ p_{i} $均爲素數且互不相同,$ e_{i}>0 , 1 \leq\ i \leq n $。則$$ \phi (m) = \prod_{i=1}^{n} {({p_{i}}^{e_{i}} - {p_{i}}^{e_{i}-1})} $$
Def8 (乘法逆)設$ a \in Z_{m} $,若存在$ a^{'} \in Z_{m} $,使得$ aa^{'} \equiv a^{'}a \equiv 1(mod \, m) $,則$a^{'}$稱爲a在$Z_{m}$上的乘法逆,將其記爲$a^{-1} mod \, m$。在m是固定的情形下,也可將其簡記爲$a^{-1}$。
以上基本是書本第一章介紹的數論知識,下面根據此介紹Euclidean算法和中國剩餘定理,該內容在書上的第五章。
Euclidean算法又稱爲展轉相除法,是求給定兩個非負整數的最大公約數(用gcd(a,b)表示),其中最爲本質的是來源於多項式環中的帶餘除法,能夠總結爲以下的定理。
Thm9 (帶餘除法)設R爲一個交換環(即對乘法可交換),$f(x),g(x) \in R[x]$,若$g(x) \neq 0$且它的首項係數是R中的乘法可逆元,則存在惟一的一對多項式$q(x),r(x) \in R[x]$,使得
(1)$f(x) = g(x)q(x) + r(x)$;
(2)$deg(r) < deg(g)$;
此時q(x)稱爲商,r(x)稱爲餘式。
算法的主要步驟是令兩個數中較大的數做爲被除數,較小的數做爲除數作帶餘除法,獲得餘數,除數和餘數繼續作帶餘除法,直到某一項中餘數爲0,那麼商爲最大公約數,換言之,是以下的一個過程。
令這兩個數爲a,b,且$ a > b $,取商序列爲$q_{i}$,餘數序列爲$r_{i}$,其中$r_{0} = a , r_{1} = b , 0 \leq i \leq + \infty $,則$$ \begin{align} r_{0} &= r_{1}q_{1}+r_{2},r_{2} < q_{1} \\ r_{1} &= r_{2}q_{2}+r_{3},r_{3} < q_{2} \\ r_{2} &= r_{3}q_{3} + r_{4},r_{4} < q_{3}\\ r_{3} &= r_{4}q_{4} + r_{5},r_{5} < q_{4}\\ &……\\ r_{n-2} &= q_{n-1}r_{n-1}+r_{n},r_{n} < q_{n-1} \\ r_{n-1} &= q_{n}r_{n} \end{align}$$
因而最大公約數即爲$r_{n}$,寫成代碼版本就是
#include <algorithm> // std::swap for c++ before c++11 #include <utility> // std::swap for c++ since c++11 int gcd(int a,int b) { if (a < b) std::swap(a, b); return b == 0 ? a : gcd(b, a % b); }
可是這裏有一個問題存留就是,怎麼證實算法過程是對的,也就是,爲何這麼作能夠求得最大公約數,須要一個嚴格的數學證實。
Thm10 在上述Euclidean算法中,有以下結論 $$gcd( a , b ) = gcd ( b , r_{1} ) = gcd ( r_{1} , r_{2} ) = gcd ( r_{2} , r_{3} ) = …… = gcd ( r_{n-2} , r_{n-1} ) = gcd(r_{n-1} , r_{n}) = r_{n} $$
證實:
令$gcd( a , b ) = d$,那麼有$ d \vert a $ 以及 $ d \vert b $,由$a = bq_{1}+r_{1}$,可知$a - bq_{1} = r_{1}$,那麼獲得$d \vert r_{1} $,又由於$d \vert b$,即有d爲b和$r_{1}$的公約數,接下來要證實的是$d是b和r_{1}$的最大公約數。
假設存在$gcd(b,r_{1}) = d^{'} > d$,那麼因爲$d和d^{'}$都是公約數,有$d^{'} = dh,h > 1$,那麼由$a = bq_{1}+r_{1}$就容易獲得$d^{'} \vert a$,因此$d^{'}$也是$a和b$的公約數,顯然這與$d = gcd(a,b)$矛盾,這就說明$d^{'} \leq d$。
若是$d^{'} < d$,這與$d \vert r_{1},d \vert b$矛盾,因而只可以$d^{'} = d$。
同理可一直這樣子證到最後一步,當能整除時,最大公約數固然是待比較的兩個數中較小的那個數。
到這裏爲止,因爲Euclidean算法能計算出最大公因子,它能夠用來判斷一個非負整數$b < n$是否有模n的乘法逆,若是求出來最大公約數爲1,說明b與n互素,不然說明b與n有公因子。不過還存在一個問題是,當b與n互素的時候,仍是沒有辦法求出$b^{-1} mod \, n$,所以下一步咱們要想辦法求出乘法逆,這就是接下來要介紹的擴展Euclidean算法,先討論它的數學理論,那就是著名的Bezout等式。
Thm11 (Bezout定理的數學版本)設$a,b \geq 0$且爲整數,則$gcd( a , b ) = c_{1}a+c_{2}b$,其中$c_{1}和c_{2}$爲常數。
證實:回憶展轉相除法的求解過程,咱們令$gcd(a,b) = r_{n}$,在倒數第二步的時候有$$r_{n-2} = r_{n-1}q_{n-1}+r_{n}$$求解$r_{n}$得$$\begin{align} r_{n} &= r_{n-2}-r_{n-1}q_{n-1} \\ &=r_{n-2} - (r_{n-3}-r_{n-2}q_{n-2})q_{n-1} \\ &=(1+q_{n-2}q_{n-1})r_{n-2}-q_{n-1}r_{n-3} \\ &=(1+q_{n-2}q_{n-1})(r_{n-4}-r_{n-3}q_{n-3})-q_{n-1}r_{n-3} \\ & …… \\ &=ua+vb \\ \end{align}$$
證實過程其實也就是將展轉相除法倒回去計算,不斷的遞歸消去$r_{i}$,從而獲得原來a和b的一個線性組合。下一步考慮的是如何使用計算機實現擴展的Euclidean算法,課本上給出僞代碼的形式,我將其轉化爲C++的代碼求解。
1 #include <iostream> 2 using namespace std; 3 4 void Extended_Euclidean_Algorithm(int a, int b) 5 { 6 int a0 = a; 7 int b0 = b; 8 int t0 = 1; 9 int t = 0; 10 int s0 = 0; 11 int s = 1; 12 int q = a0 / b0; 13 int r = a0 - q*b0; 14 int temp = 0; 15 while (r > 0) 16 { 17 //迭代係數t 18 temp = t0 - q*t; 19 t0 = t; 20 t = temp; 21 //迭代係數s 22 temp = s0 - q*s; 23 s0 = s; 24 s = temp; 25 //求最大公約數 26 a0 = b0; 27 b0 = r; 28 q = a0 / b0; 29 r = a0 - q*b0; 30 } 31 r = b0; 32 cout << "最大公約數爲:" << r << endl; 33 cout << "s的值爲:" << s << endl; 34 cout << "t的值爲:" << t << endl; 35 cout << "sa+tb=" << s*a + t*b << endl; 36 } 37 38 int main() 39 { 40 int a, b; 41 cin >> a >> b; 42 Extended_Euclidean_Algorithm(a, b); 43 system("pause"); 44 return 0; 45 }
這裏面最難理解的是兩個迭代係數爲何要如此進行求解,爲此咱們須要以下一個定理。
Thm11' (Bezout定理的計算機版本)給定$r_{i}$爲Euclidean算法中$r_{i}$的定義,那麼對於$0 \leq i \leq m$,有$r_{i} = s_{i}r_{0} + t_{i}r_{1}$,其中定義序列$s_{i}$和$t_{i}$以下$$s_{i} = \begin{cases} 1 &\text i = 0 \\ 0 &\text i = 1 \\ s_{i-2} - q_{i-1}s_{i-1} &\text i \geq 2 \\ \end{cases} $$ $$t_{i} = \begin{cases} 0 &\text i = 0 \\ 1 &\text i = 1 \\ t_{i-2} - q_{i-1}t_{i-1} &\text i \geq 2\\ \end{cases} $$
證實:
只須要對i用概括法證實便可,當$i = 0 和 i = 1$時命題顯然成立,假設命題對於$i = k - 1和 i = k - 2,k \geq 2$時成立,咱們須要證實命題對於$i = k$時成立,由概括假設有$$r_{k-2} = s_{k-2}r_{0} + t_{k-2}r_{1}$$和$$r_{k-1} = s_{k-1}r_{0} + t_{k-1}r_{1}$$如今計算$$\begin{align} r_{k} &= r_{k-2}-q_{k-1}r_{k-1}\\ &= s_{k-2}r_{0}+t_{k-2}r_{1}-q_{k-1}(s_{k-1}r_{0}+t_{k-1}r_{1})\\ &=(s_{k-2}-q_{k-1}s_{k-1})r_{0}+(t_{k-2}-q_{k-1}t_{k-1})r_{1} \\ &=s_{k}r_{0}+t_{k}r_{1} \\ \end{align}$$
所以由概括法可知,命題對於全部整數$i \geq 0$是正確的。
有了這個定理,咱們就理解了這個迭代係數是怎麼設置的了,也就明白了整個擴展Euclidean算法的流程了,有了這個算法,咱們就能夠求$b^{-1} mod \, m$了,來看下面的一個定理。
Thm12 假設$gcd(r_{0} , r_{1}) = 1$,則$r^{-1}_1 (mod \, r_{0}) = t_{n} (mod \, r_{0})$,其中$t_{n}$如前面定義。
證實:
由Thm11',能夠獲得$$1 = gcd(r_{0} , r_{1}) = s_{n}r_{0} + t_{n}r_{1}$$兩邊模$r_{0}$約化等式就能夠獲得$$ t_{n}r_{1} \equiv 1(mod \, r_{0})$$得證。
最後要說的是,在擴展Euclidean算法中,若是隻爲了求$b^{-1} mod \, m$,能夠將全部的$s_{i}$過程所有去掉,只留下求$t_{i}$的過程。
中國剩餘定理是求解特定的同餘方程組的方法。考慮$m_{1},…,m_{r}$爲兩兩互素的正整數,假定$a_{1},…,a_{r}$爲整數,考慮以下的同餘方程組$$ \begin{align} x &\equiv a_{1} \quad (mod \, m_{1}) \\ x &\equiv a_{2} \quad (mod \, m_{2}) \\ x &\equiv a_{3} \quad (mod \, m_{3}) \\ &……\\ x &\equiv a_{r} \quad (mod \, m_{r}) \\ \end{align}$$中國剩餘定理斷言這個方程組有模$M=m_{1} \times m_{2} \times m_{3} \times … \times m_{r}$的惟一解。
Thm13 (中國剩餘定理)假定$m_{1},…,m_{r}$爲兩兩互素的正整數,$a_{1},…,a_{r}$爲整數,那麼同餘方程組$x \equiv a_{i}(mod \, m_{i})(1 \leq i \leq r)$有模$M=m_{1} \times m_{2} \times … \times m_{r}$的惟一解,此解由下列式子給出:$$x=\sum_{i=1}^{r}a_{i}M_{i}y_{i} \, (mod \, M)$$其中$M_{i} = M/m_{i}$,且$y_{i} = M^{-1}_{i} mod \, m_{i},1 \leq i \leq r$。
證實:
如上述定義,設$1 \leq i \leq r$,則有$M_{i} = M/m_{i}$,那麼有$$ gcd(M_{i},m_{i}) = 1 $$
再由前面Thm12可知$y_{i}$的定義是合理的,所以能夠獲得$$ \begin{align} M_{i}y_{i} &\equiv 1(mod \, m_{i})\\ a_{i}M_{i}y_{i} &\equiv a_{i}(mod \, m_{i})\\ \end{align}$$
注意到$M_{i}$的構造,能夠知道當$i \neq j$時,有$$a_{i}M_{i}y_{i} \equiv 0(mod \, m_{j}) $$
如今,定義一個函數$\rho: Z_{m1} \times Z_{m2} \times … \times Z_{mr} \longrightarrow Z_{M}$以下:$$\rho (a_{1},a_{2},…,a_{r}) = \sum_{i=1}^{r}a_{i}M_{i}y_{i} \, (mod \, M) $$
因而很容易獲得這個函數$$ \rho (a_{1},a_{2},…,a_{r}) \equiv a_{i}(mod \, m_{i}) $$
所以這個函數就是咱們須要的中國剩餘定理的解。
對於證實惟一性,須要考慮它的反函數$$\chi: Z_{M} \longrightarrow Z_{m1} \times Z_{m2} \times …… \times Z_{mr}$$
這個函數是從基數爲M的定義域到基數爲M的值域的映射,很顯然這是一個單射,經過計數能夠驗證它是一個滿射,所以它是一個雙射,再由離散數學相關定理可知道它的反函數也是一個雙射,證畢。
Def14 (元素和羣的階數)對於一個有限羣G,定義元素$g \in G$的階數爲使得$g^{m} = 1$的最小正整數m,定義羣的階數爲羣的全部元素個數。
Thm15 (Lagrange定理)假定G是一個階爲n的乘法羣,且$g \in G$,那麼g的階整除n。
證實:這個證實須要較多的抽象代數知識,故先略去。
Thm16 定義$Z^{ \star }_{n}$爲$Z_{n}$中全部與n互素的全體元素的集合,若是$b \in Z^{ \star }_{n}$,那麼$b^{\phi (n)} \equiv 1 (mod \, n)$,其中$\phi (n)$爲歐拉函數
證實:這是由於$Z^{\star}_{n}$是階爲$\phi (n)$的乘法羣。
Thm17 (Fermat小定理)假定p是一個素數,且$b \in Z_{p}$,那麼$b^{p} \equiv b(mod \, p)$
證實:若是p是一個素數,那麼歐拉函數$\phi (p) = p - 1$,且$b \in Z_{p}$,所以$gcd(b , p) = 1$,由Thm16可知$b^{\phi (p)} \equiv 1 (mod \, p)$,即$b^{p-1} \equiv 1 (mod \, p)$,兩邊再同乘一個b即證。
Def18 (模p的本原元素)若是一個元素b具備模p的階等於p-1,即對於全部的$1 \leq i \leq p-2$,均有$b^{i} \neq 1(mod \, p)$,且$b^{p-1} \equiv 1(mod \, p)$。
Thm19 假定p是一個素數且b是一個模p的本原元素,任一元素$\beta \in Z^{\star}_{p}$能夠寫成惟一的形式$\beta = b^{i}$,其中$0 \leq i \leq p-2$,且$\beta$的階爲$\frac{p-1}{gcd(p-1,i)}$
證實:
利用抽象代數的知識可知道任何一個有限循環羣能夠寫成生成元的冪次的形式,且最高冪次+1就是羣的階,所以這個定理的前半部分是很是顯然的。
後半部分經過計算得$$\beta ^{\frac{p-1}{gcd(p-1,i)}} \quad = b^{\frac{i(p-1)}{gcd(p-1,i)}}$$
那麼令$k = \frac{i}{gcd(p-1,i)} \in N$,因而就有$$\beta ^{\frac{p-1}{gcd(p-1,i)}} \quad = b ^{k(p-1)} = b ^{(p-1)k} = 1^{k} = 1$$
PS:模p的本原元素的個數爲$\phi (p-1)$
有了Thm19,咱們能夠迅速的肯定某個素數的本原元素個數,可是若是還須要計算它們的具體值,還須要根據定義驗證全部的冪次值,這在素數很是大的狀況下是很難的,有沒有什麼更快的方法呢?
Thm20 假定$p > 2$是一個素數,且$b \in Z^{\star}_{p}$,那麼當b是一個模p的本原元素當且僅當$b^{\frac{p-1}{q}} \neq 1(mod \, p)$對於全部知足$q \mid (p-1)$的素數q都成立。
證實:
充分性顯然,下面來證必要性。
假定$ b \in Z^{\star}{p}$不是模p的本原元素。令d爲b的階,由Lagrange定理有$d \mid (p-1)$。
由於b不是本原的,因此有$d < p-1 $,因而有$\frac{p-1}{d}$是一個大於1的整數,取q爲$\frac{p-1}{d}$的素因子(即除了1和q之外沒有),那麼有d是$\frac{p-1}{q}$的一個因子,從而有$$b^{d} \equiv 1(mod \, p)且d \mid \frac{p-1}{q}$$因而$b^{\frac{p-1}{q}} \equiv 1(mod \, p)$,證畢。
下一篇文章我打算會一邊更新我在讀的RSA密碼體制內容,一邊更新之前讀過的一些機率論和熵的知識。