1. 程式人生 > >蒙哥馬利演算法詳解

蒙哥馬利演算法詳解

這篇文章為大家梳理一下整個蒙哥馬利演算法的本質,蒙哥馬利演算法並不是一個獨立的演算法,而是三個相互獨立又相互聯絡的演算法集合,其中包括

  • 蒙哥馬利乘模,是用來計算xy(modN)
  • 蒙哥馬利約減,是用來計算tρ1(modN)
  • 蒙哥馬利冪模,是用來計算xy(modN)

其中蒙哥馬利冪乘是RSA加密演算法的核心部分。

基本概念

梳理幾個概念,試想一個集合是整數模N之後得到的
ZN={0,1,2,,N1}

注:N在base-b進位制下有lN位。 比如10進位制和100進位制,都屬於base-10進位制,因為100=102,所以b=10。在10進位制下,667的lN=3

這樣的集合叫做N的剩餘類環,任何屬於這個集合Z的x滿足以下兩個條件:
1. 正整數
2. 最大長度是l

N

這篇文章中講到的蒙哥馬利演算法就是用來計算基於ZN集合上的運算,簡單講一下原因,因為RSA是基於大數運算的,通常是1024bit或2018bit,而我們的計算機不可能儲存完整的大數,因為佔空間太大,而且也沒必要。因此,這種基於大數運算的加密體系在計算的時候都是基於ZN集合的,自然,蒙哥馬利演算法也是基於ZN

在剩餘類環上,有兩種重要的運算,一類是簡單運算,也就是加法和減法,另一類複雜運算,也就是乘法。我們比較熟悉的是自然數集上的運算,下面看下怎麼從自然數集的運算演變成剩餘類環上的運算。

對於加法運算,如果計算x±y(modN) (0x,y<N),試想自然數集上的 x±y

0x+y2(N1)

(N1)xy(N1)

我們可以簡單的通過加減N來實現從自然數到剩餘類集的轉換

另外一類是乘法操作,也就是xy(modN)(0x,y<N),那麼

0xy(N1)2

如果在自然數集下,令t=xy,那麼對於modN我們需要計算

tNtN

加減操作很簡單,具體的算這裡就不細說了,我們用ZNADD 來代表剩餘類環上的加法操作。既然我們可以做加法操作,那麼我們就可以擴充套件到乘法操作,演算法如下

這裡寫圖片描述

但是這並不是一個好的解決方案,因為通常來說,我們不會直接做w位乘w位的操作,這個後面會用蒙哥馬利的乘法來代替解決。

對於取模操作,一般有以下幾種方法

1,根據以下公式,來計算取模操作

tNtN

這種解法有以下特徵

  • 整個計算過程是基於標準的數字表示
  • 不需要預計算(也就是提前計算一些變數,以備使用)
  • 涉及到一個除法操作,非常費時和複雜

2,用Barrett reduction演算法,這篇文章不細說,但是有以下特徵

  • 基於標準的數字表示
  • 不需要預計算
  • 需要2(lN+1)(lN+1) 次數乘運算

3,用蒙哥馬利約減,也就是下面要講的演算法,有以下特徵

  • 不是基於標準的數字表示(後文中有提到,是基於蒙哥馬利表示法)
  • 需要預計算
  • 需要2(lN)(lN) 次數乘運算

蒙哥馬利預備知識

在將蒙哥馬利演算法之前,先看一下在自然數下的乘法公式

計算xy,想象一下我們常用的計算乘法的方法,用乘數的每一位乘上被乘數,然後把得到的結果相加,總結成公式,可以寫成如下的形式。

xy=xsumly1i=0yibi

=sumly1i=0yixbi

嘗試下面一個例子,10進位制下(也就是b=10),y=456(也就是ln=3),計算xy,公式可演變如下:

