蒙哥马利大数模乘与RSA加密算法简介

在网上看了一圈蒙哥马利模乘相关的博客,没有看到讲得比较清晰的,趁最近闲下来自己写一篇。


首选明确三个问题:
1、蒙哥马利模乘是什么?
蒙哥马利模乘是一种数学家蒙哥马利(Montgomery)提出的一种快速计算 A ∗ B m o d    N A*B \mod N ABmodN的方法,其中 A , B , N A,B,N A,B,N均为几千位的大整数。

2、为什么要使用蒙哥马利模乘?
因为绝大多数编译器只能支持到64位的整数运算,而几千位的大整数运算如果用高精度算法编程计算,其速度非常慢,尤其是高精度除法和取模。因此需要借助蒙哥马利模乘才能更快地计算 A ∗ B m o d    N A*B \mod N ABmodN

3、蒙哥马利模乘实现的大概思路是什么?
A ∗ B m o d    N A*B \mod N ABmodN转化为求解 A ′ ∗ B ′ m o d    M A'*B' \mod M ABmodM,其中一般取 M = r n M=r^n M=rn,这样就将耗时的除法和取模操作转化为了简单的移位操作。为了在计算机或者电路中移位方便,我们一般取 r = 2 r=2 r=2。当然,如果你想手算体验一下计算过程,也可以取 r = 10 r=10 r=10,方便手算的移位操作。


那么有人可能会问,为什么要计算这么大数字的 A ∗ B m o d    N A*B \mod N ABmodN
这就要提到老生常谈的RSA加密算法了。

RSA加密算法简单来说,就是选取两个大质数 p p p q q q,相乘得到一个大整数 N = p q N=pq N=pq,把 N N N公开。然后有个同样公开的公钥 a a a,当甲要给乙发送明文 x x x的时候(每次发送的明文 x x x长度比 N N N小),就用公钥 a a a来对 x x x进行加密得到密文 y y y。乙手里有个保密不公开的私钥 b b b,对密文 y y y进行解密得到明文 x x x

具体的加密解密过程是:
甲用公钥 a a a来对 x x x进行加密得到密文 y y y:
x a ≡ y   (   m o d   N ) {x^a} \equiv y{\text{ }}(\bmod N) xay (modN)
乙用私钥 b b b对密文 y y y进行解密得到明文 x x x
y b ≡ x   (   m o d   N ) {y^b} \equiv x{\text{ }}(\bmod N) ybx (modN)
显然,为了实现这一功能, a , b , N a,b,N a,b,N之间必须要满足一定的条件。
前人给出的条件是:
a ∈ [ 2 , φ ( N ) − 1 ] a \in [2,\varphi (N) - 1] a[2,φ(N)1] ( a , φ ( N ) ) = 1 (a,\varphi (N)) = 1 (a,φ(N))=1,同时 a b ≡ 1   (   m o d   φ ( N ) ) ab \equiv 1{\text{ }}(\bmod \varphi (N)) ab1 (modφ(N))

上式中 φ ( N ) \varphi (N) φ(N)是欧拉函数,即 [ 1 , N − 1 ] [1,N-1] [1,N1]中与N互质的数的个数。
因为 N = p q N=pq N=pq p , q p,q p,q均为质数,所以 φ ( N ) = φ ( p ) φ ( q ) = ( p − 1 ) ( q − 1 ) \varphi (N)=\varphi (p)\varphi (q)=(p-1)(q-1) φ(N)=φ(p)φ(q)=(p1)(q1)


如何保证一定能找到 b b b使得 a b ≡ 1   (   m o d   φ ( N ) ) ab \equiv 1{\text{ }}(\bmod \varphi (N)) ab1 (modφ(N))
因为 ( a , φ ( N ) ) = 1 (a,\varphi (N)) = 1 (a,φ(N))=1,所以直接构造出 b b b证明存在性。
只要令 b = a φ ( φ ( N ) ) − 1 b = {a^{\varphi (\varphi (N)) - 1}} b=aφ(φ(N))1,则由欧拉定理得 a b = a φ ( φ ( N ) ) ≡ 1   (   m o d   φ ( N ) ) ab = {a^{\varphi (\varphi (N))}} \equiv 1{\text{ }}(\bmod \varphi (N)) ab=aφ(φ(N))1 (modφ(N))
注:但是实际操作的时候更多的是通过扩展欧几里得算法去求解 a b ≡ 1   (   m o d   φ ( N ) ) ab \equiv 1{\text{ }}(\bmod \varphi (N)) ab1 (modφ(N)),而非直接计算 b = a φ ( φ ( N ) ) − 1 b = {a^{\varphi (\varphi (N)) - 1}} b=aφ(φ(N))1

