蒙哥马利算法求解大整数幂求模

蒙哥马利大整数模幂算法

  前几天写了一篇博客《25行代码实现完整的RSA算法》,是关于用Python代码实现一个完整的RSA算法的代码,整个代码中最核心、最浪费时间的代码部分就是关于求解大整数模幂算法这里。整个算法也叫“蒙哥马利幂模”算法。
  首先简单介绍一下蒙哥马利相关的几个算法,具体详细介绍可以参考《蒙哥马利算法详解》。蒙哥马利算法并不是一个独立的算法,而是三个相互独立又相互联系的算法集合,其中包括:

  • 蒙哥马利乘模,是用来计算 xy(modN) x ⋅ y ( m o d N )
  • 蒙哥马利约减,是用来计算 tρ1(modN) t ⋅ ρ − 1 ( m o d N )
  • 蒙哥马利幂模,是用来计算 xy(modN) x y ( m o d N )

  在这三个算法中,蒙哥马利幂模是RSA加密算法的核心部分。本篇文章为了简单起见就不介绍前两个“蒙哥马利乘模”和“蒙哥马利约减”算法了。主要介绍第三个“蒙哥马利幂模”的计算方法过程,以及通过一个小例子进行说明这个算法的具体计算过程,至于证明方法我就不在这里介绍,大家只要能看到这个例子以后,能把代码写出来就能写完整的RSA算法了。如果想看已经实现的代码请参考这里,或者这里。在这两篇博文里都有完整的代码实现方法。下面介绍“蒙哥马利幂模”的详细计算过程:
  RSA公钥密码的加密算法与解密算法都要计算“模幂乘运算” ab(modN) a b ( m o d N )
设b的二进制数字表示为 br1...b1b0 b r − 1 . . . b 1 b 0 ,即:
       b=b0+b1×2+...+br1×2r1 b = b 0 + b 1 × 2 + . . . + b r − 1 × 2 r − 1
于是:
       abab0×(a2)b1×...×(a2r1)br1(modN) a b ≡ a b 0 × ( a 2 ) b 1 × . . . × ( a 2 r − 1 ) b r − 1 ( m o d N )
A0=a A 0 = a Ai(Ai1)2(modN) A i ≡ ( A i − 1 ) 2 ( m o d N ) ,i = 1, 2… r - 1,则有:
     abA0b0×A1b1×...×Ar1br1(modN) a b ≡ A 0 b 0 × A 1 b 1 × . . . × A r − 1 b r − 1 ( m o d N )
其中,在这里

Aibi={Ai,1,bi=1bi=0i=0,1...r1 A i b i = { A i , 若 b i = 1 1 , 若 b i = 0 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=210613mod2537 c = 2106 13 m o d 2537 。计算如下:13的二进制表示为1101,即 13=1×23+1×22+0×21+1×20=23+22+1 13 = 1 × 2 3 + 1 × 2 2 + 0 × 2 1 + 1 × 2 0 = 2 3 + 2 2 + 1
   A0=2106431(mod2537) A 0 = 2106 ≡ − 431 ( m o d 2537 )
   A1=(431)2560(mod2537) A 1 = ( − 431 ) 2 ≡ 560 ( m o d 2537 )
   A2=(560)2988(mod2537) A 2 = ( 560 ) 2 ≡ − 988 ( m o d 2537 )
   A3=(988)2601(mod2537) A 3 = ( − 988 ) 2 ≡ − 601 ( m o d 2537 )
   210613=(431)×(988)×(601)2321(mod2537) 2106 13 = ( − 431 ) × ( − 988 ) × ( − 601 ) ≡ 2321 ( m o d 2537 )
得到密文c=2321。
  又设收到密文是0981,要把它恢复成明文,计算 131937(mod2436) 13 − 1 ≡ 937 ( m o d 2436 ) ,得d = 937,明文 m=981937(mod2537) m ′ = 981 937 ( m o d 2537 ) 。计算如下:937的二进制表示为1110101001,即 937=1+23+25+27+28+29 937 = 1 + 2 3 + 2 5 + 2 7 + 2 8 + 2 9
   A0=981 A 0 = 981
   A1=9812838(mod2537) A 1 = 981 2 ≡ 838 ( m o d 2537 )
   A2=8382505(mod2537) A 2 = 838 2 ≡ − 505 ( m o d 2537 )
   A3=(505)21325(mod2537) A 3 = ( − 505 ) 2 ≡ − 1325 ( m o d 2537 )
   A4=1325221(mod2537) A 4 = 1325 2 ≡ 21 ( m o d 2537 )
   A5=212441(mod2537) A 5 = 21 2 ≡ 441 ( m o d 2537 )
   A6=4412868(mod2537) A 6 = 441 2 ≡ − 868 ( m o d 2537 )
   A7=(868)265(mod2537) A 7 = ( − 868 ) 2 ≡ − 65 ( m o d 2537 )
   A8=(65)2849(mod2537) A 8 = ( − 65 ) 2 ≡ − 849 ( m o d 2537 )
   A9=(849)2293(mod2537) A 9 = ( − 849 ) 2 ≡ 293 ( m o d 2537 )
   981937981×1325×441×981×981×293704(mod2537) 981 937 ≡ 981 × 1325 × 441 × 981 × 981 × 293 ≡ 704 ( m o d 2537 ) ,
得明文: m=0704 m ′ = 0704 ,即he。
  如果想看到一个正式的加密解密代码请点击我的第一篇博客《 25行代码实现完整的RSA算法》,在这里你才能真正领略“蒙哥马利算法”在互联网支付与通信时代所发挥的重大的作用。今天我们敢在手机上、电脑上以及服务器上面很放心地对自己的银行卡进行操作,全都依赖rsa算法的威力。

  • 11
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 22
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 22
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值