咱們一起“重新發(fā)明”RSA加密算法

簡介:不羈將在本文中介紹RSA的原理川蒙,但與其他的講解不同的是,本文是循著發(fā)明者的思路蹈矮,一步步來得出RSA算法的砰逻。這種方式更有助于理解。

朋友勿笑泛鸟,亦勿怒蝠咆。

這里的標(biāo)題用了“重新發(fā)明”這個(gè)詞,其實(shí)代表的是北滥,假設(shè)我們回到了上世紀(jì)70年代刚操,在RSA非對(duì)稱加密算法被發(fā)明之前,我們?cè)撛趺此伎疾拍馨l(fā)明出RSA算法呢碑韵?當(dāng)然了赡茸,現(xiàn)在RSA已經(jīng)被發(fā)明出來了,我們這里不免還是會(huì)受到它的影響祝闻,但我們這里將試圖循著發(fā)明人的思路占卧,一點(diǎn)點(diǎn)推導(dǎo)出RSA算法遗菠。

我學(xué)習(xí)一樣?xùn)|西,比較喜歡這種從未知到探索出一個(gè)解決方案的過程华蜒;可惜目前國內(nèi)的學(xué)習(xí)資料辙纬,不管是哪個(gè)方面的(特別是教材里面的知識(shí)),都是先告訴你個(gè)結(jié)果叭喜,然后去證明這個(gè)結(jié)果贺拣,少了很多在摸索中思考的樂趣。

好了捂蕴,言歸正傳譬涡。

目標(biāo)

我們先從思考如何實(shí)現(xiàn)一個(gè)非對(duì)稱加密算法開始。我們希望的達(dá)到的目的是啥辨,我們有一對(duì)公鑰和私鑰劝贸,公鑰是可以公開出去顶考,私鑰是保密的,別人要發(fā)給我一段不想讓外人竊取的信息的時(shí)候,可以先用我的公鑰加密瓣颅,我們把加密后的消息稱為密文恨闪,然后我收到密文之后徘公,用我的私鑰解密竣贪,即可變?yōu)槊魑模欢乙WC無法從公鑰推導(dǎo)出私鑰玫荣,這樣甚淡,即便密文消息即便被黑客截獲了,因?yàn)門a沒有私鑰崇决,就無從得到明文材诽,從而起到保密的作用。

初步方案

我們給出的方案需要滿足如下特性:

  1. 無法從密文得出明文
  2. 私鑰可以解密密文得到明文
  3. 無法從公鑰得出私鑰

也就是說恒傻,我們先從第一個(gè)特性開始脸侥,假設(shè)我們密文是m, f是加密函數(shù),c代表密文盈厘,e代表公鑰睁枕,那么我們需要一個(gè)這樣的f,滿足:
f(m, e) = c沸手,并且通過m,e很容易得到c, 而無法通過c得到m外遇。
也就是說,f必須是一個(gè)單向函數(shù)契吉,正向求解容易跳仿,而反向求解很難。

那么什么樣的f才能滿足這個(gè)要求呢捐晶?

這時(shí)菲语,突然靈光一閃妄辩,有這么一個(gè)求余的函數(shù)出現(xiàn)了:
m^e = c (mod\ N),N是一個(gè)正整數(shù)常量山上。

這個(gè)函數(shù)的意思是m^e除以N得到的余數(shù)與c除以N得到的余數(shù)相同眼耀。我們發(fā)現(xiàn),當(dāng)給定m,e,N的時(shí)候佩憾,比較容易得到c哮伟,但如果給定c,e,N,則很難得到m妄帘,因?yàn)橐龅竭@一點(diǎn)楞黄,我們只能使用窮舉法一個(gè)個(gè)去試,當(dāng)N和e都很大的時(shí)候寄摆,窮舉法的計(jì)算量就大的驚人了谅辣,當(dāng)N,e大到一定程度的時(shí)候,也就是從c得到m需要的運(yùn)算時(shí)間很長很長的時(shí)候婶恼,我們就可以認(rèn)為不可能從c得到m。

