模n下大數冪乘的兩個演算法的基本運作原理

2021-06-16 11:15:46 字數 2772 閱讀 6990

這是我第一篇csdn部落格,除了跟各位前輩交流學習,我同樣想我跟那些沒學過計算機的家人朋友分享我所學到的東西(至少讓他們知道我是學什麼的,真的不是修電腦的先說幾個基本的概念,如果你早知道了就跳過。 

mod(求餘)是數論中最基本的運算之一,就是求乙個數除以另乙個數的餘數。

例如:5 mod 7 =5 ;(5除以7,商得0,餘數為2)

18 mod 7 =4;(18除以7,商得2,餘數為4)

5^2 mod 5 =0; (25除以5,商得3,餘數為0)

這是乙個目前十分常用

公鑰加密演算法,幾乎每次網購都會用到它。所謂的公鑰加密演算法是一樣十分神奇的事物,它的加密金鑰和解密金鑰並不是同乙個金鑰,加密金鑰是可以公開的。通俗點來說,

就是鎖上一把鎖的鑰匙和開啟同一把鎖的鑰匙是兩把不一樣的鑰匙

。大家都可以用加密鑰匙鎖上箱子(加密訊息),但只有掌握解密金鑰的人才能開啟箱子(解密訊息)。

上面那些求餘例子十分簡單,但遇到像98^193 mod 100 這種數就很難算了。

你可能想先將98^193求出來,再對100求餘。但是這樣有兩個問題:

1.98的193次方這是乙個非常非常大的數,在絕大多程式語言中沒有乙個內建型別能容納得下那麼大的數。

2.98的193次方對100求餘,你想想在筆算時要算多久,絕對會算到手軟。

在rsa演算法中,這種式子的數字一般很大很大,所以這就需要一定的演算法來求解這種式子。

模n的大數冪乘有兩種比較通用的演算法,網上都能搜到,但我沒找到相關的演算法證明。推導一輪後終於明白是什麼回事,所以就寫下來了。

演算法1:

1. a

2. 若b=0,則輸出結果c,結束

3. 若b為奇數,跳轉至5

4. b

5. b

下面以98^193 mod 100 為例說明這演算法如何執行:

98^193 mod 100                             //a=98;b=193;c=1;n=100

= 1* 98^193    mod 100                     //b=193,奇數,對應步驟5

= (1*98) * (98^192)   mod 100          //b=192,偶數,對應步驟4

= 98 * ( 98^2)^96   mod 100           

= 98* (98^2 mod 100 )^96  mod 100  

= 98 * (4)^96   mod 100               

//因為98^2 mod 100 =t*100+4 (t為某整數) 。根據二項展開式,(t*100+4)^96的展開式中除了4^96    這項外,

其餘項都包括(t*100)這個因子,含有這因子的式子=k*(t*100) ,  在mod100下=0。

=98 * (16)^48   mod 100

=98 * (256 mod 100 )^24   mod 100

=98 * (56)^24   mod 100

=98 * (3136 mod 100)^12 mod 100

=98 * (36)^12 mod 100

=98 * (96)^6  mod 100

=98 * (16)^3 mod 100                     //b=3,奇數,對應步驟5

=(98*16 mod 100) * (16)^2 mod 100

=68 * ( 256 mod 100)^1  mod 100

=68 * (56)^1  mod 100                    //b=1

=(68 * 56 mod 100)  *  (56)^0  mod 100

=8 * (56)^0   mod 100             //  b=0  ,返回結果c=8 ,結束

演算法2:( r 轉換為2進製數求解,好像該演算法是高德納提出的)

1.  先將r 轉換為 2進製數序列,r=rk rk-1 rk-2...rk1 rk0。

2.  c

3.  for i 

cif (ri=1)

then m = c*m mod n

next i

下面用9^11 mod 12 來說明:

1)先將11轉化為二進位制數序列 1011

2)  9^11 mod 12

= 9^(1011)  mod 12

= 9^(1000) * 9^(0000) *

9^(0010) *

9^(0001)   mod 12

3)    9^(0001)   mod 12

=9;

m =1*9 mod 12 =9;      //r0=1,執行m =c*m mod n

9^(0010)   mod 12=(9^(0001)   mod 12

)^2 =9^2 mod 12 =9;

m=9*9 mod 12 =9      //r1=1,執行m =c*m mod n

9^(0100)   mod 12=(9^(0010)   mod 12

)^2 =9^2 mod 12 =9;

//r2=0 ,不執行m =c*m mod n

,m的值無改變

9^(1000)   mod 12=(9^(0100)   mod 12

)^2 =9^2 mod 12 =9;

m=9*9 mod 12 =9      //r3=1,執行m =c*m mod n

迴圈結束,返回m=9

不知你明白我所說的沒。

歡迎交流指教。

UPDATE注射 mysql php 的兩個模式

文 安全天使superhei 一.測試環境 os windowsxp sp2 php php 4.3.10 mysql 4.1.9 apache 1.3.33 二.測試資料庫結構 start 資料庫 test 表的結構 userinfo create table userinfo groudid v...

RSA中的模冪運算之平方乘演算法的遞迴與非遞迴實現

具體原理不多說,直接上 實現,要注意的地方就是遞迴方式中結果的型別要定義為unsigned long long 防止溢位,比如這裡測試的例子 includeusing namespace std 如果將mod理解成無限大,那麼就相當於是在求指數,既然放大是合理的那麼縮小當然也是合理的,即在迴圈的過程...

兩個向量的點乘和叉乘怎麼算 豎乘相加,叉乘相減

有時候大家在學習高中數學時未免感到知識點很混亂很雜,甚至知識點之間的聯絡比較少。其實在高中階段的數學,不僅僅只有代數與代數之間 函式與導數,集合與邏輯命題等 幾何與幾何之間 圓與圓錐曲線,平面向量與空間向量等 更多的可能是數學學科思想整個的貫穿,以及你自己強行去建立的某些聯絡。這個強行,指的不是無中...