前幾天寫了一篇博客《25行代碼實現完整的RSA算法》,是關於用Python代碼實現一個完整的RSA算法的代碼,整個代碼中最核心、最浪費時間的代碼部分就是關於求解大整數模冪算法這里。整個算法也叫“蒙哥馬利冪模”算法。
首先簡單介紹一下蒙哥馬利相關的幾個算法,具體詳細介紹可以參考《蒙哥馬利算法詳解》。蒙哥馬利算法並不是一個獨立的算法,而是三個相互獨立又相互聯系的算法集合,其中包括:
- 蒙哥馬利乘模,是用來計算$$x⋅y (mod N)$$
- 蒙哥馬利約減,是用來計算$$t⋅ρ^{-1} (mod N)$$
- 蒙哥馬利冪模,是用來計算$$x^{y} (mod N)$$
在這三個算法中,蒙哥馬利冪模是RSA加密算法的核心部分。本篇文章為了簡單起見就不介紹前兩個“蒙哥馬利乘模”和“蒙哥馬利約減”算法了。主要介紹第三個“蒙哥馬利冪模”的計算方法過程,以及通過一個小例子進行說明這個算法的具體計算過程,至於證明方法我就不在這里介紹,大家只要能看到這個例子以后,能把代碼寫出來就能寫完整的RSA算法了。如果想看已經實現的代碼請參考這里,或者這里。在這兩篇博文里都有完整的代碼實現方法。下面介紹“蒙哥馬利冪模”的詳細計算過程:
RSA公鑰密碼的加密算法與解密算法都要計算“模冪乘運算”$$a^b(modN)$$。
設b的二進制數字表示為$$b_{r-1}...b_1b_0$$,即:
$$b=b_0+b_1×2+...+b_{r-1}×2^{r-1}$$。
於是:
$$ab≡a{b_0}×(a2){b_1}×...×(a{2{r-1}})^{b_{r-1}}(mod N)$$
令$$A_0=a$$,$$A_i≡(A_{i-1})^2(mod N)$$,i = 1, 2... r - 1,則有:
$$a^b ≡ {A_0}^{b_0} × {A_1}^{b_1} × ... × {A_{r-1}}^{b_{r-1}} (mod N)$$
其中,在這里
$$$${A_i} ^ {b_i}=\begin{cases}
A_i, & 若b_i=1\
1, & 若b_i=0
\end{cases} i=0,1...r-1$$$$
下面通過一個例子來說明以上的公式:
例1:取p=43,q=59,n = 43 × 59 = 2537 , φ(n) = (43 - 1) × (59 - 1) = 2436 , 選取e = 13。字母表(a,b,....,z)依次用00,01,...,25表示,各占2位,設明文段m=2106,也就是m = vg,那么密文$$c = 2106^{13} mod 2537$$。計算如下:13的二進制表示為1101,即$$13=1×2^3 + 1×2^2 + 0×2^1 + 1×2^0 = 2^3 + 2^2 + 1$$。
$$A_0 = 2106 ≡ -431 (mod 2537)$$,
$$A_1 = (-431)^2 ≡ 560 (mod 2537)$$,
$$A_2 = (560)^2 ≡ -988 (mod 2537)$$,
$$A_3 = (-988)^2 ≡ -601 (mod 2537)$$,
$$2106^{13} = (-431) × (-988) × (-601) ≡ 2321 (mod 2537)$$
得到密文c=2321。
又設收到密文是0981,要把它恢復成明文,計算$${13}^{-1} ≡ 937(mod2436)$$,得d = 937,明文$$m^{'} = 981 ^ {937} (mod 2537)$$。計算如下:937的二進制表示為1110101001,即$$937 = 1 + 2^3 + 2^5 + 2^7 + 2^8 + 2^9$$。
$$A_0 = 981$$,
$$A_1 = 981^2 ≡ 838 (mod 2537)$$,
$$A_2 = 838^2 ≡ -505 (mod 2537)$$,
$$A_3 = (-505)^2 ≡ -1325 (mod 2537)$$,
$$A_4 = 1325^2 ≡ 21 (mod 2537)$$,
$$A_5 = 21^2 ≡ 441 (mod 2537)$$,
$$A_6 = 441^2 ≡ -868 (mod 2537)$$,
$$A_7 = (-868)^2 ≡ -65 (mod 2537)$$,
$$A_8 = (-65)^2 ≡ -849 (mod 2537)$$,
$$A_9 = (-849)^2≡ 293 (mod 2537)$$,
$$981^{937} ≡ 981 × 1325 × 441 × 981 × 981 × 293 ≡ 704(mod 2537)$$,
得明文:$$m' = 0704$$,即he。
如果想看到一個正式的加密解密代碼請點擊我的第一篇博客《25行代碼實現完整的RSA算法》,在這里你才能真正領略“蒙哥馬利算法”在互聯網支付與通信時代所發揮的重大的作用。今天我們敢在手機上、電腦上以及服務器上面很放心地對自己的銀行卡進行操作,全都依賴rsa算法的威力。