[HGAME 2022 week3]Multi Prime RSA(欧拉函数)

题目:

from Crypto.Util.number import getPrime
from libnum import s2n
from secret import flag

p = getPrime(256)
q = getPrime(256)
r = getPrime(256)
s = getPrime(256)
n = p ** 2 * q ** 3 * r ** 5 * s ** 7
e = 65537
c = pow(s2n(flag), e, n)
print(f"p = {p}")
print(f"q = {q}")
print(f"r = {r}")
print(f"s = {s}")
print(f"n = {n}")
print(f"e = {e}")
print(f"c = {c}")

p = 61789932148719477384027458333380568978056286136137829092952317307711908353477
q = 91207969353355763685633284378833506319794714507027332929290701748727534193861
r = 105471299607375388622347272479207944509670502835651250945203397530010861809367
s = 83153238748903772448138307505579799277162652151244477391465130504267171881437
n = 1039344372165087100001063920598151812324151064684841845250974758525265148567706103784958424873181721352440209284812493753972556519482026327282644619091466886523804841248277210353173383407944598453848113815866908595335619458549486958764490103808475329598085842184963065068499489886467911087295087163762599284622055185456905774507245781667293199205317692029829495961487347944813874415423771980660778986211145841712412631156369129146470119135136378158203459576596246169191419488560832734046076107673091995860021863239882608638458149930255944184863801278386551031980146460231515747754411678651752698881001464973981424240781413084941947261875289725538959720572496329348499870580057997540844488309111059240745081048324762866572948371222839278718034435739827677190025500802453626872356208612718417249649474571197167076916403582394186357812640566250930361276229969553128128312736245440129556020108188835966131425956431796417720436474093381770796431629523054378258497546013222494974549262140415585158985940966415459478150722832119691308697510189026447359189994055885090735411738332296254011208547676914004864732327863884217733456287369771087094514708468685641820375220835485053482570852619363091173324203334503461823983610886849930944250553928855506012684504211525542998575275626784129736345142772399109273619522445919
e = 65537
c = 844677395496466411520394190869787261209960246734415406217975986418865760680024542119231873259131861208878522030009923057991526761346423130242121884493257732067700857897379859545356609151834223804262174935191718271211809221730601602827122249238086030580971376104724987801049500689134122609834321586609223761140538079460830213824674361601046367637227094018381901291488659642720549583856812747877519600804325570421770575999289389175021646347371879234023647657507178519047236746071420327155188213839293382288787853777540226192644761028822256165706787395891134765908229036044468473519166141610604791485071702808854944672418124203289328124793348198048601338476086482318248264508789781967910205393740835345086784345145351367491197717933757414967811594913692588314161669333147733048171044386546892346475181197482702164468542430187885074163177843285948999943328049159021873821254267471067523609151007885131921896462161216356454116929796355815756642621369974260365378070336290542971599886325232821981080341858950609157813769416455337935096696635623426418166316737131174435618543058086342714723330814586496030805366321181723292731710369013923285787724941830672247377301048663929453294620044701627159066468762709113137517559435822623284148112827473010030736329596829357275518641576798298066541516764673029908084962144713

我们看到n的计算有别于一般的计算方法,故考虑欧拉函数的定义。

在 RSA 加密算法中,n 是两个大质数 p 和 q 的乘积,而 phi(欧拉函数)是计算小于 n 的正整数中与 n 互质的数的个数。对于 n = p ** 2 * q ** 3 * r ** 5 * s ** 7 这样的形式,phi 的计算涉及到欧拉函数的性质,特别是当 n 是多个不同质数的幂的乘积时。
欧拉函数的定义是:对于任意正整数 n,phi(n) 是小于或等于 n 的正整数中与 n 互质的数的个数。如果 n 可以分解为质因数的乘积,即 n = p1 ** e1 * p2 ** e2 * ... * pk ** ek,那么 phi(n) 可以通过以下公式计算:
phi(n) = n * (1 - 1/p1) * (1 - 1/p2) * ... * (1 - 1/pk)
这个公式可以进一步简化为:
phi(n) = p1 ** (e1 - 1) * (p1 - 1) * p2 ** (e2 - 1) * (p2 - 1) * ... * pk ** (ek - 1) * (pk - 1)
对于给定的 n = p ** 2 * q ** 3 * r ** 5 * s ** 7,我们可以应用上述公式来计算 phi(n):
phi(n) = (p ** 2 * q ** 3 * r ** 5 * s ** 7) * (1 - 1/p) * (1 - 1/q) * (1 - 1/r) * (1 - 1/s)
简化后得到:
phi(n) = p ** 2 * (1 - 1/p) * q ** 3 * (1 - 1/q) * r ** 5 * (1 - 1/r) * s ** 7 * (1 - 1/s)
进一步简化,我们得到:
phi(n) = p ** 2 * (p - 1) * q ** 3 * (q - 1) * r ** 5 * (r - 1) * s ** 7 * (s - 1)
但是,我们需要注意到,每个质因数的指数在计算 phi(n) 时需要减去 1,因此最终的 phi(n) 应该是:
phi(n) = p ** (2 - 1) * (p - 1) * q ** (3 - 1) * (q - 1) * r ** (5 - 1) * (r - 1) * s ** (7 - 1) * (s - 1)
这解释了为什么 phi 的计算公式中每个质因数的指数都要减去 1。所以,正确的 phi(n) 计算应该是:
phi(n) = p ** 1 * (p - 1) * q ** 2 * (q - 1) * r ** 4 * (r - 1) * s ** 6 * (s - 1)
即:
phi(n) = p * (p - 1) * q ** 2 * (q - 1) * r ** 4 * (r - 1) * s ** 6 * (s - 1)
这个公式反映了欧拉函数在质因数分解形式下的计算规则。

