數論是一門研究天然數之間的關係和規律的學科,廣泛認爲是純數學的分支,但並不是是徹底沒有實用性的學科。現代密碼學中用到了不少基礎數論中的結論,特別是公鑰加密體系(例如RSA算法,橢圓曲線加密等)。html
本文目的在於梳理現代密碼學中經常使用到的基礎數論方面的定理和結論。其中包括素數的特性、歐幾里德算法、線性方程定理、算術基本定理、模算數運算、線性同餘定理、歐拉函數、費馬小定理、中國剩餘定理、歐拉定理、本原根、離散對數問題等等一些基礎知識。瞭解這些知識,應該可以理解現代密碼學中經典的算法
Diffie-Hellman密鑰協商和RSA算法的原理,進而可以理解祕鑰管理、數字簽名、消息認證、公鑰證書等密碼學領域的問題。安全
本文很大程度上參考了數論概述裏面的內容,也借鑑了算法導論和密碼編碼學與網絡安全原理與實踐的相關章節。網絡
數論對素數的特性尤爲感興趣,素數是整數的基礎構件,就像是元素在化學式中的做用相似。函數
一、$d$整除$a$記做:$d \mid a$ui
若是$d \mid a$且$d \mid b$,那麼$d \mid (ax + by)$.編碼
二、若是$p$是素數,且$p$整除乘積$ab$,則$p$整除$a$或者$p$整除$b$(或者$p$同時整除$a$和$b$)。加密
證實的關鍵是假設$p$不整除$a$,考慮$1=gcd(p,a)$同時整除$p$和$a$。但因爲$p$是素數,$p$的因子只能是1或者$p$,因此$gcd(p,a)=1$。由後面的線性方程定理得知,能夠構造線性方程$px+ay=1=gcd(p,a)$,兩邊同時乘上$b$,得$bpx+aby=b$,$p$整除左邊等價於$p$整除右邊的$b$。$p$不整除$b$的狀況能夠用一樣的方式證實。spa
拓展:若是素數$p$整除整數乘積$a_{1}a_{2}a_{3}...a_{r}$,則p至少整除$a_{1}$,$a_{2}$,$a_{2}$,$...$,$a_{r}$中至少一個因數。設計
三、1和任意一個天然數是都是互質關係。
四、任意兩個質數構成互質關係。
五、一個數是質數,另外一個數只要不是前者的倍數,二者就構成互質關係,好比3和10。
六、若是兩個數之中,較大的那個數是質數,則二者構成互質關係,好比97和57。
七、 $p$是大於1的整數,則$p$和$p-1$構成互質關係,好比57和56。
八、$p$是大於1的奇數,則$p$和$p-2$構成互質關係,好比17和15。
九、素數$p$與1到$p-1$的任意整數均互質。而且階乘$(p-1)!$與$p$互質,這個結論在後面費馬小定理和歐拉定理的證實過程當中會用到。
歐幾里德算法的原理和流程其實比較容易理解。
(GCD遞歸定理) :對於任意的非負整數$a$和正整數$b$,知足
$gcd(a,b)=gcd(b,a\;mod\;b)$
更詳細的將,其計算流程:
$a=q_{1}\times b+r_{1}\\b=q_{2}\times r_{1}+r_{2}\\r_{1}=q_{3}\times r_{2}+r_{3}\\r_{2}=q_{4}\times r_{3}+r_{4}\\...\\r_{n-3}=q_{n-1}\times r_{n-2}+r_{n-1}\\r_{n-2}=q_{n}\times r_{n-1}+r_{n}\\r_{n-1}=q_{n+1}\times r_{n}+0\\$
$r_{n}$即爲求得的$a$和$b$的最大公約數。
以上流程主要須要思考三個問題:
1)爲何$r_{n}$是公約數?(須要從下往上推理)
2)爲何$r_{n}$是最大的公約數?(假設$d$是$a$與$b$的任意公約數,若是可以證實$d$整數$r_{n}$,便可得證。)
3)爲何歐幾里德算法最後必定會終止?(由於每輪展轉以後的餘數是單調遞減的,展轉的輪次數有上界,最後必定可以保證餘數爲0,而後取最後一個非零餘數$r_{n}$就是正確的結果。)
算法實現Demo:
//歐幾里德算法迭代實現 public static int getGCD(int a,int b) { if (a<b) {//保證a>=b return getGCD(b, a); } if (b>=1) {//保證b>=1 int temp = 0; while(b>0) { temp = a%b; a = b; b = temp; } return a; }else { return -1; } }
擴展歐幾里德算法能夠用來求解一類有意思的線性方程的整數解,該線性方程的整數求解過程與最大公約數有密切關係。
對於線性方程($a,b,c$爲常數):
$ax+by=c$
是很熟悉的方程。這裏討論狀況是$a,b,c$知足必定的關係:$c=gcd(a,b)$,也便是這樣的線性方程:
$ax+by=gcd(a,b)$
這個線性方程必然有整數解,但咱們更關心若是用更好算法去求解,該算法利用歐幾里德算法求解最大公約數過程當中的中間商和餘數,進行擴展運算,在求$gcd(a,b)$的過程當中,同時也就求得線性方程的整數解$(x,y)$。
算法實現Demo:
public static long[] gcdExt(long a,long b){ long ans; long[] result=new long[3]; if(b==0) { result[0]=a; result[1]=1; result[2]=0; return result; } long [] temp=gcdExt(b,a%b); ans = temp[0]; result[0]=ans; result[1]=temp[2]; result[2]=temp[1]-(a/b)*temp[2]; return result; }
(算術基本定理):每一個整數$n\geqslant 2$可惟一分解成素數的乘積:
$n=p_{1}^{e_{1}}p_{2}^{e_{2}}...p_{r}^{e_{r}}$
其中,$p_{i}$爲素數,且$p_{1}<p_{2} <...<p_{r}$,$e_{i}$爲正整數。
實際上,看似理所固然的事實,其實並不是如此。若是自定義一個有別正整數集合的其餘集合,極可能就再也不知足惟一分解定理。例如,集合E是由偶數構成的集合:
$E=\left \{0,2,4,6,8,10,12...\right \}$
也可在這個集合中定義所謂的「素數」,稱之爲「E-素數」,2,6,10,14,18,22,26,30都是「E-素數」。對這個集合中的元素嘗試作「素因子」分解,並不老是能都到惟一分解的結果,例如180=10x18=2x30,存在兩種「E-素數」的分解形式。
實際上算術基本定理包含兩個方面:
1)$n$能夠分解成素數乘積的形式。
2)僅有一種這樣的素因子分解的形式(固然這裏不考慮因數重排序的狀況)。
顯然惟一性分解是算術基本定理的關鍵和重點。
另一個有意思的事實:
若是$n$是一個合數,則在小於等於$\sqrt{n}$的數中一定有一個數$a$整除合數$n$。
該結論基於算術基本定理:合數$n$一定能夠惟一分解多個素數的乘積,這裏假設$p$是它的素因子中最小的一個,則$n$一定能夠寫成$n=p\times m$的形式,這裏的$m$是其他大於等於$p$的素因子的乘積,顯然$m\geqslant p$,所以$n=p\times m\geqslant p\times p=p^{2}$
因此,在$0...\sqrt{n}$的範圍內,一定存在一個數$a$整除$n$。
能夠利用這種方法簡單的分辨一個數是不是素數,也能夠反覆執行上述過程將一個較小的合數進行素因子分解。
通常來說,能夠將$mod$視爲一種求餘數的二元運算符,例如$2=5\;mod\;3$;也能夠用來表示同餘關係,這種同餘關係一般用同餘式表示。例如$2\equiv 5\;(mod\;3)$表示模3時2與5同餘。
同餘式雖然有別於普通的算數運算下的等式,可是具備相同模的同餘式與普通等式有一些類似的特性:
若是已知:
$a_{1}\equiv b_{1}\;(mod\;m)$ 且$a_{2}\equiv b_{2}\;(mod\;m)$
那麼有:
$a_{2}\pm a_{2}\equiv b_{2}\pm b_{2}\;(mod\;m)$和$a_{2}a_{2}\equiv b_{2}b_{2}\;(mod\;m)$
同時,也不可貴出:
若是,$a^{k}\equiv b\;(mod\;m)$,那麼,$(a^{k})^j\equiv b^{j}\;(mod\;m)$
特別的當$b=1$時:
若是$a^{k}\equiv 1\;(mod\;m)$,那麼,$(a^{k})^{j}\equiv 1\;(mod\;m)$。
可是,由$ac\equiv bc\;(mod\;m)$不必定能獲得$a\equiv b\;(mod\;m)$。
例如$2\times25\equiv2\times20\;(mod\;10) $,可是$25\not\equiv 20\;(mod\;10)$。
只有當$c$和$m$互質時(也便是$gcd=(c,m)=1$),纔可以從同餘式兩邊消去$c$。
由同餘式能夠引出同餘方程:
$ax\equiv c\;(mod\;m)$
求解上述同餘方程有一個定理,叫作同餘方程定理。
(同餘方程定理):設$a,c,m$是整數,$m\geqslant 1$,且設$g=gcd(a,m)$,則
1)若是$g$不整除$c$,那麼同餘方程$ax\equiv c\;(mod\;m)$沒有解。
2)若是$g$整除$c$,那麼同餘方程$ax\equiv c\;(mod\;m)$剛好有$g$個解。
以上同餘方程的求解過程須要用到擴展歐幾里德的求解方法。實際上$ax\equiv c\;(mod\;m)$能夠轉化爲線性方程$ax+m(-y)=c$。
特別地,當$a$和$m$互質,即$g=gcd(a,m)=1$時,同餘方程變成:
$ax\equiv 1\;(mod\;m)$
$a$和$x$互爲模反元素,這在RSA公鑰加密算法生成祕鑰過程當中有應用。
費馬小定理揭示了整數的冪在模運算下的特殊規律。
(費馬小定理):設$p$是素數,$a$是任意的正整數且知足$a\not\equiv0\;(mod\;p)$,則
$a^{p-1}\equiv 1 \;(mod\;p)$
實際上對於條件的更簡單的表述能夠爲"$a$與素數$p$互質"便可。
證實費馬小定理並非很是難,證實過程是基於這樣一個結論:
設素數$p$與任意正整數$a$互質,那麼集合$S=\left \{ a,2a,3a,...(p-1)a \right \}$中任意任意兩個元素均不可能模$p$同餘。也便是$ja\not\equiv ka\;(mod\;p)$。其證實過程只須要利用反證法便可。
上述結論代表,若是對集合$S$中的每個元素模$p$的結果,其結果恰好與集合$T= \left \{ 1,2,3,4...(p-1) \right \}$中的元素一一對應(不考慮次序重排)。
因而有:
$a\times 2a\times3a...\times(p-1)a\equiv 1\times2\times3...\times(p-1)\;(mod\;p)$
稍微整理得:
$(p-1)!\times a^{p-1}\equiv(p-1)!\;(mod\;p)$
這裏必而後$gcd((p-1)!,p)=1$,因此,能夠兩邊消去$(p-1)!$,獲得$a^{p-1}\equiv 1 \;(mod\;p)$。
正是因爲存在這樣的關係,全部費馬小定理能夠用來簡化對整數的冪取模的計算。
費馬小定理在數論中很是重要,與其三個定理(分別是威爾遜定理、歐拉定理和中國剩餘定理)合稱數論四大基本定理。更有趣的是,費馬小定理實際上能夠視爲歐拉定理的一個特例。
最後,費馬小定理還有一種等價的表示形式:
若$p$是素數,$a$是正整數,則
$a^{p-1}\equiv a\;(mod\;p)$
這裏不須要$a$與$p$互質的條件。這並非一件很奇怪的事情,無非是利用模算術的除法特性(見同餘式與模算術)的變形。
中國剩餘定理(也叫做孫子定理)所描述的問題在小學課本中都能找到,只不過當時只能用方程組去刻畫這個的問題。
在數論中,它有不止一種表述形式,我見到的就至少有兩種。
其中一種比較易懂的描述爲:
設$m,n$是正整數,$gcd(m,n)=1$,$b,c$是任意正整數,則同餘方程組
$x\equiv b\;(mod\;m)\\x\equiv c\;(mod\;n)$
恰有一個解$0\leqslant x\leqslant mn$。
以上是從方程的角度描述,另一種從對應的角度(數與k元組的對應關係)表述也是可行的,能夠看作是上面表述形式更抽象的擴展:
令
$M=\prod_{i=1}^{k}m_{i}$,其中$m_{i}$兩兩互質
則$Z_{M}=\left \{ 0,1,2,3...(m-1)\right \}$中任意整數會對應一個$k$元組:
$A\leftrightarrow (a_{1},a_{2}...,a_{k})$
其中$a_{i}$固然是要在$Z_{m_{i}}$中(也便是$a_{i}\in Z_{m_{i}}$),而且$a_{i}$由關係$a_{i}=A\;mod\;m_{i}$給出。
從以上定理實際上能夠推斷出$A$與$k$元組惟一一對應的事實。
以上描述形式是算法導論和密碼編碼學與網絡安全--原理與實踐中採用的表述形式。相比於第一種表述形式,第二種表述更具備通用性,也更抽象。中國剩餘在推導歐拉函數求解公式時會用到。
歐拉函數$\phi (m)$的含義是1到$m-1$中(也就是$\left [ 1,m-1 \right ]$)且與$m$互質的整數的個數。它是數論中一個很是重要的函數。
如何計算歐拉函數的值是一個關鍵的問題。歐拉函數的計算方法的推導主要用到兩個結論:
(1)若是$p$是素數,$k\geqslant 1$,則$\phi (p^{k})=p^k-p^{k-1}=p^k(1-\frac{1}{p})$
(2)若是$gcd(m,n)=1$,則$\phi (mn)=\phi (m)\times \phi (n)$
證實(1)的思路很簡單:從1到$p^{k}$共有$p^{k}$個整數,這些整數中固然有可能存在與$p^{k}$不互質的數,那麼只要扣除去這些數就能夠了。顯而易見的是,這些與$p^{k}$不互質的數並不難找,它們分別是:
$p,2p,3p,...,(p^{k-1}-2)\times p,(p^{k-1}-1)\times p,p^{k-1}\times p$
一共有$p^{k-1}$個數與$p^{k}$不互質,那麼從$p^{k}$中扣除這$p^{k-1}$個數便可。
證實(2)比較複雜一點,其思路是採用計數的思想而後結合中國剩餘定理(第一種表述形式)來證實。
有了以上兩個結論,結合算術基本定理,能夠獲得計算$\phi (m)$比較通用的公式:
假設任意正整數$m$,且其素因子分解形式爲
$m=p_{1}^{k_{1}}p_{2}^{k_{2}}...p_{r}^{k_{r}}$
利用上面的(2)能夠獲得
$\phi (m)=\phi (p_{1}^{k_{1}})\phi (p_{2}^{k_{2}})...\phi (p_{r}^{k_{r}})$
而後利用(1),繼續獲得
$\phi (m)=p_{1}^{k_{1}}p_{2}^{k_{2}}...p_{r}^{k_{r}}(1-\frac{1}{p_{1}})(1-\frac{1}{p_{2}})...(1-\frac{1}{p_{r}})$
也就是
$\phi (m)=m(1-\frac{1}{p_{1}})(1-\frac{1}{p_{2}})...(1-\frac{1}{p_{r}})$
例如
$\phi (12)=\phi (2^{2}\times 3)=\phi (2^{2})\times \phi (3)=12\times (1-\frac{1}{2})\times (1-\frac{1}{3})=4$
另外,歐拉函數與各因數之間存在一種巧妙的關係:
設$d_{1},d_{2},...,d_{r}$是$n$的因數,則
$\phi (d_{1})+\phi (d_{2})+...+\phi (d_{r})=\phi (n)$
其實當$n=p$或者$n=p^{2}$甚至$n=p^{k}$($p$是素數)時,很容易驗證其正確性。
歐拉定理與費馬小定理一樣都是揭示了整數的冪在模運算下的特殊規律,實際上他們有微妙的關係。
(歐拉定理):若是$gcd(a,m)=1$,則
$a^{\phi (m)}\equiv 1\;(mod\;m)$
實際上證實歐拉定理的方法與證實費馬小定理基本相似,此處略去。
歐拉定理與費馬小定理有微妙的關係:若是這裏的$m$是一個素數,則$\phi (m)=m-1$,由此獲得費馬小定理。說明費馬小定理實際上能夠當作歐拉定理的一個特例。
與費馬小定理相似,歐拉定理也有另一種表現形式:
$a^{\phi (m)+1}\equiv a\;(mod\;m)$
這裏沒有要求$a$與$m$互質的條件。
若是兩個正整數$a$和$m$互質,那麼必定能夠找到整數$b$,使得 $ab-1$ 被$m$整除,或者說$ab$被$m$除的餘數是1。
$ab\equiv1\;(mod\;m)$
則此時$b$就是$a$的模反元素。
實際上這裏至關於求解同餘方程$ax\equiv 1\;(mod\;m)$,當$gcd(a,m)=1$時,一定存在一個整數解,所以模反元素一定存在,此解便是$a$的模反元素。
從歐拉定理的角度
$a^{\phi (m)}=a\times a^{\phi (m)-1}\equiv 1\;(mod\;m)$
也能夠證實模反元素是存在的。
更進一步,若是$p$是素數,由集合$Z_{p}=\left \{ 0,1,2,...p-1 \right \}$和二元運算模$p$的算術運算構成一個有限交換羣G。G中每個元素都有乘法逆元,此乘法逆元就是這裏的模反元素。
本原根一般與冪模有關,觀察以下例子:
$3^{1}\;mod\;7=3\\3^{2}\;mod\;7=2\\3^{3}\;mod\;7=6\\3^{4}\;mod\;7=4\\3^{5}\;mod\;7=5\\3^{6}\;mod\;7=1\\...$
能夠發現3的各冪次模$n$可以獲得一個循環的序列$\left \{ 3,2,6,4,5,1 \right \}$,這個序列恰好對應着小於等於7且與7互質的整數集合。這並不是一個偶然規律,2或者3的各次冪模5,2或者6或者7或者8的各次冪模11都可以獲得一樣的規律。
固然也並非老是這樣,例如
$2^{1}\;mod\;7=2\\2^{2}\;mod\;7=4\\2^{3}\;mod\;7=1\\2^{4}\;mod\;7=2\\...$
更通常的,考慮$p$爲素數,$gcd(a,p)=1$且$a\leqslant p-1$,以下序列
$a\;mod\;p,a^{2}\;mod\;p,a^{3}\;mod\;p,...,a^{p-3}\;mod\;p,a^{p-2}\;mod\;p,a^{p-1}\;mod\;p$
若是$a^{p-1}\;mod\;p=1$,那麼能夠證實上述序列值必然各不相同(證實能夠用反證法,不存在$a^{i}\equiv a^{j}\;(mod\;p)$的狀況)。由於這裏模$p$運算的結果總會映射到集合$Z_{p}=\left \{ 1,2,3,...,p-2,p-1 \right \}$,這個集合中的每一個元素與$p$互質。也便是說不考慮次序重排,上述序列值對應了集合$Z_{p}$的值。
這時稱$a$是$p$的本原根或者生成元。
並不是全部的整數都存在本原根,事實上只有$1,4,p^{\alpha},2p^{\alpha}$纔有本原根,其中$p$是任意奇素數,可見素數必定存在本原根。
(原根定理):每一個素數$p$都有本原根,並且恰好有$\phi (p-1)$個模$p$的本原根。
另外還有一些值得挖掘的規律,不難發現,對於$a^{k}\equiv1\;(mod\;p)$,這樣的$k$可能不止一個,好比:
$2^{3}\equiv 1\;(mod\;p)\\2^{6}\equiv 1\;(mod\;p)$
取最小的$k$稱爲$a$模$p$的階:$ord_{p}(a)$,例如$ord_{7}(2)=3$。
不難發現,$1\leqslant ord_{p}(a)\leqslant p-1$且老是整除$p-1$(從費馬小定理的角度思考能夠容易得出結論)。
離散對數的問題很好理解,與算術對數相對,只是在算術對數的基礎上增長了模運算。
對於$y=g^{x}\;mod\;p$,若是已知$x,g,p$求$y$是比較容易的求解的;可是反過來,已知$y,g,p$求$x$是很困難的,所以這裏能夠當作一個單向函數。
Diffie-Hellman密鑰協商原理正是基於這樣的離散對數問題而設計。而橢圓曲線加密是基於定義在橢圓曲線上的特殊加法運算規則下的離散對數問題而設計,二者達到的目的是一致的,都是利用某一個方向上的計算困難程度保證加密算法的機密性。
一、數論概述
二、算法導論.第三一章.數論算法
三、密碼編碼學與網絡安全原理與實踐
完!