Misay's blog

Back

前言#

我们知道,在RSA系统中,解密依赖于欧拉定理

aϕ(p)≡1  mod  p  ,  (a,p)=1a^{\phi(p)}\equiv1\;mod\;p\;,\;(a,p)=1\\

以及同余等式

ed≡1  mod  ϕ(n)ed\equiv1\;mod\;\phi(n)\\

,那么在已知

c≡  me  mod  nc\equiv\;m^{e}\;mod\;n

下,容易得到

cd≡  (me)d  mod  nc^{d}\equiv\;(m^{e})^{d}\;mod\;n\\ ed=1+kϕ(n)ed=1+k\phi(n)\\ cd≡  m∗mkϕ(n)  ≡  m∗1  mod  nc^{d}\equiv\;m*m^{k\phi(n)}\;\equiv\;m*1\;mod\;n\\

但是当e,phie,phi不互素的情况下,私钥dd就无法正常计算,在此之下想要顺利求解明文mm,衍生了一系列问题,本文基于笔者日常中遇到的相关题型,给出对应的处理方法

从简单情况出发#

我们不妨令

gcd(e,ϕ)=tgcd(e,\phi)=t\\ te′=ete^{'}=e\\

那么考虑转化为公钥指数为e′e^{'}的RSA,有

e′d′≡1modϕ(n)e^{'}d^{'}\equiv1mod\phi(n)\\ c≡  me≡  mte′  mod  nc\equiv\;m^{e}\equiv\;m^{te^{'}}\;mod\;n\\ cd′≡  mte′d′  ≡  mt  mod  nc^{d^{'}}\equiv\;m^{te^{'}d^{'}}\;\equiv\;m^{t}\;mod\;n\\

显然此时我们能够计算

cd′  mod  nc^{d^{'}}\;mod\;n\\

如果tt不是很大(个位数),当mt<nm^{t}<n的时候,我们直接能得到

cd′  mod  n=mtc^{d^{'}}\;mod\;n=m^{t}\\

,直接开tt次方就能得到mm

如果mtm^{t}不那么大的话,我们姑且还能尝试爆破

cd′=kn+mtc^{d^{'}}=kn+m^{t}\\

,但是如果数据不支持,大到爆破不了,我们就得进一步观察已有数据中的代数结构了

如果ee同时与p−1p-1,q−1q-1互质(CRT加速RSA问题)#

这里也就是在RSA中使用CRT算法加速运算的例子,我们都来讲讲如何操作

为什么要用CRT?

在RSA的计算中,我们有

ed≡1  mod  ϕ(n)ed\equiv1\;mod\;\phi(n)\\ c≡  md  modnc\equiv\;m^d\;modn\\

,我们知道n=pqn=pq,nn往往非常大,那么计算上面两个式子就非常的消耗时间,而且也需要(e,ϕ)=1(e,\phi)=1,我们注意到p,qp,q也是两个大质数,很有可能ee与即p−1    (ϕ(p))p-1\;\;(\phi(p)) ; 即q−1    (ϕ(q))q-1\;\;(\phi(q))也互素,那么我能就能把问题转化到模p,qp,q 下来讨论,下面是推导过程

由c≡  me  mod  n由c\equiv\;m^{e}\;mod\;n\\ c≡  me  mod  pc\equiv\;m^e\;mod\;p\\ c≡  me  mod  qc\equiv\;m^e\;mod\;q\\

这是由于q∣n  ;p∣nq|n\;;p|n也就是模的传递性,那么我们转过来计算在模p,qp,q下的私钥dp;dqd_p;d_q,即

edp≡1  mod  ϕ(p)edp\equiv1\;mod\;\phi(p)\\ edq≡1  mod  ϕ(q)ed_q\equiv1\;mod\;\phi(q)\\

那么在解密的时候就有

cdp≡  medp≡  m1+kϕ(p)  ≡  m  mod  pc^{d_p}\equiv\;m^{ed_p}\equiv\;m^{1+k\phi(p)}\;\equiv\;m\;mod\;p\\ cdq≡  medq≡  m1+kϕ(q)  ≡  m  mod  qc^{d_q}\equiv\;m^{ed_q}\equiv\;m^{1+k\phi(q)}\;\equiv\;m\;mod\;q\\ 记cdp≡  m  mod  p    =m1    cdq≡  m  mod  q    =m2记c^{d_p}\equiv\;m\;mod\;p\;\;=m_1\;\;c^{d_q}\equiv\;m\;mod\;q\;\;=m_2\\

这里是因为mm可能比nn要大,所以我们无法直接解出来,然后我们根据中国剩余定理可以构造出一个对mm的解,如下

由第二个同余式不妨设

m=m2+hq  m=m_2+hq\;\\

我们进而只需要解出来hh,把这个式子带入另一个同余式

m2+hq≡  m1mod  pm_2+hq\equiv\;m_1mod\;p\\ hq≡(m1−m2)  mod  phq\equiv(m_1-m_2)\;mod\;p\\

我们只需计算

Iq≡  q−1  mod  pI_q\equiv\;q^{-1}\;mod\;p\\

那么有

h≡  Iq(m1−m2)  mod  ph\equiv\;I_q(m_1-m_2)\;mod\;p\\

得到hh之后回代即可成功求出mm

可见这里我们的计算都是在模p,qp,q的式子中进行的,乘法运算的次数少了不少,实现了加速

说回正题,从上面不难看出,我们自始至终都没有尝试计算ed≡1  mod  ϕ(n)ed\equiv1\;mod\;\phi(n),成功回避了这个问题

来个例子—黑盾杯 2020-Factor

n = 3454083680130687060405946528826790951695785465926614724373
e = 3
c = 1347530713288996422676156069761604101177635382955634367208
gcd(m, n) = 1
python

这里n不是很大,简单分解后能得到三个素因子,我们记为pqr,如下

p=11761833764528579549
q=17100682436035561357
r=17172929050033177661
print(n-p*q*r) # 0
print(gcd(e,phi)) # 3
print(gcd(e,p-1)) # 1
print(gcd(e,q-1)) # 3
print(gcd(e,r-1)) # 1
print(gcd(e,(p-1)*(r-1))) # 1
python

简单检查了关系,如上,这题方法很多,在上面的解法下即利用(e,p−1)=(e,r−1)=1(e,p-1)=(e,r-1)=1来使用CRT求解,代码如下

#sage
dp=inverse(e,p-1)
dr=inverse(e,r-1)
m1=pow(c,dp,p)
m2=pow(c,dr,r)
Ir=pow(r,-1,p)
h=pow(Ir*(m1-m2),1,p)
m=m2+h*r
print(long_to_bytes(m))
# CMISCCTF{3_RSA}
py

这里也能转化到在模prpr下尝试求解,但是那对明文的大小有一定要求,我们还是使用通法,这里只要能找到两个满足要求的因子就行,但是这不是什么时候都能生效,请看下题

强网杯2022—[ASR]

注意到这里特别对m进行了填充,就是保证m比n的因子大,无法转化为在小因子的域下求解,看看下面这段失败的exp

这里的确找到了满足(ai−1,e)=1(a_i-1,e)=1的两个因子,但是我们注意到,若m=hq+m2m=hq+m_2又m2∈(0,q)m_2\in(0,q),所以m∈(hq,(h+1)q)m\in(hq,(h+1)q)我们在上述代码中解出来的hh满足h∈(0,t)h\in(0,t),也就是说,如果m>(1+t)qm>(1+t)q的时候,这个方法就暂时失效了,这是在多因子RSA下特别的问题,注意到我们还有两个因子没有使用,为了也能使用上它们,我们给出更加一般的方法

有限域开根#

想想我们的核心目标是什么?—求解mm 那么我们为什么要找到这个(ai−1,e)=1(a_i-1,e)=1的aia_i?重新捋一遍过程,我们就发现,是为了去计算daid_{a_i}来求解满足me≡  c  mod  aim^e\equiv\;c\;mod\;a_i的m≡  cdai  mod  aim\equiv\;c^{d_{a_i}}\;mod\;a_i,换言之,我们还是在求模不同素因子下的mm,我们不妨想一下,daid_{a_i}真的重要吗?,我们看这个方程

me−c≡0  mod  aim^e-c\equiv0\;mod\;a_i\\

这不就是在GF(ai)GF(a_i)下的方程吗?这里ee还非常小,完全可以在这个有限域GF(ai)GF(a_i)下来开根求解所有符合题意的mm的取值集合MiM_i,显然可能有多解,但是我们可以依次枚举M1,M2,M3,M4M_1,M_2,M_3,M_4中的值,由上述分析,若(ak−1,e)=1(a_k-1,e)=1,那么Mk={m  mod  ak}M_k=\left\{m\;mod\;a_k\right\}否则也有m  mod  aj  ∈  Mjm\;mod\;a_j\;\in\;M_j

那么我们枚举这四个集合,一定能找到满足我们需要的

{m1=m  mod  a1m2=m  mod  a2m3=m  mod  a3m4=m  mod  a4\begin{cases}m_1=m\;mod\;a_1\\m_2=m\;mod\;a_2\\m_3=m\;mod\;a_3\\m_4=m\;mod\;a_4\\\end{cases}

这就是中国剩余定理了,我们直接打CRT就能解出来m,而且我们用到了所有的因子,几乎可以保证mm这里是唯一的,如果不是唯一的,我们确定一下n=paqbrctdn=p^{a}q^{b}r^{c}t^{d}中的a,b,c,da,b,c,d,转化到mm模pa,  qb,  rc,  tdp^{a},\;q^{b},\;r^{c},\;t^{d}下就行,下面是修改后的exp

在这个脚本下我们能解决大部分问题,但是当ee太大的时候我们就得考虑其他的方法来处理了

根据题型,我们有几种应付的思路

UCSCCTF2025—EzCalculate

题面

p = 9586253455468582613875015189854230646329578628731744411408644831684238720919107792959420247980417763684885397749546095133107188260274536708721056484419031
q = 8998523072192453101232205847855618180700579235012899613083663121402246420191771909612939404791268078655630846054784775118256720627970477420936836352759291
n = p * q
e = 65536
c = 74962027356320017542746842438347279031419999636985213695851878703229715143667648659071242394028952959096683055640906478244974899784491598741415530787571499313545501736858104610426804890565497123850685161829628373760791083545457573498600656412030353579510452843445377415943924958414311373173951242344875240776

phi = (p - 1) * (q - 1)
print(gcd(e, phi)) # 4
print(gcd(e, p - 1)) # 2
print(gcd(e, q - 1)) # 2

print(gcd(e,(p-1)//2)) # 1
print(gcd(e,(q-1)//2)) # 1
python

在这里,我们注意到ee同时与p−12\frac{p-1}{2}和q−12\frac{q-1}{2}互素,于是我们能有一个取巧的方法,先转化到对因子的同余式,即

c≡  me  mod  pc\equiv\;m^e\;mod\;p\\ c≡  me  mod  qc\equiv\;m^e\;mod\;q\\

再不妨记

sp=p−12s_p=\frac{p-1}{2}\\ sq=q−12s_q=\frac{q-1}{2}\\

容易有

(e,sp)=(e,sq)=1(e,s_p)=(e,s_q)=1\\

那么必然存在

edsp≡1  mod  sped_{s_p}\equiv1\;mod\;s_p\\ edsq≡1  mod  sqed_{s_q}\equiv1\;mod\;s_q\\

写成等式,即

edsq=1+ksqed_{s_q}=1+ks_q\\ edsp=1+ksped_{s_p}=1+ks_p\\

我们考虑同余式

mϕ(p)≡  mp−1≡  (msp)2≡1  mod  pm^{\phi(p)}\equiv\;m^{p-1}\equiv\;(m^{s_p})^2\equiv1\;mod\;p

这里就初见端倪了,我们做一个换元

xp=mspx_p=m^{s_p}

那不就是二次剩余的判别式吗

注意到这里我们得到了重要的模pp式子,回看解密过程

cdsp≡  medsp≡  m1+ksp≡  m∗(msp)kc^{d_{s_p}}\equiv\;m^{ed_{s_p}}\equiv\;m^{1+k_{s_p}}\equiv\;m*(m^{s_p})^k

也就是

cdsp≡  ±  m  mod  pc^{d_{s_p}}\equiv\;\pm\;m\;mod\;p

也就是说我们有

m1≡  m  ≡  ±  cdsp  mod  pm_1\equiv\;m\;\equiv\;\pm\;c^{d_{s_p}}\;mod\;p

回到了熟悉的地方,再构造CRT就可以解出mm了

那么这里如果再改成

(e,p−1)=(e,q−1)=4,8,16...(e,p-1)=(e,q-1)=4,8,16...

呢,思路还是考虑这个式子

(mp−12i)2i≡1  mod  p(m^{\frac{p-1}{2^i}})^{2^i}\equiv1\;mod\;p

可以考虑去计算2i2^i次的本原单位根,但考虑到虚数的引用带来的一系列不确定性,不再过度深入。

那么如果e=65537e=65537这种大素数呢?往往会伴随另外一个条件,是e  ∣  ϕ(N)e\;|\;\phi(N),在这种情况下,我们可以使用AMM算法来找到一个满足条件的mm

AMM算法#

我们先从上面的RSA题目中抽离出来,来看看整数域开根下的一般问题,我们面对的是同余式

me  ≡  b  mod  pm^e\;\equiv\;b\;mod\;p

我们往往已知b,p,eb,p,e且pp是一个素数,我们想要找出一个满足方程的mm,从简单出发,我们先讨论e=2e=2的情况

e=2时#

也就是处理方程

m2  ≡  b  mod  pm^2\;\equiv\;b\;mod\;p

因为pp是素数,我们可以这样来设

p−1=2t∗sp-1=2^t*s

其中为奇数t>0,st>0,s

那么我们知道,对于所有的模pp的二次剩余数xx (这里bb就是一个模pp的二次剩余)有

xp−12≡1  mod  px^{\frac{p-1}{2}}\equiv1\;mod\;p

代入上面的式子,可以得到

xs∗2t−1≡1  mod  px^{s*2^{t-1}}\equiv1\;mod\;p

再次从简单出发,如果t=1t=1

那么直接有

xs≡1  mod  px^s\equiv1\;mod\;p

两边同乘一个xx ,又(x,p)=1(x,p)=1,直接开方,有

xs+12≡  x12  mod  px^{\frac{s+1}{2}}\equiv\;x^{\frac{1}{2}}\;mod\;p

前面强调了bb就是这样的一个二次剩余,也就是说,我们代入x=bx=b,这个方程是成立的,所以说

bs+12≡  b12  mod  pb^{\frac{s+1}{2}}\equiv\;b^{\frac{1}{2}}\;mod\;p

这个方程两边平方后,就是我们非常熟悉的

bs+1  ≡  b  mod  pb^{s+1}\;\equiv\;b\;mod\;p

所以说,我们就找到了一个符合要求的m=bs+12m=b^{\frac{s+1}{2}}

那么,如果t>1t>1呢?

我们知道对于所有的模pp的非二次剩余yy,有

yp−12≡  ys∗2t−1≡−1  mod  py^{\frac{p-1}{2}}\equiv\;y^{s*2^{t-1}}\equiv-1\;mod\;p

我们不难得到

(xs∗2t−2)2≡1  mod  p(x^{s*2^{t-2}})^2\equiv1\;mod\;p

开方,能得到两种结果,即

xs∗2t−2≡1  mod  px^{s*2^{t-2}}\equiv1\;mod\;p\\ xs∗2t−2≡−1  mod  px^{s*2^{t-2}}\equiv-1\;mod\;p

为了避免负数的出现导致开根开出虚数,我们乘上一个非二次剩余,即

xs∗2t−2    ∗    ys∗2t−1  ∗  k        ≡1  mod  px^{s*2^{t-2}}\;\;*\;\;y^{s*2^{t-1}\;*\;k}\;\;\;\;\equiv1\;mod\;p

这里用kk来记录是否为负,yy是自己生成的

注意到我们这里xx实际上就是bb,而s,ts,t都是已知的,在代码中我们可以直接算这个xs∗2t−2  mod  px^{s*2^{t-2}}\;mod\;p,如果是1,就令k=0k=0,否则为1

同余式右边为1后继续开方,即

xs∗2t−3    ∗    ys∗2t−2∗k1    ∗    ys∗2t−1∗k2  ≡  1  mod  px^{s*2^{t-3}}\;\;*\;\;y^{s*2^{t-2}*k_1}\;\;*\;\;y^{s*2^{t-1}*k_2}\;\equiv\;1\;mod\;p

确定k2k_2的方法和上面一样,我们一直开方,直到xx的指数幂中不含tt,会得到形似如下的式子

xs    ∗    ys∗(k1+2k2+4k3+...+2t−2kt−1)  ≡  1  mod  px^{s}\;\;*\;\;y^{s*(k_1+2k_2+4k_3+...+2^{t-2}k_{t-1})}\;\equiv\;1\;mod\;p

两边同乘一个xx,再开方就得到了我们需要的mm

m≡  b12  ≡  bs+12    ∗    y12s∗(k1+2k2+4k3+...+2t−2kt−1)  mod  pm\equiv\;b^{\frac{1}{2}}\;\equiv\;b^{\frac{s+1}{2}}\;\;*\;\;y^{\frac{1}{2}s*(k_1+2k_2+4k_3+...+2^{t-2}k_{t-1})}\;mod\;p

这里的核心思路就是消去tt,构造

vbu≡  1  mod  pvb^{u}\equiv\;1\;mod\;p

的代数式

这里AMM找到的只是一个满足要求的解,我们知道在e=2e=2的情况下,符合条件的mm有两个,为了找到另一个解,也就是描述在模pp下的−1-1,我们使用如下方法,任意找到一个hh,使得它不是模pp的二次剩余,那么有

hp−12≡  −1  mod  ph^{\frac{p-1}{2}}\equiv\;-1\;mod\;p\\ m∗hp−12≡  −m  mod  pm*h^{\frac{p-1}{2}}\equiv\;-m\;mod\;p\\ (m∗hp−12)2≡  (−m)2≡  b  mod  p(m*h^{\frac{p-1}{2}})^2\equiv\;(-m)^2\equiv\;b\;mod\;p\\

也就是说,mm,m∗hp−12m*h^{\frac{p-1}{2}}都是满足要求的解,在GF(p)GF(p)下

e更大的时候#

我们现在要考虑的是

me≡  b  mod  pm^e\equiv\;b\;mod\;p

这里的问题是从二次剩余转到ee次剩余,这里我们需要条件e  ∣  p−1e\;|\;p-1,设

p−1=et∗sp-1=e^t*s

那么对我们要求的xx,有

(xe)p−1e≡  cp−1e≡  cs∗et−1  ≡1  mod  p(x^e)^{\frac{p-1}{e}}\equiv\;c^{\frac{p-1}{e}}\equiv\;c^{s*e^{t-1}}\;\equiv1\;mod\;p\\

还是从简单出发,如果t=1t=1

即

cs≡  1  mod  pc^{s}\equiv\;1\;mod\;p

此时如果(s,e)=1(s,e)=1,那么可以参考RSA的解法

ed≡1  mod  s    ;    ed−1=ksed\equiv1\;mod\;s\;\;;\;\;ed-1=ks

代入,

ced≡  (cd)e  ≡  c  mod  pc^{ed}\equiv\;(c^d)^e\;\equiv\;c\;mod\;p

可见这里m≡  cd  mod  pm\equiv\;c^d\;mod\;p就是一个满足要求的解

如果(s,e)≠1(s,e)\neq1可以考虑离散对数的方法

如果t>1t>1

我们站在高一点的视角下一个结论

AMM算法就是在模p整数域中构造一个e阶子群来开根

先看要讨论的式子

me≡  c  mod  pm^e\equiv\;c\;mod\;p

其中e  ∣  pe\;|\;p

我们可以令

p−1  =  setp-1\;=\;se^{t}

由欧拉定理,当(x,p)=1(x,p)=1

xp−1≡  1  mod  px^{p-1}\equiv\;1\;mod\;p

这里可以视为一个生成元为xx,阶为pp的模pp子群

那么稍微变形一下

(xp−1e)e≡  1  mod  p(x^{\frac{p-1}{e}})^e\equiv\;1\;mod\;p

令

g=xp−1eg=x^{\frac{p-1}{e}}

那么我们就构造了一个模pp下,生成元为gg的ee阶子群GG

G={1,g,g2,...,ge−1}G=\left\{1,g,g^2,...,g^{e-1}\right\}

特别注意gg不能是模pp的ee次剩余,也就是

gp−1e  ≢    1  mod  pg^{\frac{p-1}{e}}\;\not\equiv\;\;1\;mod\;p

否则gg就是1开ee根开出来的一个结果,你拿gg生成的群就无法包含所有可能的根

接下来我们说明GG中元素进行ee次幂后模pp为1

gie≡  (ge)i≡1i  ≡  1  mod  pg_i^{e}\equiv\;(g^{e})^i\equiv1^i\;\equiv\;1\;mod\;p

那么也就是说,在模pp群下对1开ee次方根的结果都会落在群GG中

知道这个结论,我们对上式做一个小变形

(xs∗et−1)e≡1  mod  p(x^{s*e^{t-1}})^e\equiv1\;mod\;p

再

(xe)s∗et−1≡(c)s∗et−1≡1  mod  p(x^e)^{s*e^{t-1}}\equiv(c)^{s*e^{t-1}}\equiv1\;mod\;p

c,s,t,e,pc,s,t,e,p我们都知道,仿照上面的思路,先对

(c)s∗et−1(c)^{s*e^{t-1}}

开ee次方根,就能得到

(c)s∗et−2(c)^{s*e^{t-2}}

我们再直接计算这个元素的值,然后在这个群GG中找到逆元

假设

(c)s∗et−2≡  gi  mod  p(c)^{s*e^{t-2}}\equiv\;g^i\;mod\;p

那么逆元就是

kj≡  ge−i  mod  pk_j\equiv\;g^{e-i}\;mod\;p

所以说上面的同余式开根后就直接是

(c)s∗et−2    ∗    kj    ≡    1    mod  p(c)^{s*e^{t-2}}\;\;*\;\;k_j\;\;\equiv\;\;1\;\;mod\;p

如此往下计算,直到同余式左边只剩下ss次幂,最后解出来mm之后还要记得根据这个群GG的ee个单位根对应出ee组解,当(e,s)=1(e,s)=1的时候,我们来操作一下,就是

分解p-1#

p−1=setp-1=se^{t}

计算逆元d,找到初始解#

d≡  e−1  mod  sd\equiv\;e^{-1}\;mod\;s m0  ≡  cd  mod  pm_0\;\equiv\;c^{d}\;mod\;p

逐步上升#

先找到生成元gg

gp−1e  ≢    1  mod  pg^{\frac{p-1}{e}}\;\not\equiv\;\;1\;mod\;p

再定义一些初始变量

a≡  get−1  mod  sa\equiv\;g^{e^{t-1}}\;mod\;s b  ≡  ced−1  ≡  (cd)ec  ≡  m0ec  mod  pb\;\equiv\;c^{ed-1}\;\equiv\;\frac{(c^d)^e}{c}\;\equiv\;\frac{m_0^{e}}{c}\;mod\;p z  ≡  gs  mod  pz\;\equiv\;g^s\;mod\;p h=1h=1

可知

zet≡  gs∗et  ≡  gp−1  ≡  1  mod  pz^{e^{t}}\equiv\;g^{s*e^{t}}\;\equiv\;g^{p-1}\;\equiv\;1\;mod\;p

再在每一次迭代的过程中,计算

di≡  bet−1−i  mod  pd_i\equiv\;b^{e^{t-1-i}}\;mod\;p

如果

di=1d_i=1

说明这次开方的结果开出来就是ee次剩余根,无需调整,否则要进行修改,并同时对b,h,zb,h,z进行修正

最后对得到的根乘上ee个单位根,得到解

这里能得到所有模p下的解,再整合起来打CRT就解决了

来个实战例子

NCTF2019—EzRSA

e = 0x1337
p = 199138677823743837339927520157607820029746574557746549094921488292877226509198315016018919385259781238148402833316033634968163276198999279327827901879426429664674358844084491830543271625147280950273934405879341438429171453002453838897458102128836690385604150324972907981960626767679153125735677417397078196059
q = 112213695905472142415221444515326532320352429478341683352811183503269676555434601229013679319423878238944956830244386653674413411658696751173844443394608246716053086226910581400528167848306119179879115809778793093611381764939789057524575349501163689452810148280625226541609383166347879832134495444706697124741
n = p * q
c = 10562302690541901187975815594605242014385201583329309191736952454310803387032252007244962585846519762051885640856082157060593829013572592812958261432327975138581784360302599265408134332094134880789013207382277849503344042487389850373487656200657856862096900860792273206447552132458430989534820256156021128891296387414689693952047302604774923411425863612316726417214819110981605912408620996068520823370069362751149060142640529571400977787330956486849449005402750224992048562898004309319577192693315658275912449198365737965570035264841782399978307388920681068646219895287752359564029778568376881425070363592696751183359

phi = (p - 1) * (q - 1)
print(gcd(e, phi)) #4919
print(gcd(e, p - 1)) #4919
print(gcd(e, q - 1)) # 4919
print(int(e)) #4919
py

exp 这里使用python多进程加快运算

RSA--e与phi不互素
https://www.zt2misay2.cn/blog/rsa-e%E4%B8%8Ephi%E4%B8%8D%E4%BA%92%E7%B4%A0
Author Misay
Published at 2025年4月28日