RSA加密解密算法—數(shù)論基礎(chǔ)

本章涉及知識點

1、素數(shù)的定義

2挚币、尋找素數(shù)算法—短除法

3蕊退、尋找素數(shù)算法—篩選法

4假残、互質(zhì)關(guān)系

5架谎、歐拉函數(shù)的證明

6漾脂、歐拉定理

7筐乳、費馬小定理

8争占、模反元素

9恃泪、歐幾里得算法—求最大公約數(shù)

10队腐、貝祖定理

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

12薪前、大整數(shù)快速冪算法

13润努、大整數(shù)快速冪取模算法

14、總結(jié)

一示括、素數(shù)的定義

質(zhì)數(shù)又稱素數(shù)铺浇,指在一個大于1的自然數(shù)中,除了1和本身之外垛膝,無法被其他自然數(shù)整除的數(shù)

素數(shù)具有下列獨特的性質(zhì):

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

2)素數(shù)一定是奇數(shù)

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

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

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

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

如果將素數(shù)p表示成極坐標(biāo)方程

素數(shù)p的極坐標(biāo)方程

我們將第500到第5000的素數(shù)畫在笛卡爾坐標(biāo)系來觀察其分布:

素數(shù)螺旋

可以看到素數(shù)的分布呈螺旋形狀吼拥,這種現(xiàn)象又叫質(zhì)數(shù)螺旋

幾百年之間倚聚,無數(shù)世界頂級的數(shù)學(xué)家,研究一生始終無法精確的證明素數(shù)的表達(dá)式以及其分布的規(guī)律

二凿可、尋找素數(shù)算法—短除法

問題定義:在給定范圍n之內(nèi)惑折,找到所有素數(shù)

(1)方法一:

最直接的方法就是從定義出發(fā),對于任意整數(shù)p枯跑,用[2惨驶,p-1]去整除p,如果發(fā)現(xiàn)p可以被整除全肮,p就不是素數(shù)

顯然敞咧,這個方法的效率簡直低的讓人難以接受,優(yōu)化空間非常大

(2)方法二:

顯然偶數(shù)不是素數(shù)辜腺,對于任意奇數(shù)p休建,用[3,5评疗,...测砂,p-2]去整除p,如果發(fā)現(xiàn)p可以被整除百匆,p就不是素數(shù)

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

(3)方法三:

利用質(zhì)因式分解的思想加匈,對于任意奇數(shù)p存璃,用小于p的素數(shù)去整除p,如果發(fā)現(xiàn)p可以被整除雕拼,p就不是素數(shù)

這個方法的計算效率又提高了一些纵东,將奇數(shù)級別的除數(shù)縮小到質(zhì)數(shù)范圍

(4)方法四:

利用平方根條件,對于任意奇數(shù)p啥寇,用小于p的平方根的素數(shù)去整除p偎球,如果發(fā)現(xiàn)p可以被整除洒扎,p就不是素數(shù)

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

我們用python實現(xiàn)短除算法衰絮,并測試尋找在[2袍冷,2^22]范圍內(nèi)所有的素數(shù)的算法效率

短除算法
尋找結(jié)果

從短除算法尋找結(jié)果中,可以看到該算法花費了13秒猫牡,找到295947個素數(shù)

三胡诗、尋找素數(shù)算法—篩選法

除了上述的短除算法,是否存在更加高效的算法來尋找素數(shù)镊掖?

的確存在一個非常高效的算法—篩選法乃戈,其設(shè)計思想是:

(1)將n個數(shù)字全部放進(jìn)數(shù)組,并都置為肯定狀態(tài)

(2)將數(shù)組下標(biāo)是偶數(shù)的數(shù)字全部置為否定狀態(tài)

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

(4)如果當(dāng)前數(shù)字處于被肯定的狀態(tài)亩进,則將其倍數(shù)的數(shù)字狀態(tài)置為否定

我們用python實現(xiàn)篩選算法症虑,并測試尋找在[2,2^22]范圍內(nèi)所有的素數(shù)的算法效率

篩選算法
尋找結(jié)果

從篩選算法尋找結(jié)果中归薛,可以看到該算法只花費了1.16秒谍憔,就找到295947個素數(shù)

至此我們可以總結(jié)出比較上述找尋素數(shù)的兩種算法

(1)短除算法:使用了嚴(yán)進(jìn)寬出的思想,對每個數(shù)字的判斷非常嚴(yán)格主籍,保證每次找到的數(shù)字都是素數(shù)习贫,時間復(fù)雜度較高