第一個(gè)特性解決了柏副,那么如何滿足第二個(gè)特性(私鑰可以解密密文得到明文)呢勾邦?

如何從密文得到明文呢?我們用d表示私鑰割择,那么要滿足第二個(gè)特性眷篇,如果利用同樣的函數(shù),也就是要滿足:
c^d = m (mod\ N)荔泳,我們把c = m^e (mod\ N)蕉饼,帶入進(jìn)去,從而得到:
(m^e)^d = m (mod\ N)玛歌,也就是:

m^{ed} = m(mod\ N)昧港,這個(gè)式子又等價(jià)于:
m^{ed-1} = 1(mod\ N)

注意,上面的推導(dǎo)中支子,我們用到了如下數(shù)學(xué)事實(shí):
m^e = c (mod\ N) 等價(jià)于 c = m^e (mod\ N)

再來看下我們得到的結(jié)果:
m^{ed-1} = 1(mod\ N)

于是创肥,只要我們能在e和d之間建立聯(lián)系,使得上面的式子成立值朋,那么我們就可以用(e,N)作為公鑰叹侄,(d,N)作為私鑰。如此別人用(e,N)對(duì)明文m加密之后得到密文c昨登,我們就可以用私鑰d做這個(gè)操作c^d(mod\ N)進(jìn)行解密了趾代。

那么我們?cè)撊绾问沟?span id="s2coiuw" class="math-inline">m^{ed-1} = 1(mod\ N)成立并且滿足特性三(無法從公鑰e得出私鑰d)的要求呢?

救星:歐拉公式

先看如何滿足m^{ed-1} = 1(mod\ N)丰辣,最簡單的情況是讓ed=1撒强,但是這樣的話禽捆,要么e=d=1或者-1,要么其中一個(gè)是小數(shù)尿褪;前者將導(dǎo)致起不到加密的作用睦擂,后者將會(huì)面臨小數(shù)運(yùn)算誤差的問題。

看來讓ed=1是行不通的杖玲。

再一次靈光閃顿仇,這個(gè)形式和歐拉公式特像,看下歐拉公式:
m^{\phi(N)} = 1 (mod\ N)
是不是仿佛看到了救星摆马。
我們從歐拉公式開始:
m^{\phi(N)} = 1 (mod\ N) 等價(jià)于 (m^{\phi(N)})^k = 1^k (mod\ N)臼闻,k是任意的整數(shù)
也就是:
m^{k*\phi(N)} = 1 (mod\ N)

也就是說我們只需要讓ed滿足ed -1 = k*\phi(N)即可, 這樣就可以計(jì)算d了:
d = (k*\phi(N) + 1)/e囤采。

那么\phi(N)是什么呢述呐?怎么求呢?根據(jù)歐拉定理中對(duì)\phi(N)的定義蕉毯,它代表1~N中乓搬,所有與N互質(zhì)的數(shù)的數(shù)量。所謂互質(zhì)代虾,是指兩個(gè)數(shù)除了1之外沒有其他公因子进肯,比如9和4互質(zhì),7和6互質(zhì)等棉磨。很容易得出江掩,對(duì)于質(zhì)數(shù)X而言,\phi(X) = X - 1乘瓤,因?yàn)槿魏我粋€(gè)比它小數(shù)都和它互質(zhì)环形。

又遇攔路虎

然而,歐拉定理有一個(gè)前置條件衙傀,即:m必須與N互質(zhì)抬吟。可是差油,m代表的是消息拗军,我不能對(duì)m做任何限定,所以我們只能從N入手蓄喇。

先來個(gè)最簡單的发侵,讓N為質(zhì)數(shù),這樣的話妆偏,無論m是什么刃鳄,m和N都互質(zhì)了,如此\phi(N)也簡單了钱骂,等于N-1叔锐,可這就有問題了:
別人根據(jù)我們的公鑰(e,N)很容易就能計(jì)算出\phi(N)挪鹏,于是很容易就能得到我們的私鑰d了∮淅樱看來這個(gè)方案不行讨盒。

看來既要滿足m和N互質(zhì),還要滿足難以計(jì)算出\phi(N)才行步责,不容易啊