xy=(y0x100)+(y1x101)+(y2x102)
=(y0x0)+(y1x10)+(y2x

相關推薦

演算法

這篇文章為大家梳理一下整個蒙哥馬利演算法的本質,蒙哥馬利演算法並不是一個獨立的演算法,而是三個相互獨立又相互聯絡的演算法集合,其中包括 蒙哥馬利乘模,是用來計算x⋅y(modN) 蒙哥馬利約減,是用來計算t⋅ρ−1(modN) 蒙哥馬利冪模,是用

小定理 素性判斷 演算法

轉載於http://blog.csdn.net/arvonzhang/article/details/8564836 1.約定 x%y為x取模y,即x除以y所得的餘數,當x<y時,x%y=x,所有取模的運算對象都為整數。 x^y表示x的y次方。

演算法(快速冪模)

int get_mod(int a, int b, int c) { long long res = 1;//宣告為long long型別防止資料溢位 while(b > 0)

【洛谷1965】轉圈遊戲 快速冪模演算法

轉圈遊戲 題目描述 n 個小夥伴(編號從 0到 n-1)圍坐一圈玩遊戲。按照順時針方向給 n個位置編號,從0 到 n-1。最初,第 0號小夥伴在第 0 號位置,第 1 號小夥伴在第 1號位置

php openssl_sign() 語法+RSA公私鑰加密解密,非對稱加密演算法

其實有時候覺得寫部落格好煩,就個函式就開篇部落格。很小的意見事情而已,知道的人看來多取一舉,或者說沒什麼必要,浪費時間,不知道的人就會很鬱悶。技術就是這樣的,懂的人覺得真的很簡單啊,不知道的人真的好難。。。 一般在跟第三方介面對接資料的時候,為了保證很多都使用的RSA簽名,沒性趣瞭解的同學只需要

Show, attend and tell演算法及原始碼

mark一下,感謝作者分享! https://blog.csdn.net/shenxiaolu1984/article/details/51493673 原論文:https://arxiv.org/pdf/1502.03044v2.pdf 原始碼:https://github.c

資料分析學習之不得不知的八大演算法

學習資料分析的朋友們都知道,演算法是不可或缺的,或者說演算法在一定程度上可以更好的量化的一個人的學習能力和水平,本文感謝科多大資料的馮老師,由他整理了經典的八大演算法,相關的資料希望能幫助大家瞭解。 演算法一:快速排序法 快速排序是由東尼 · 霍爾所發展的一種排序演算法。在平均狀況下,排序

程式設計思想 - 五大常用演算法

https://www.cnblogs.com/brucemengbm/p/6875340.html https://blog.csdn.net/changyuanchn/article/details/51476281 https://www.cnblogs.com/chuninggao/p/

Kadane演算法及求解最大子數列和問題

最大子數列和問題         給出一個數列,現在求其中一個子數列,要求是所有子數列的和的最大值。另外還有其他問法,例如給出一個數組,要求求出連續的元素和的最大值。可以一個例子來解釋: 假設有數列:[-1,2,3,-5,6,-2,4],那麼總共有

K-NN近鄰演算法

 K-近鄰演算法屬於一種監督學習分類演算法,該方法的思路是:如果一個樣本在特徵空間中的k個最相似(即特徵空間中最鄰近)的樣本中的大多數屬於某一個類別,則該樣本也屬於這個類別。  (1) 需要進行分類,分類的依據是什麼呢,每個物體都有它的特徵點,這個就是分類的依據,特徵點可

字典序演算法

一、字典序 字典序,就是按照字典中出現的先後順序進行排序。 1、單個字元 在計算機中,25個字母以及數字字元,字典排序如下: '0' < '1' < '2' < ... < '9' < 'a' < 'b' < ... &l

演算法 】 二維動態規劃

馬攔過河卒 原題傳送門 這一到題目也是比較基礎的動態規劃,也可以理解為是遞推,主要是運用加法原理,思維難度不大。我們要求從 (0,0) ( 0

圖的最小生成樹prim演算法

prim演算法是求圖的最小生成樹的一種演算法,它是根據圖中的節點來進行求解,具體思想大概如下: 首先,將圖的所有節點(我們假定總共有n個節點)分成兩個集合,V和U。其中,集合V儲存的是我們已經訪問過的節點,集合U儲存的是我們未曾訪問的節點。prim演算法第一步就是選定第一個節點放入集合

吳恩達機器學習課程筆記02——處理房價預測問題(梯度下降演算法

  建議記住的實用符號 符號 含義 m 樣本數目 x 輸入變數 y 輸出變數/目標變數

樹鏈剖分演算法

學OI也有一段時間了,感覺該搞點東西了。 於是學習了樹(熟)鏈(練)剖(pou)分(糞) 當然,學習這個演算法是需要先學習線段樹的。不懂的還是再過一段時間吧。 如果碰到一道題,要對一顆樹的兩個點中的最短路徑、以u為根的子樹之類的東西進行修改或者查詢,那麼大概就是樹鏈剖分的題了。 樹鏈剖分就是把一顆

各種排序演算法C++實現

1.氣泡排序 時間複雜度 O ( n

整數拆分演算法

問題描述 輸入一個N,輸出所有拆分的方式。如輸入3 輸出1+1+1 1+2 3 演算法思想 用一個數組res[]存放拆分的解,用全域性變數存放拆分的方法數。divN(n,k)使用n表示要分解的整數,k表示res陣列下標,即第k次拆分。先從divN(n,1)開始,用num表示第

演算法】對於單調棧的重新理解

對於單調棧的重新理解 關於什麼是單調棧和為什麼要用單調棧: 亂頭髮節 地平線 Largest Rectangle in a Histogram 關於什麼是單調棧和為什麼要用單調棧: 單調棧,就是棧中的元

遞迴演算法

1. 何為遞迴? 遞迴在我們的生活中其實很常見。假設你去電影院看電影,黑漆漆一片,你不知道自己來到了第幾排,於是你問前面的人他是第幾排,知道了前面的人是第幾排,加一也就是你所在的排數。但前面的人也不知道,於是他也繼續向前問,直到第一排的人回答他在第一排,然後再依次往後傳,最後

生動的普里姆演算法

一:普里姆演算法的介紹:         針對無向圖用來生成最小生成樹的演算法。 二:普里姆演算法的步驟:         起始條件:         首先你有一個