(2)篩選算法:使用了寬進(jìn)嚴(yán)出的思想,一步步篩選(否定)千元,最后保留下來的數(shù)字才是素數(shù)苫昌,利用空間換取時間來大大降低了時間復(fù)雜度

四、互質(zhì)關(guān)系

公因數(shù)只有1的兩個數(shù)字幸海,稱為互質(zhì)關(guān)系

互質(zhì)具有下列獨特的性質(zhì):

(1)任意兩個素數(shù)一定是互質(zhì)關(guān)系

(2)如果一個數(shù)是素數(shù)祟身,另一個數(shù)字不是它的倍數(shù),則二者互質(zhì)

(3)較大的數(shù)是素數(shù)物独,則二者互質(zhì)

(4)相鄰的兩個自然數(shù)一定互質(zhì)

(5)相鄰的兩個奇數(shù)一定互質(zhì)

(6)1和任意數(shù)互質(zhì)

五袜硫、歐拉函數(shù)的證明

問題的提出:

給定任意正整數(shù)n,問在小于等于n的正整數(shù)之中挡篓,有多少個數(shù)字與n構(gòu)成互質(zhì)關(guān)系婉陷?

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

(1)當(dāng)n等于1的情況:

則根據(jù)互質(zhì)的性質(zhì)6可以得到

n=1的情況

(2)當(dāng)n等于素數(shù)p的情況:

則n以下的數(shù)字和n都互質(zhì)

n=p的情況

(3)當(dāng)n等于素數(shù)的某一個次方官研,即n = p^k的情況:

則小于等于p^k且與p^k不互質(zhì)的個數(shù)有

小于等于p^k且與p^k不互質(zhì)的個數(shù)

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

n=p^k的情況

(4)當(dāng)n等于兩個素數(shù)的乘積,即n=p*q(p和q互質(zhì))的情況:

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

n=p*q的情況

(5)當(dāng)n等于任意大于1的正整數(shù)的情況:

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

正整數(shù)n的質(zhì)因數(shù)分解

其中p1担神、p2...pr都是n的質(zhì)因數(shù)

則根據(jù)上述(3)和(4)的分析結(jié)果,可以推導(dǎo)出

n等于任意大于1的正整數(shù)的情況

綜上分析蛛壳,我們得到歐拉函數(shù)的通用計算方式為

歐拉函數(shù)的通用計算方式

六杏瞻、歐拉定理

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

如果p和q為正整數(shù)衙荐,且pq互質(zhì)捞挥,則

歐拉定理

顯然,我們可以用歐拉函數(shù)來判斷兩個正整數(shù)是否互質(zhì)

七忧吟、費馬小定理

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

如果p和q為正整數(shù),且pq互質(zhì)溜族,且q是素數(shù)讹俊,則q的歐拉函數(shù)為

q的歐拉函數(shù)

則歐拉定理可以寫為

費馬小定理

八、模反元素的定義

模反元素指:如果兩個正整數(shù)p和q互質(zhì)煌抒,那么一定存在一個或多個整數(shù)b仍劈,使得

模反元素

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

明模反元素的必然存在

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

九、歐幾里得算法—求最大公約數(shù)

問題提出:計算兩個正整數(shù)a和b的最大公約數(shù)寡壮?

歐幾里得算法贩疙,又稱輾轉(zhuǎn)相除法,其定義最大公約數(shù)滿足:

歐幾里得算法

下面我們來證明該算法

設(shè)a>b>1况既,則

商和余數(shù)的形式

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

商和余數(shù)

設(shè)d是a和b的一個公因數(shù)棒仍,則d可以整除a和b悲靴,即

d可以整除a和b

又因為r = a - kb,則

d可以整除r

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

d可以整除r

綜上癞尚,我們可以證明出

歐幾里得算法

十、貝祖定理

貝祖定理是初等數(shù)論里提出的一個定理榜配,它的定義為:

如果有兩個正整數(shù)a和b否纬,則存在若干整數(shù)對x,y蛋褥,使得

貝祖定理

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

其中當(dāng)gcd(a,b)=1時临燃,則證明a和b都是素數(shù),即

a和b都是素數(shù)

十一烙心、歐幾里得擴展算法

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

算法證明:

設(shè)置參數(shù)變量

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

c表示為商q和余數(shù)r

我們已知線性方程組為

已知線性方程組

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

化簡1

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

化簡2

下面我們將參數(shù)表做如下變化

參數(shù)表變化

經(jīng)過上述變化匙瘪,將參數(shù)變化帶入化簡2铆铆,得到

變化1

將參數(shù)變化帶入線性方程組的第二個方程蝶缀,得到

變化2

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

