蒙哥馬利乘法原理

引子

加密算法中,有很多大數(shù)(256bits~2048bits)的運(yùn)算急凰,基礎(chǔ)之一便是類似于求 A\cdot B\pmod N 的值。在這個(gè)運(yùn)算中猜年,有乘法和取模抡锈,而取模需要除法,這在計(jì)算機(jī)中是極為耗時(shí)的乔外,為了讓計(jì)算機(jī)可以快速的執(zhí)行取模運(yùn)算床三,我們需要將除法轉(zhuǎn)變?yōu)橛?jì)算機(jī)擅長(zhǎng)的運(yùn)算。


普通人的思路

在計(jì)算機(jī)的世界里杨幼,首先一個(gè)很自然的想法就是將數(shù)據(jù)表示成二進(jìn)制:
A=\sum_{i=0}^{k-1} a_i\cdot 2^i
A\cdot B\pmod N可寫為:
A\cdot B\pmod N=(\sum_{i=0}^{k-1} a_i\cdot2^i\cdot B)\pmod N
如此撇簿,便可用如下程序?qū)崿F(xiàn)該過(guò)程:

for k-1 to 0
    C*=2;
    C+=a[i]*B;
endfor
return C % N;

上述過(guò)程只是將大數(shù)的乘法簡(jiǎn)化為乘2和加法聂渊,乘2即左移。但是還有一個(gè)問(wèn)題四瘫,因?yàn)檠h(huán)中有乘2的操作汉嗽,所以循環(huán)運(yùn)算的中間值會(huì)超過(guò)k比特,會(huì)占用更多的資源找蜜。利用取模運(yùn)算的性質(zhì)饼暑,我們可以把取模運(yùn)算放入循環(huán)體中:

for k-1 to 0
    C*=2;
    C=C%N;
    C+=a[i]*B;
    C=C%N;
endfor
return C;

如此中間值就不會(huì)超過(guò)k+1比特,這樣就剩下取模運(yùn)算沒有化簡(jiǎn)了洗做」眩考慮到我們的數(shù)是以二進(jìn)制表示的,在運(yùn)算過(guò)程中诚纸,不論是C*=2 還是 C+=a[i]*B撰筷,C的值都小于2N,因此取模運(yùn)算可以變成一個(gè)比較和減法:

for k-1 to 0
    C*=2;
    C=(C>=N)? C-N,C;
    C+=a[i]*B;
    C=(C>=N)? C-N,C;
endfor
return C;

事情看起來(lái)非常美好咬清,取模沒有了闭专,乘法也變成了移位。但是該方法需要循環(huán)的次數(shù)太多旧烧。如想要減少循環(huán)次數(shù)影钉,就不能用二進(jìn)制表示,而如果我們用r進(jìn)制表示(r>2)掘剪,那么循環(huán)體中的取模就不能再用減法取代了平委,因?yàn)?img class="math-inline" src="https://math.jianshu.com/math?formula=C" alt="C" mathimg="1">可能大于2N。前方是一條死路夺谁,要想獲得更好的性能廉赔,只有另辟蹊徑。


蒙哥馬利的想法

考慮到A\pmod N的化簡(jiǎn)最簡(jiǎn)單的就是減法匾鸥,而這需要A\in[0,2N)蜡塌。想要減少循環(huán)次數(shù),就需要r進(jìn)制表示(r>2)勿负。為了滿足這兩個(gè)條件馏艾,我們考慮這樣一種算法:
A\cdot B\cdot r^{-k}\pmod N
其中
A=\sum_{i=0}^{k-1} a_i\cdot r^i
kNr進(jìn)制表示時(shí)的位數(shù)
代入上式即得:
A\cdot B\cdot r^{-k}\pmod N=(\sum_{i=0}^{k-1} a_i\cdot r^i\cdot B\cdot r^{-k})\pmod N
程序?qū)崿F(xiàn):

for k-1 to 0
    C+=a[i]*B;
    C/=r;
endfor
return C % N;

