RSA加密解密算法—數論基礎

本章涉及知識點

1、素數的定義

2、尋找素數算法—短除法

3、尋找素數算法—篩選法

4、互質關系

5、歐拉函數的證明

6、歐拉定理

7、費馬小定理

8、模反元素

9、歐幾里得算法—求最大公約數

10、貝祖定理

11、歐幾里得擴展算法—求二元一次方程的解

12、大整數快速冪算法

13、大整數快速冪取模算法

14、總結

一、素數的定義

質數又稱素數,指在一個大于1的自然數中,除了1和本身之外,無法被其他自然數整除的數

素數具有下列獨特的性質:

(1)素數p的因子有且只有兩個:1和p

2)素數一定是奇數

(3)任意一個大于1的正整數N,一定可以質因式分解為它的有限個質因子之積

(4)素數的個數是無限的

(5)所有大于10的素數中,其個位數只能是1,3,7,9其中之一

(6)一個充分大的偶數一定可以寫成:一個素數加上一個最多由2個質因子所組成的合成數

如果將素數p表示成極坐標方程

素數p的極坐標方程

我們將第500到第5000的素數畫在笛卡爾坐標系來觀察其分布:

素數螺旋

可以看到素數的分布呈螺旋形狀,這種現象又叫質數螺旋

幾百年之間,無數世界頂級的數學家,研究一生始終無法精確的證明素數的表達式以及其分布的規律

二、尋找素數算法—短除法

問題定義:在給定范圍n之內,找到所有素數

(1)方法一:

最直接的方法就是從定義出發,對于任意整數p,用[2,p-1]去整除p,如果發現p可以被整除,p就不是素數

顯然,這個方法的效率簡直低的讓人難以接受,優化空間非常大

(2)方法二:

顯然偶數不是素數,對于任意奇數p,用[3,5,...,p-2]去整除p,如果發現p可以被整除,p就不是素數

這個方法的效率稍微高了一些,但是其本質和方法一沒有任何區別,只是整除系數范圍縮小到奇數

(3)方法三:

利用質因式分解的思想,對于任意奇數p,用小于p的素數去整除p,如果發現p可以被整除,p就不是素數

這個方法的計算效率又提高了一些,將奇數級別的除數縮小到質數范圍

(4)方法四:

利用平方根條件,對于任意奇數p,用小于p的平方根的素數去整除p,如果發現p可以被整除,p就不是素數

這個方法將素數級別的除數又縮小到不大于其平方根的范圍,我們稱之為短除法

我們用python實現短除算法,并測試尋找在[2,2^22]范圍內所有的素數的算法效率

短除算法
尋找結果

從短除算法尋找結果中,可以看到該算法花費了13秒,找到295947個素數

三、尋找素數算法—篩選法

除了上述的短除算法,是否存在更加高效的算法來尋找素數?

的確存在一個非常高效的算法—篩選法,其設計思想是:

(1)將n個數字全部放進數組,并都置為肯定狀態

(2)將數組下標是偶數的數字全部置為否定狀態

(3)依次遍歷數組長度的平方根個數字

(4)如果當前數字處于被肯定的狀態,則將其倍數的數字狀態置為否定

我們用python實現篩選算法,并測試尋找在[2,2^22]范圍內所有的素數的算法效率

篩選算法
尋找結果

從篩選算法尋找結果中,可以看到該算法只花費了1.16秒,就找到295947個素數

至此我們可以總結出比較上述找尋素數的兩種算法

(1)短除算法:使用了嚴進寬出的思想,對每個數字的判斷非常嚴格,保證每次找到的數字都是素數,時間復雜度較高

(2)篩選算法:使用了寬進嚴出的思想,一步步篩選(否定),最后保留下來的數字才是素數,利用空間換取時間來大大降低了時間復雜度

四、互質關系

公因數只有1的兩個數字,稱為互質關系

互質具有下列獨特的性質:

(1)任意兩個素數一定是互質關系

(2)如果一個數是素數,另一個數字不是它的倍數,則二者互質

(3)較大的數是素數,則二者互質

(4)相鄰的兩個自然數一定互質

(5)相鄰的兩個奇數一定互質

(6)1和任意數互質

五、歐拉函數的證明

問題的提出:

給定任意正整數n,問在小于等于n的正整數之中,有多少個數字與n構成互質關系?

我們定義歐拉函數φ(n)來表示這個值,則分析討論φ(n)可能存在的情況

(1)當n等于1的情況:

則根據互質的性質6可以得到

n=1的情況

(2)當n等于素數p的情況:

則n以下的數字和n都互質

n=p的情況

(3)當n等于素數的某一個次方,即n = p^k的情況:

則小于等于p^k且與p^k不互質的個數有

小于等于p^k且與p^k不互質的個數

則φ(n) = (p^k個數字) -? (小于等于p^k且與p^k不互質的個數),即

n=p^k的情況

(4)當n等于兩個素數的乘積,即n=p*q(p和q互質)的情況:

則φ(n) =φ(pq)滿足乘法分配律,即?

n=p*q的情況

(5)當n等于任意大于1的正整數的情況:

由素數的性質3(質因數分解)可以得到

正整數n的質因數分解

其中p1、p2...pr都是n的質因數

則根據上述(3)和(4)的分析結果,可以推導出

n等于任意大于1的正整數的情況

綜上分析,我們得到歐拉函數的通用計算方式為

歐拉函數的通用計算方式

六、歐拉定理

歐拉定理是解決同余的性質,其定義為:

如果p和q為正整數,且pq互質,則