至此薄货,我們總結(jié)出歐幾里得擴展算法的步驟為:

(1)初始化參數(shù):x' = y = 1翁都,x = y' = 0,c = a谅猾,d = b

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

(3)如果余數(shù)r不為0柄慰,則進(jìn)入循環(huán),按照變化參數(shù)列表更新參數(shù)税娜,返回第(2)步

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

我們用python實現(xiàn)歐幾里得擴展算法敬矩,并測試求解:47x + 30y = 1的解概行?

歐幾里得擴展算法
計算結(jié)果

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

十二、大整數(shù)快速冪算法

如果我們要計算a的11次方缩筛,則按照冪運算的定義消略,需要執(zhí)行11次乘法

如果將指數(shù)11寫成二進(jìn)制,則

快速冪原理

可以看到經(jīng)過上述變化瞎抛,計算a的11次方只需要執(zhí)行3次乘法即可艺演,這就是快速冪算法的原理

快速冪算法步驟為:

(1)將冪指數(shù)視為二進(jìn)制進(jìn)入循環(huán)

(2)判斷指數(shù)二進(jìn)制權(quán)位是否為奇數(shù),如果為奇數(shù)桐臊,則累乘結(jié)果

(3)每次循環(huán)對指數(shù)進(jìn)行左移位運算胎撤,以及對底數(shù)進(jìn)行累乘運算

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

快速冪算法

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

比較結(jié)果

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

十三伤提、大整數(shù)快速冪取模算法

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

快速冪取模算法的核心

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

我們用python實現(xiàn)歐幾里得擴展算法认烁,并測試求解:123456789^987654 %?65537

快速冪取模算法
比較結(jié)果

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

至此却嗡,有了上述數(shù)論的基礎(chǔ)知識和相應(yīng)的算法舶沛,將這些數(shù)學(xué)理論和算法串聯(lián),我們就可以開始RSA算法的實戰(zhàn)

案例代碼見:RSA加密解密算法—數(shù)論基礎(chǔ)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末窗价,一起剝皮案震驚了整個濱河市如庭,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌撼港,老刑警劉巖坪它,帶你破解...
    沈念sama閱讀 211,042評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件骤竹,死亡現(xiàn)場離奇詭異,居然都是意外死亡往毡,警方通過查閱死者的電腦和手機瘤载,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評論 2 384
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來卖擅,“玉大人,你說我怎么就攤上這事墨技〕徒祝” “怎么了?”我有些...
    開封第一講書人閱讀 156,674評論 0 345
  • 文/不壞的土叔 我叫張陵扣汪,是天一觀的道長断楷。 經(jīng)常有香客問我,道長崭别,這世上最難降的妖魔是什么冬筒? 我笑而不...
    開封第一講書人閱讀 56,340評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮茅主,結(jié)果婚禮上舞痰,老公的妹妹穿的比我還像新娘。我一直安慰自己诀姚,他們只是感情好响牛,可當(dāng)我...
    茶點故事閱讀 65,404評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著赫段,像睡著了一般呀打。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上糯笙,一...
    開封第一講書人閱讀 49,749評論 1 289
  • 那天贬丛,我揣著相機與錄音,去河邊找鬼给涕。 笑死豺憔,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的稠炬。 我是一名探鬼主播焕阿,決...
    沈念sama閱讀 38,902評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼首启!你這毒婦竟也來了暮屡?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,662評論 0 266
  • 序言:老撾萬榮一對情侶失蹤毅桃,失蹤者是張志新(化名)和其女友劉穎褒纲,沒想到半個月后准夷,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,110評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡莺掠,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年衫嵌,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片彻秆。...
    茶點故事閱讀 38,577評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡楔绞,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出唇兑,到底是詐尸還是另有隱情酒朵,我是刑警寧澤,帶...
    沈念sama閱讀 34,258評論 4 328
  • 正文 年R本政府宣布扎附,位于F島的核電站蔫耽,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏留夜。R本人自食惡果不足惜匙铡,卻給世界環(huán)境...
    茶點故事閱讀 39,848評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望碍粥。 院中可真熱鬧鳖眼,春花似錦、人聲如沸嚼摩。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,726評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽低斋。三九已至蜂厅,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間膊畴,已是汗流浹背掘猿。 一陣腳步聲響...
    開封第一講書人閱讀 31,952評論 1 264
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留唇跨,地道東北人稠通。 一個月前我還...
    沈念sama閱讀 46,271評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像买猖,于是被迫代替她去往敵國和親改橘。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,452評論 2 348

推薦閱讀更多精彩內(nèi)容

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