0182 RSA加密
* * * *
拉格朗日计划
* * * *
RSA加密

RSA加密和解密的过程如下:

选择两个不同的素数p和q,记$n=pq$以及$\varphi=(p-1)(q-1)$。

取大于1小于$\varphi$,且$\gcd(a,\varphi)=1$的整数a和满足$ad=1 \bmod \varphi$的整数d。

加密时,将需要加密的信息首先需要转换为区间$[0,n-1]$之间的整数m,加密后的密文为$c=m^a \bmod n$。

解密时,计算$m=c^d \bmod n$即可。

不过存在某些a和m满足$m^a \bmod n=m$,即密文与明文完全一致,称这样的m为(给定的$a,p,q$的)无法加密信息。

例如,若$p=19$,$q=37$,则$n=19\times 37=703$,$\varphi=18\times 36=648$,此时若$a=181$,那么尽管$\gcd(181,648)=1$,$[0,n-1]$之间的所有整数m都是无法加密信息。

事实上给定p和q,不论如何选择密钥a,总是存在一些无法加密信息,因此选择密钥a的重要原则就是令无法加密信息在给定的p和q下尽可能少。

现令$p=1009$,$q=3643$,找出所有能令无法加密信息总数取到最小值的密钥a之和。

本题难度:



解答

若$m^a=m \bmod pq$,则$m^a$和$m$相差$pq$的若干倍,因此也有$m^e=m \bmod p$以及$m^e=m \bmod q$。

反之若$m^a=x \bmod p$且$m^a=y \bmod q$, 那么$m^a=x+\left ((y-x)p^{-1} \bmod q\right)p \pmod pq$,其中$p^{-1}$是p在模q乘法群$\mathbb Z_q^*$中的逆,因此若$x=y=m$,则也有$m^a=m \bmod pq$。

进一步分析可知,若$m^a=m \bmod p$,则移项后可得或者p能整除m、或者$m^{a-1}=1 \bmod p$。

同理若$m^a=m \bmod q$,则或者q能整除m、或者$m^{a-1}=1 \bmod q$。

因此需要令$m^{a-1}=1$在模p乘法群$\mathbb Z_p^*$和模q乘法群$\mathbb Z_q^*$中的解尽可能少。

p和q都是素数,因此$\mathbb Z_p^*$和$\mathbb Z_q^*$事实上是阶数分别为$p-1$和$q-1$的循环群。

若$x_p,x_q$分别是群的生成元且$m=x_p^{t_p}=x_q^{t_q}$,那么$t_p$应当是$(p-1)/\gcd(p-1,a-1)$的倍数, $t_q$应当是$(q-1)/\gcd(q-1,e-1)$的倍数。

因此计入单位元,该方程在两个群中各自分别有$1+\gcd(e-1,p-1)$和$1+\gcd(e-1,q-1)$个解。

最后由中国剩余定理,可以取到上述解的合适的线性组合就可以生成$\mathbb Z_p^*$和$\mathbb Z_q^*$中的公共解,共有 $$\left(1+\gcd(e-1,p-1)\right)\times\left(1+\gcd(e-1,q-1)\right)$$ 个。

遍历所有的$a$,求出上式的最小值(在本题中等于9,此时$\gcd(a-1,p-1)=\gcd(a-1,q-1)=2$)并将能取到该值的a相加即可得结果$399788195976$。

注:本题计算并不复杂,但需要有研究生水平的《抽象代数》课程知识才能分析解答。

import fractions
phi=1008*3642
m=1009*3642
r=0
p=set()
for e in range(2,phi):
    if fractions.gcd(e,phi)==1:
        a,b=fractions.gcd(e-1,1008),fractions.gcd(e-1,3642)
        c=(1+a)*(1+b)
        if c < m:
            m=c
            r=e
            p=set([(a,b)])
        elif c==m:
            r+=e
            p.add((a,b))

print r