柳暗花明

我們?cè)僭囋嚻渌椒ǚ邓场`牛琋是質(zhì)數(shù)蔓肯,會(huì)使得\phi(N)太容易計(jì)算遂鹊,那我們只能允許m和N不互質(zhì)了,只要不互質(zhì)的概率比較小就行蔗包。于是秉扑,我們不讓N單獨(dú)作為一個(gè)質(zhì)數(shù)了,我們把N表示成兩個(gè)質(zhì)數(shù)p和q的乘積调限,這樣舟陆,除非m=hp或者m=hq,否則m與N仍是互質(zhì)的耻矮;而當(dāng)m=hp或者m=hq時(shí)吨娜,即便歐拉定理不滿足了,我們也可以重新選擇p和q淘钟,這個(gè)計(jì)算量不大。因?yàn)镹=p*q陪毡,而且p,q都是質(zhì)數(shù)米母,所以:

\phi(N) = \phi(p) * \phi(q)

這個(gè)式子根據(jù)\phi(N)的定義,也是可以想到的毡琉,這里就不再證明了铁瞒。考慮p,q都是質(zhì)數(shù)桅滋,所以\phi(p) = p-1, \phi(q) = q -1慧耍,所以\phi(N) = (p-1)*(q-1)

好,那我們看看這個(gè)時(shí)候丐谋,黑客如何通過公鑰(e,N)計(jì)算\phi(N)芍碧,他有兩種辦法:

  1. 把N進(jìn)行質(zhì)數(shù)分解
  2. 從1~N中,依次檢查是否與N互質(zhì)

當(dāng)N很大的時(shí)候号俐,這兩種方案的計(jì)算量都會(huì)大的驚人泌豆。
因而這個(gè)方案是安全的。
自此吏饿,我們已經(jīng)得出了RSA的方案了踪危,還差一點(diǎn)需要確認(rèn):

當(dāng)m=hp或者m=hq的時(shí)候蔬浙,m^{ed-1} = 1(mod\ N)還成立嗎?

如果成立贞远,就太好了畴博,我們就不用根據(jù)m的取值來調(diào)整p和q的取值了。

我們來分析一下:

假設(shè)m= hp蓝仲,因?yàn)閜和q是質(zhì)數(shù)俱病,所以h和p也必然互質(zhì),所以由歐拉定理知:
 (hp)^{q-1} = 1 (mod\ q)
進(jìn)一步得到:
[(hp)^{q-1}]^{k(p-1)} × hp ≡ hp (mod\ q)
即:
(hp)^{ed} ≡ hp (mod\ q)

將它改寫成下面的等式:
(hp)^{ed} = tq + hp

因?yàn)閜互質(zhì)杂曲,這時(shí)t必然能被p整除庶艾,因而t = t'p,因而:
(hp)^{ed} = t'pq + hp
因?yàn)?m=hp擎勘,n=pq咱揍,所以
m^{ed} = m (mod\ n)
等價(jià)于
m^{ed-1} = 1 (mod\ n)

所以,當(dāng)m=hp或者m=hq的時(shí)候棚饵,m^{ed-1} = 1(mod\ N)依然成立煤裙。
完美結(jié)局。

自此我們就得到的RSA加密算法了噪漾。其實(shí)不難硼砰,對(duì)吧?

總結(jié)

總結(jié)上面得出的RSA過程如下:

選取兩個(gè)正的大質(zhì)數(shù)p, q欣硼,然后計(jì)算出N题翰,以及\phi(N) = (p-1)*(q-1),然后隨機(jī)選取一個(gè)正整數(shù)e, 然后在計(jì)算出
d = (k*\phi(N) + 1)/e
由此得出公鑰(e, N)和私鑰(d, N)诈胜,p和q就可以丟棄掉了豹障,但不能泄漏出去。

從明文m到密文c(也即加密)的過程:
c = m^e(mod\ N)
從密文c到明文m(也即解密)的過程:
m=c^d(mod\ N)


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末焦匈,一起剝皮案震驚了整個(gè)濱河市血公,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌缓熟,老刑警劉巖累魔,帶你破解...
    沈念sama閱讀 222,807評(píng)論 6 518
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異够滑,居然都是意外死亡垦写,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,284評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門版述,熙熙樓的掌柜王于貴愁眉苦臉地迎上來梯澜,“玉大人,你說我怎么就攤上這事⊥砘铮” “怎么了吮龄?”我有些...
    開封第一講書人閱讀 169,589評(píng)論 0 363
  • 文/不壞的土叔 我叫張陵,是天一觀的道長咆疗。 經(jīng)常有香客問我漓帚,道長,這世上最難降的妖魔是什么午磁? 我笑而不...
    開封第一講書人閱讀 60,188評(píng)論 1 300
  • 正文 為了忘掉前任尝抖,我火速辦了婚禮,結(jié)果婚禮上迅皇,老公的妹妹穿的比我還像新娘昧辽。我一直安慰自己,他們只是感情好登颓,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,185評(píng)論 6 398
  • 文/花漫 我一把揭開白布搅荞。 她就那樣靜靜地躺著,像睡著了一般框咙。 火紅的嫁衣襯著肌膚如雪咕痛。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,785評(píng)論 1 314
  • 那天喇嘱,我揣著相機(jī)與錄音茉贡,去河邊找鬼。 笑死者铜,一個(gè)胖子當(dāng)著我的面吹牛腔丧,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播作烟,決...
    沈念sama閱讀 41,220評(píng)論 3 423
  • 文/蒼蘭香墨 我猛地睜開眼悔据,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼!你這毒婦竟也來了俗壹?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 40,167評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤藻烤,失蹤者是張志新(化名)和其女友劉穎绷雏,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體怖亭,經(jīng)...
    沈念sama閱讀 46,698評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡涎显,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,767評(píng)論 3 343
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了兴猩。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片期吓。...
    茶點(diǎn)故事閱讀 40,912評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖倾芝,靈堂內(nèi)的尸體忽然破棺而出讨勤,到底是詐尸還是另有隱情箭跳,我是刑警寧澤,帶...
    沈念sama閱讀 36,572評(píng)論 5 351
  • 正文 年R本政府宣布潭千,位于F島的核電站谱姓,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏刨晴。R本人自食惡果不足惜屉来,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,254評(píng)論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望狈癞。 院中可真熱鬧茄靠,春花似錦、人聲如沸蝶桶。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,746評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽莫瞬。三九已至儡蔓,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間疼邀,已是汗流浹背喂江。 一陣腳步聲響...
    開封第一講書人閱讀 33,859評(píng)論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留旁振,地道東北人获询。 一個(gè)月前我還...
    沈念sama閱讀 49,359評(píng)論 3 379
  • 正文 我出身青樓,卻偏偏與公主長得像拐袜,于是被迫代替她去往敵國和親吉嚣。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,922評(píng)論 2 361

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

  • 學(xué)一點(diǎn)有趣的數(shù)論知識(shí) 在探究RSA算法的原理之前蹬铺,我們先來學(xué)習(xí)一點(diǎn)有趣的數(shù)論知識(shí)(數(shù)學(xué)分支之一尝哆,主要研究整數(shù)的性質(zhì)...
    24f464006eaf閱讀 2,170評(píng)論 0 5
  • "use strict";function _classCallCheck(e,t){if(!(e instanc...
    久些閱讀 2,036評(píng)論 0 2
  • 這是去年12月在CSDN寫的一篇加密算法文章 現(xiàn)在決定在簡書寫博客 移植過來方便復(fù)習(xí)再理解。 最近算法課老師要求小...
    icecrea閱讀 1,310評(píng)論 1 1
  • 跟著丁老師學(xué)語文 曹昕怡 “這一路走來說不上多辛苦甜攀,慶幸心里很清楚秋泄。”我看見燦爛的日光规阀,看見花海里的徜徉恒序,看見紫...
    簡約語文閱讀 930評(píng)論 0 1
  • 有趣文叔閱讀 227評(píng)論 0 1