這樣的實(shí)現(xiàn)是不準(zhǔn)確的,因?yàn)镃不一定是r的倍數(shù)奴愉,當(dāng)C/=r時(shí)琅摩,會(huì)得到不準(zhǔn)確的結(jié)果。因此锭硼,在計(jì)算C/=r的之前房资,需要先加上一個(gè)值,使C可以被r整除檀头,但加上的值又能不影響取模的最終結(jié)果轰异,因此這個(gè)值應(yīng)為N的整數(shù)倍岖沛。
不妨設(shè)其為qN,則:

for k-1 to 0
    C+=a[i]*B+q*N;
    C/=r;
endfor
return C % N;

我們的要求是(C+a[i]*B+q*N)\pmod r\equiv0搭独,即(C_0+a[i]*B_0+q*N_0)\pmod r\equiv0烫止,其中C_0,B_0和N_0C,B戳稽,Nr進(jìn)制表示時(shí)的個(gè)位數(shù)的值馆蠕。很容易看出其中一個(gè)q的解為(C_0+a[i]*B_0)*(-N_0^{-1})\pmod r,因此上述程序可改為:

c0= 0;
b0= B % r;
n0= N % r;
w = -n0^(-1) % r;
for k-1 to 0
    q=(c0+a[i]*b0)*w;
    q=q % r;
    C+=a[i]*B+q*N;
    C/=r;
    c0=C % r;
endfor
return C % N;

最后跳出循環(huán)時(shí)惊奇,C的值小于2N互躬,因此:

c0= 0;
b0= B % r;
n0= N % r;
w = -n0^(-1) % r;
for k-1 to 0
    q=(c0+a[i]*b0)*w;
    q=q % r;
    C+=a[i]*B+q*N;
    C/=r;
    c0=C % r;
endfor
return (C>=N)? C-N,C;

這樣,我們就把取模運(yùn)算變換成了移位颂郎,乘法和加減吼渡。b0,n0和w都可以預(yù)計(jì)算乓序,循環(huán)次數(shù)k也可以調(diào)整寺酪,例如數(shù)據(jù)A,B為1024bits,用二進(jìn)制表示計(jì)算時(shí)k=1024替劈,用r=2^{64}進(jìn)制表示時(shí)寄雀,k=16,只不過(guò)循環(huán)中的乘法變成了64位與1024位的乘法陨献。在對(duì)該算法進(jìn)行優(yōu)化的時(shí)候可以選取適當(dāng)?shù)膋和r盒犹。
這個(gè)計(jì)算機(jī)可以較為輕松的處理的算法,A\cdot B\cdot r^{-k}\pmod N眨业,就是廣泛使用的蒙哥馬利算法急膀,我們記為mont\_prod(A,B),那么怎么把它和A\cdot B\pmod N聯(lián)系起來(lái)呢龄捡?很簡(jiǎn)單卓嫂,多用幾次就行了:

\hat A=mont\_prod(A,r^{2k})
\hat B=mont\_prod(B,r^{2k})
\hat C=mont\_prod(\hat A,\hat B)
C=mont\_prod(\hat C,1)

前兩步稱為進(jìn)入蒙哥馬利域,最后一步稱為退出蒙哥馬利域聘殖,又叫蒙哥馬利約減晨雳。從步驟上看,我們好像把事情搞復(fù)雜了就斤,本來(lái)一個(gè)乘法取模的運(yùn)算悍募,我們用了四個(gè)蒙哥馬利乘法蘑辑,其實(shí)不然洋机,一方面蒙哥馬利乘法是針對(duì)計(jì)算機(jī)操作優(yōu)化過(guò)的,另一方面洋魂,在RSA中绷旗,需要用到A^E\pmod N這樣的模冪運(yùn)算喜鼓,也就是多次的模乘運(yùn)算,這時(shí)蒙哥馬利乘法相較于直接的模乘就會(huì)提升更多的性能衔肢。


結(jié)語(yǔ)