EXP:

'''
from Crypto.Util.number import getPrime
from libnum import s2n
from secret import flag

p = getPrime(256)
q = getPrime(256)
r = getPrime(256)
s = getPrime(256)
n = p ** 2 * q ** 3 * r ** 5 * s ** 7
e = 65537
c = pow(s2n(flag), e, n)
print(f"p = {p}")
print(f"q = {q}")
print(f"r = {r}")
print(f"s = {s}")
print(f"n = {n}")
print(f"e = {e}")
print(f"c = {c}")

p = 61789932148719477384027458333380568978056286136137829092952317307711908353477
q = 91207969353355763685633284378833506319794714507027332929290701748727534193861
r = 105471299607375388622347272479207944509670502835651250945203397530010861809367
s = 83153238748903772448138307505579799277162652151244477391465130504267171881437
n = 1039344372165087100001063920598151812324151064684841845250974758525265148567706103784958424873181721352440209284812493753972556519482026327282644619091466886523804841248277210353173383407944598453848113815866908595335619458549486958764490103808475329598085842184963065068499489886467911087295087163762599284622055185456905774507245781667293199205317692029829495961487347944813874415423771980660778986211145841712412631156369129146470119135136378158203459576596246169191419488560832734046076107673091995860021863239882608638458149930255944184863801278386551031980146460231515747754411678651752698881001464973981424240781413084941947261875289725538959720572496329348499870580057997540844488309111059240745081048324762866572948371222839278718034435739827677190025500802453626872356208612718417249649474571197167076916403582394186357812640566250930361276229969553128128312736245440129556020108188835966131425956431796417720436474093381770796431629523054378258497546013222494974549262140415585158985940966415459478150722832119691308697510189026447359189994055885090735411738332296254011208547676914004864732327863884217733456287369771087094514708468685641820375220835485053482570852619363091173324203334503461823983610886849930944250553928855506012684504211525542998575275626784129736345142772399109273619522445919
e = 65537
c = 844677395496466411520394190869787261209960246734415406217975986418865760680024542119231873259131861208878522030009923057991526761346423130242121884493257732067700857897379859545356609151834223804262174935191718271211809221730601602827122249238086030580971376104724987801049500689134122609834321586609223761140538079460830213824674361601046367637227094018381901291488659642720549583856812747877519600804325570421770575999289389175021646347371879234023647657507178519047236746071420327155188213839293382288787853777540226192644761028822256165706787395891134765908229036044468473519166141610604791485071702808854944672418124203289328124793348198048601338476086482318248264508789781967910205393740835345086784345145351367491197717933757414967811594913692588314161669333147733048171044386546892346475181197482702164468542430187885074163177843285948999943328049159021873821254267471067523609151007885131921896462161216356454116929796355815756642621369974260365378070336290542971599886325232821981080341858950609157813769416455337935096696635623426418166316737131174435618543058086342714723330814586496030805366321181723292731710369013923285787724941830672247377301048663929453294620044701627159066468762709113137517559435822623284148112827473010030736329596829357275518641576798298066541516764673029908084962144713

'''