于是我们只需要证明 y b = x a b ≡ x   (   m o d   N ) {y^b} = {x^{ab}} \equiv x{\text{ }}(\bmod N) yb=xabx (modN)
分两种情况进行证明
1、若 ( x , N ) = 1 (x,N) = 1 (x,N)=1
由于 a b ≡ 1   (   m o d   φ ( N ) ) ab \equiv 1{\text{ }}(\bmod \varphi (N)) ab1 (modφ(N)) a b = k φ ( N ) + 1 ab = k\varphi (N) + 1 ab=kφ(N)+1,由欧拉定理得 x φ ( N ) ≡ 1   (   m o d   N ) {x^{\varphi (N)}} \equiv 1{\text{ }}(\bmod N) xφ(N)1 (modN),则有
x a b = x k φ ( N ) + 1 ≡ [ x φ ( N ) ] k ⋅ x ≡ x   (   m o d   N ) {x^{ab}} = {x^{k\varphi (N) + 1}} \equiv {[{x^{\varphi (N)}}]^k} \cdot x \equiv x{\text{ }}(\bmod N) xab=xkφ(N)+1[xφ(N)]kxx (modN)
2、若 ( x , N ) ≠ 1 (x,N) \ne 1 (x,N)=1
则必有 p ∣ x p|x px q ∣ x q|x qx,不妨设 p ∣ x p|x px,则 x = m p < N = p q x = mp < N = pq x=mp<N=pq m < q m < q m<q,又 q q q是质数,所以有 ( m , q ) = 1 (m,q) = 1 (m,q)=1 ( x , q ) = 1 (x,q) = 1 (x,q)=1。由费马小定理, x q − 1 ≡ 1   (   m o d   q ) {x^{q - 1}} \equiv 1{\text{ }}(\bmod q) xq11 (modq)。此时有 x a b = x k φ ( N ) + 1 = [ x q − 1 ] k ( p − 1 ) ⋅ x ≡ x   (   m o d   q ) {x^{ab}} = {x^{k\varphi (N) + 1}} = {[{x^{q - 1}}]^{k(p - 1)}} \cdot x \equiv x{\text{ }}(\bmod q) xab=xkφ(N)+1=[xq1]k(p1)xx (modq)
那么可知 x a b = t q + x ⇒ ( m p ) a b = t q + m p {x^{ab}} = tq + x \Rightarrow {(mp)^{ab}} = tq + mp xab=tq+x(mp)ab=tq+mp
p ∣ ( m p ) a b ⇒ p ∣ ( t q + m p ) ⇒ p ∣ t q ⇒ p ∣ t p|{(mp)^{ab}} \Rightarrow p|(tq + mp) \Rightarrow p|tq \Rightarrow p|t p(mp)abp(tq+mp)ptqpt
t = t 0 p t = {t_0}p t=t0p,则
x a b = ( m p ) a b = t 0 p q + m p = t 0 p q + x = t 0 N + x {x^{ab}} = {(mp)^{ab}} = {t_0}pq + mp = {t_0}pq + x={t_0}N + x xab=(mp)ab=t0pq+mp=t0pq+x=t0N+x
x a b ≡ x   (   m o d   N ) {x^{ab}} \equiv x{\text{ }}(\bmod N) xabx (modN)
从而得证。

RSA加密算法的安全性主要是依赖于大整数 N N N分解为大质数 p p p q q q的难度巨大,因为想从公开的 N N N a a a得到私钥 b b b,分解 N N N是唯一的办法,但是实际中 N N N通常是1024位或者2048位的大数,几乎是不可能分解的。

从对RSA加密算法的介绍中可以看出,在加密解密过程中主要涉及到了幂模运算 A B   m o d   N {A^B}\bmod N ABmodN,通过快速幂或者矩阵快速幂算法,我们可以将其转化为 ⌈ log ⁡ 2 B ⌉ \left\lceil {{{\log }_2}B} \right\rceil log2B次模乘运算 A ∗ C m o d    N A*C \mod N ACmodN得到结果。

一般地,快速地求解模乘运算 A ∗ B m o d    N A*B \mod N ABmodN便是蒙哥马利模乘要解决的问题。
(未完待续)

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值