歐拉定理

顯然,我們可以用歐拉函數來判斷兩個正整數是否互質

七、費馬小定理

費馬小定理是歐拉定理的特殊情況,其定義為:

如果p和q為正整數,且pq互質,且q是素數,則q的歐拉函數為

q的歐拉函數

則歐拉定理可以寫為

費馬小定理

八、模反元素的定義

模反元素指:如果兩個正整數p和q互質,那么一定存在一個或多個整數b,使得

模反元素

我們可以通過歐拉函數的定義來證明模反元素的必然存在

明模反元素的必然存在

可以看到p的φ(n) -1次方就是p的一個模反元素

九、歐幾里得算法—求最大公約數

問題提出:計算兩個正整數a和b的最大公約數?

歐幾里得算法,又稱輾轉相除法,其定義最大公約數滿足:

歐幾里得算法

下面我們來證明該算法

設a>b>1,則

商和余數的形式

其中k為a除以b的商,r為a對b取模,即

商和余數

設d是a和b的一個公因數,則d可以整除a和b,即

d可以整除a和b

又因為r = a - kb,則

d可以整除r

可以看到d也可以整除r,即

d可以整除r

綜上,我們可以證明出

歐幾里得算法

十、貝祖定理

貝祖定理是初等數論里提出的一個定理,它的定義為:

如果有兩個正整數a和b,則存在若干整數對x,y,使得

貝祖定理

該定理說明:a和b的最大公約數滿足a和b的線性組合

其中當gcd(a,b)=1時,則證明a和b都是素數,即

a和b都是素數

十一、歐幾里得擴展算法

歐幾里得擴展算法是用來求解出貝祖等式ax+by=gcd(a,b)的一個解(x,y),即求解二元一次線性方程

算法證明:

設置參數變量

則c可以表示為商q和余數r的線性形式

c表示為商q和余數r

我們已知線性方程組為

已知線性方程組

將c帶入第一個方程,得到

化簡1

將d的表達式帶入上式,得到

化簡2

下面我們將參數表做如下變化

參數表變化

經過上述變化,將參數變化帶入化簡2,得到

變化1

將參數變化帶入線性方程組的第二個方程,得到

變化2

綜上所述,可以看到線性方程組經過參數表變化后保持了原線性方程組的正確性

至此,我們總結出歐幾里得擴展算法的步驟為:

(1)初始化參數:x' = y = 1,x = y' = 0,c = a,d = b

(2)令q和r表示d除以c得到的商和余數

(3)如果余數r不為0,則進入循環,按照變化參數列表更新參數,返回第(2)步

(4)如果余數r為0,則算法終止,返回x和y即為所求

我們用python實現歐幾里得擴展算法,并測試求解:47x + 30y = 1的解?

歐幾里得擴展算法
計算結果

可以看到x=-7,y=11,帶入到方程計算得-7*47+30*11=1,確實是該二元方程的一組整數解

十二、大整數快速冪算法

如果我們要計算a的11次方,則按照冪運算的定義,需要執行11次乘法

如果將指數11寫成二進制,則

快速冪原理

可以看到經過上述變化,計算a的11次方只需要執行3次乘法即可,這就是快速冪算法的原理

快速冪算法步驟為:

(1)將冪指數視為二進制進入循環

(2)判斷指數二進制權位是否為奇數,如果為奇數,則累乘結果

(3)每次循環對指數進行左移位運算,以及對底數進行累乘運算

我們用python實現歐幾里得擴展算法,并測試求解:12345678^56789

快速冪算法

比較快速冪算法和直接連乘法的效率

比較結果

可以看到,快速冪算法的效率非常高

十三、大整數快速冪取模算法

快速冪取模算法基于下面這個取模等價式子

快速冪取模算法的核心

它的思路和快速冪算法一致,在循環過程加入取模運算即可

我們用python實現歐幾里得擴展算法,并測試求解:123456789^987654 %?65537

快速冪取模算法
比較結果

可以看到,加入取模計算后,快速冪取模算法幾乎是瞬間完成計算

至此,有了上述數論的基礎知識和相應的算法,將這些數學理論和算法串聯,我們就可以開始RSA算法的實戰

案例代碼見:RSA加密解密算法—數論基礎

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,117評論 6 537
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,860評論 3 423
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,128評論 0 381
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,291評論 1 315
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,025評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,421評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,477評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,642評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,177評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,970評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,157評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,717評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,410評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,821評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,053評論 1 289
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,896評論 3 395
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,157評論 2 375

推薦閱讀更多精彩內容

  • 前言 本文的RSA例子代碼更新在我的github上。 RSA算法是最重要算法之一,它是計算機通信安全的基石,保證了...
    game3108閱讀 11,743評論 2 53
  • 前言 總括: 本文詳細講述了RSA算法詳解,包括內部使用數學原理以及產生的過程。 原文博客地址:RSA算法詳解 知...
    秦至閱讀 1,733評論 0 4
  • 歸去來兮。 1.1 說明 本篇為《挑戰程序設計競賽(第2版)》[http://www.ituring.com.cn...
    尤汐Yogy閱讀 14,405評論 0 160
  • 姓名:李浩然 學號:16030410020 轉自:http://blog.csdn.net/Dreaming_My...
    洛花無閱讀 2,655評論 0 1
  • 學一點有趣的數論知識 在探究RSA算法的原理之前,我們先來學習一點有趣的數論知識(數學分支之一,主要研究整數的性質...
    24f464006eaf閱讀 2,178評論 0 5