from gmpy2 import *
from Cryptodome.Util.number import *
from gmpy2 import gmpy2
p = 61789932148719477384027458333380568978056286136137829092952317307711908353477
q = 91207969353355763685633284378833506319794714507027332929290701748727534193861
r = 105471299607375388622347272479207944509670502835651250945203397530010861809367
s = 83153238748903772448138307505579799277162652151244477391465130504267171881437
n = 1039344372165087100001063920598151812324151064684841845250974758525265148567706103784958424873181721352440209284812493753972556519482026327282644619091466886523804841248277210353173383407944598453848113815866908595335619458549486958764490103808475329598085842184963065068499489886467911087295087163762599284622055185456905774507245781667293199205317692029829495961487347944813874415423771980660778986211145841712412631156369129146470119135136378158203459576596246169191419488560832734046076107673091995860021863239882608638458149930255944184863801278386551031980146460231515747754411678651752698881001464973981424240781413084941947261875289725538959720572496329348499870580057997540844488309111059240745081048324762866572948371222839278718034435739827677190025500802453626872356208612718417249649474571197167076916403582394186357812640566250930361276229969553128128312736245440129556020108188835966131425956431796417720436474093381770796431629523054378258497546013222494974549262140415585158985940966415459478150722832119691308697510189026447359189994055885090735411738332296254011208547676914004864732327863884217733456287369771087094514708468685641820375220835485053482570852619363091173324203334503461823983610886849930944250553928855506012684504211525542998575275626784129736345142772399109273619522445919
e = 65537
c = 844677395496466411520394190869787261209960246734415406217975986418865760680024542119231873259131861208878522030009923057991526761346423130242121884493257732067700857897379859545356609151834223804262174935191718271211809221730601602827122249238086030580971376104724987801049500689134122609834321586609223761140538079460830213824674361601046367637227094018381901291488659642720549583856812747877519600804325570421770575999289389175021646347371879234023647657507178519047236746071420327155188213839293382288787853777540226192644761028822256165706787395891134765908229036044468473519166141610604791485071702808854944672418124203289328124793348198048601338476086482318248264508789781967910205393740835345086784345145351367491197717933757414967811594913692588314161669333147733048171044386546892346475181197482702164468542430187885074163177843285948999943328049159021873821254267471067523609151007885131921896462161216356454116929796355815756642621369974260365378070336290542971599886325232821981080341858950609157813769416455337935096696635623426418166316737131174435618543058086342714723330814586496030805366321181723292731710369013923285787724941830672247377301048663929453294620044701627159066468762709113137517559435822623284148112827473010030736329596829357275518641576798298066541516764673029908084962144713
phi = p ** (2 - 1) * (p - 1) * q ** 2 * (q - 1) * r ** 4 * (r - 1) * s ** 6 * (s - 1)
d = gmpy2.invert(e, phi)
m = pow(c,d,n)
print(long_to_bytes(m))

'''
在 RSA 加密算法中,n 是两个大质数 p 和 q 的乘积,而 phi(欧拉函数)是计算小于 n 的正整数中与 n 互质的数的个数。对于 n = p ** 2 * q ** 3 * r ** 5 * s ** 7 这样的形式,phi 的计算涉及到欧拉函数的性质,特别是当 n 是多个不同质数的幂的乘积时。
欧拉函数的定义是:对于任意正整数 n,phi(n) 是小于或等于 n 的正整数中与 n 互质的数的个数。如果 n 可以分解为质因数的乘积,即 n = p1 ** e1 * p2 ** e2 * ... * pk ** ek,那么 phi(n) 可以通过以下公式计算:
phi(n) = n * (1 - 1/p1) * (1 - 1/p2) * ... * (1 - 1/pk)
这个公式可以进一步简化为:
phi(n) = p1 ** (e1 - 1) * (p1 - 1) * p2 ** (e2 - 1) * (p2 - 1) * ... * pk ** (ek - 1) * (pk - 1)
对于给定的 n = p ** 2 * q ** 3 * r ** 5 * s ** 7,我们可以应用上述公式来计算 phi(n):
phi(n) = (p ** 2 * q ** 3 * r ** 5 * s ** 7) * (1 - 1/p) * (1 - 1/q) * (1 - 1/r) * (1 - 1/s)
简化后得到:
phi(n) = p ** 2 * (1 - 1/p) * q ** 3 * (1 - 1/q) * r ** 5 * (1 - 1/r) * s ** 7 * (1 - 1/s)
进一步简化,我们得到:
phi(n) = p ** 2 * (p - 1) * q ** 3 * (q - 1) * r ** 5 * (r - 1) * s ** 7 * (s - 1)
但是,我们需要注意到,每个质因数的指数在计算 phi(n) 时需要减去 1,因此最终的 phi(n) 应该是:
phi(n) = p ** (2 - 1) * (p - 1) * q ** (3 - 1) * (q - 1) * r ** (5 - 1) * (r - 1) * s ** (7 - 1) * (s - 1)
这解释了为什么 phi 的计算公式中每个质因数的指数都要减去 1。所以,正确的 phi(n) 计算应该是:
phi(n) = p ** 1 * (p - 1) * q ** 2 * (q - 1) * r ** 4 * (r - 1) * s ** 6 * (s - 1)
即:
phi(n) = p * (p - 1) * q ** 2 * (q - 1) * r ** 4 * (r - 1) * s ** 6 * (s - 1)
这个公式反映了欧拉函数在质因数分解形式下的计算规则。
'''

  • 5
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值