上面簡(jiǎn)單介紹了蒙哥馬利乘法的原理和應(yīng)用庄岖,針對(duì)該算法的硬件和軟件實(shí)現(xiàn),前人進(jìn)行了大量的優(yōu)化研究工作角骤,基本方向是優(yōu)化循環(huán)體中的乘法運(yùn)算隅忿,加法運(yùn)算以及循環(huán)體外的減法運(yùn)算,但是萬(wàn)變不離其宗邦尊,只要理解了原理背桐,再去看論文就會(huì)輕松許多。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末蝉揍,一起剝皮案震驚了整個(gè)濱河市链峭,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌又沾,老刑警劉巖弊仪,帶你破解...
    沈念sama閱讀 212,718評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異杖刷,居然都是意外死亡励饵,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,683評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門滑燃,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)曲横,“玉大人,你說(shuō)我怎么就攤上這事不瓶『碳担” “怎么了?”我有些...
    開封第一講書人閱讀 158,207評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵蚊丐,是天一觀的道長(zhǎng)熙参。 經(jīng)常有香客問(wèn)我,道長(zhǎng)麦备,這世上最難降的妖魔是什么孽椰? 我笑而不...
    開封第一講書人閱讀 56,755評(píng)論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮凛篙,結(jié)果婚禮上黍匾,老公的妹妹穿的比我還像新娘。我一直安慰自己呛梆,他們只是感情好锐涯,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,862評(píng)論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著填物,像睡著了一般纹腌。 火紅的嫁衣襯著肌膚如雪霎终。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 50,050評(píng)論 1 291
  • 那天升薯,我揣著相機(jī)與錄音莱褒,去河邊找鬼。 笑死涎劈,一個(gè)胖子當(dāng)著我的面吹牛广凸,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播蛛枚,決...
    沈念sama閱讀 39,136評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼炮障,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了坤候?” 一聲冷哼從身側(cè)響起胁赢,我...
    開封第一講書人閱讀 37,882評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎白筹,沒想到半個(gè)月后智末,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,330評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡徒河,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,651評(píng)論 2 327
  • 正文 我和宋清朗相戀三年系馆,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片顽照。...
    茶點(diǎn)故事閱讀 38,789評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡由蘑,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出代兵,到底是詐尸還是另有隱情尼酿,我是刑警寧澤,帶...
    沈念sama閱讀 34,477評(píng)論 4 333
  • 正文 年R本政府宣布植影,位于F島的核電站裳擎,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏思币。R本人自食惡果不足惜鹿响,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,135評(píng)論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望谷饿。 院中可真熱鬧惶我,春花似錦、人聲如沸博投。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,864評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至恃轩,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間黎做,已是汗流浹背叉跛。 一陣腳步聲響...
    開封第一講書人閱讀 32,099評(píng)論 1 267
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留蒸殿,地道東北人筷厘。 一個(gè)月前我還...
    沈念sama閱讀 46,598評(píng)論 2 362
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像宏所,于是被迫代替她去往敵國(guó)和親酥艳。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,697評(píng)論 2 351

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

  • DAY 01 JAVA簡(jiǎn)述 Java是由SUN公司在1995年推出的一門高級(jí)編程語(yǔ)言爬骤,是現(xiàn)今服務(wù)器端的首選編程語(yǔ)言...
    周書達(dá)閱讀 902評(píng)論 0 0
  • 1.每次澄橙做錯(cuò)事充石,老爸和澄橙之間的對(duì)話就變成了: 老爸:嗯?再咬我霞玄,我要揍你了骤铃,準(zhǔn)備好了嗎?Are you re...
    陽(yáng)光燦爛噠少女心閱讀 525評(píng)論 0 0
  • 前言 在Windows系統(tǒng)中經(jīng)常會(huì)注冊(cè)一些.dll或者是.ocx坷剧,本文將介紹一下注冊(cè)與取消注冊(cè)的方法惰爬。 命令 參數(shù)...
    seay閱讀 3,642評(píng)論 0 1
  • 我是一個(gè)很喜歡做計(jì)劃的人。 每次腦海生成一個(gè)新鮮念頭后惫企,就開始無(wú)限憧憬未來(lái)意愿達(dá)成后的各種美好撕瞧,于是大腦就自動(dòng)生成...
    二米粥jojo閱讀 274評(píng)論 0 1