记一道rsa题目

Crypto-Continued_fraction

from Crypto.Util.number import *
from random import *
from gmpy2 import *

m1 = bytes_to_long("flag{**********")
m2 = bytes_to_long("***************}")
e = 0x10001
p1=getPrime(512)
q1=getPrime(512)
n1 = p1*p1*p1*p1*p1*q1
p2 = getPrime(512)
hint= p1//(2022*q1*p2)+1
q2 = randint(p1,p1+hint)
assert isPrime(p2)
n2 = p2*q2*q2*q2*q2*q2
c1 = pow(m1,e,n1)
c2 = pow(m2,e,n2)
print("n1=",n1)
print("n2=",n2)
print("c1=",c1)
print("c2=",c2)

# n1= 1256153302556722997835679485829871808209901877944658368294633380086039408209637188283648561974710208562420741204863668125373241516909427306739638768582394391661155157329008815783003303268567732455689976681585719180341791879262235261804780291172646163735569766134496283369776876010433765550597807557716740369078630640629164056123730434939865702582297649206877992510218914493158109915659245977470879976045951953520845428717845238737381501004186574867828363490038297060142964599736049326285646322631112277122289112238935311758549326725559220188899102270828155680789659302591782729536182848762707696215273010646878701028580606341865318406958340196626036013889917779504807663048327842005146211390991643204265514403828323182286983607461509750859161392868951803250718502430595154630844863204136754825203448059235932426723373812958290492927375792457551041464503622981270187813181683705800678105184791224152356667342466450291837456587
# n2= 1197629325190380699374154128374513283820240508821461857430115674113727047293237281127074814227816406157740605135583333664729226869731385678693946183795222888181174575584200136367082503497480853823603769374075912819200587854120171575320112658694639845299676212762187920588396645028444278961588563075638955700989205301920429678357303440841144388921662935109491390033220158222065055652765734940667449637287741783098057517927165840885201990788219503352883314434530198352746142587272387252244739608996358591480242676653170679025554434143849593378462666666170040113198957024953263969979014590685909232969322886865119889612277827254420993904268068435829747543789521624579459660937906125103686937705250459042164404148908258218791466046423503711451547418585736801420769503175880623550310687599137930182497726859069348327075914150715506160538909443106998347917970480446556323094447246836747858707877134905173088467627177471146007736151
# c1= 710845091991380398216733721136006610592361788281046186261035950037696217252772309636540595252970682415638821035841466715754193881889268349770256847384533983912090666113165051957000028445124008234754655483172991257455376698273597295387435177431393496727377669078123014921967229546948512850153154166917157214759642269095531059598553219933340611301435705789734492306061610484209802196003736971810343461147514065523053359050432167293160868787410237387773846812863726670073486411431153915974221516020391498225902044063154073376200149464330453779255307791427795875714926161867582865251039794826304784702200285042718132987075989800363840046234226462240868543848175515291308226485111148056917266096447904592049099343281153836801550057200313222715169887695344170991444392677916450669200736012573310517480306758906791894339130601070145644206868468136454802614730303611168948732160506857860402524079990545547132285627192616806826557659
# c2= 959929824904302382508256979575806109456109034082616678508805089752064096628321793755590498187546754016348420961126246759336272607268291539261105914867584865671365073841993655285982578504150594298539791983556623535143932992954854215754290410196632233122178986613155112548093812638003840310021222831173523233364933633880955497544863238028608030446260699865778686716591585732609156361965222181105410174461025274430633046335469336805793373049590852037241172659827772256553878369747571483117225549884952570363769952655850924935263917370199574057017569476640230750349696998312231326117417428910508978870672118868211788201212157079178900589193313672154891235102585084722764273685429942398646356615174972323634859894915491250334836758611460436222121570938096566286002320990662210681239221116433991294979485366413009059963907062122364841265702664453389772337092732514892753045076150215244712614921937632928299144562324398499337380405

这是题目

这一段代码其实很好懂,明文为flag{***}的形式,分为两段加密,往下看可以发现,两段的加密方式其实是完全相同的,也就是说,只要解出各自的pq可以得到答案,而解pq的方式其实也是一样的。 

分析:

对于一段代码,用函数获得512位的随机质数作为pq

p1=getPrime(512)
q1=getPrime(512)

通过下面的公式算出特殊的n值

n1 = p1*p1*p1*p1*p1*q1
n2 = p2*q2*q2*q2*q2*q2

然后得到密文

打印出密文,加密就完成了

题目最后还给了n1的数值。

这次我在网上没有找到完全一样的题目,此题最大的特点就是对n的非常规算法,而我在总结的时候有一点证明不了的就是在n为这样的形式下,欧拉定理是否还成立。要知道rsa密码的基础就是欧拉定理和欧拉函数,而且我在一道类似的题目上看到了别人做题完全不考虑这个方面的问题,在求出pq后就当做普通的rsa直接做掉了。而我在比赛的时候也没想着去证明ta,比赛之后大脑退化啥都想不出来,在这里挖个坑说不定上大学后哪天就会证了。在这里先用别的替代一下:

绿城杯2021 Crypto writeups_M@ku1i的博客-CSDN博客

原本说不贴链接的,但是想想为了提高wp的说服力,我还是贴一个看吧。这里面rsa2-plus也是两段加密的,其中第二段的加密就是和这道题类似的算法,但是n的组成不完全相同,这算不算举例论证?

解题 

接着就是想办法计算两组pq。

首先看到题目里面有一个hint变量

根据我2天做题以来的经验,这个变量绝对有问题。

而且在大数分解(yafu or factordb)对两个n不起作用的情况下,必然会有一些非常规的方法让我们得到pq,而看到hint的计算式,我的第一反应就是这个数应该很小吧,后来经过我的反复推算确实如此。如果你还是不相信可以把代码截出来自己跑着玩一玩:

(这里把randint(,)函数下的p2改成了0,更加直观地显示出这个函数的作用,多次运行证明了ta上下限都可以取到的事实)

from Crypto.Util.number import *
from random import *
from gmpy2 import *

p1=getPrime(512)
q1=getPrime(512)
p2 = getPrime(512)
hint= p1//(2022*q1*p2)+1
q2 = randint(0,0+hint)


print(hint)
print(q2)

我们可以接着看,q2的大小要不和p1相等,要不比p1大1.

然而分析一下奇偶,n是奇数,一个大质数肯定也是奇数,那么q2的大小只能和p1一样了。我们设q2=p1=a

可知:n1=q1*a^5,   n2=p2*a^5
因为q1p2都是质数,所以a^5就是n1和n2的最大公约数,这个可以通过一个函数算出来

q5=gcd(n1,n2)

(这些函数都需要一些库的支持)

之后分别计算两组pq就很简单了,然后按照常规rsa的题目做就可以了

下面是整个做题脚本。

from gmpy2 import *
from Crypto.Util.number import *
#p1=q2=q
n1= 1256153302556722997835679485829871808209901877944658368294633380086039408209637188283648561974710208562420741204863668125373241516909427306739638768582394391661155157329008815783003303268567732455689976681585719180341791879262235261804780291172646163735569766134496283369776876010433765550597807557716740369078630640629164056123730434939865702582297649206877992510218914493158109915659245977470879976045951953520845428717845238737381501004186574867828363490038297060142964599736049326285646322631112277122289112238935311758549326725559220188899102270828155680789659302591782729536182848762707696215273010646878701028580606341865318406958340196626036013889917779504807663048327842005146211390991643204265514403828323182286983607461509750859161392868951803250718502430595154630844863204136754825203448059235932426723373812958290492927375792457551041464503622981270187813181683705800678105184791224152356667342466450291837456587
n2= 1197629325190380699374154128374513283820240508821461857430115674113727047293237281127074814227816406157740605135583333664729226869731385678693946183795222888181174575584200136367082503497480853823603769374075912819200587854120171575320112658694639845299676212762187920588396645028444278961588563075638955700989205301920429678357303440841144388921662935109491390033220158222065055652765734940667449637287741783098057517927165840885201990788219503352883314434530198352746142587272387252244739608996358591480242676653170679025554434143849593378462666666170040113198957024953263969979014590685909232969322886865119889612277827254420993904268068435829747543789521624579459660937906125103686937705250459042164404148908258218791466046423503711451547418585736801420769503175880623550310687599137930182497726859069348327075914150715506160538909443106998347917970480446556323094447246836747858707877134905173088467627177471146007736151
c1= 710845091991380398216733721136006610592361788281046186261035950037696217252772309636540595252970682415638821035841466715754193881889268349770256847384533983912090666113165051957000028445124008234754655483172991257455376698273597295387435177431393496727377669078123014921967229546948512850153154166917157214759642269095531059598553219933340611301435705789734492306061610484209802196003736971810343461147514065523053359050432167293160868787410237387773846812863726670073486411431153915974221516020391498225902044063154073376200149464330453779255307791427795875714926161867582865251039794826304784702200285042718132987075989800363840046234226462240868543848175515291308226485111148056917266096447904592049099343281153836801550057200313222715169887695344170991444392677916450669200736012573310517480306758906791894339130601070145644206868468136454802614730303611168948732160506857860402524079990545547132285627192616806826557659
c2= 959929824904302382508256979575806109456109034082616678508805089752064096628321793755590498187546754016348420961126246759336272607268291539261105914867584865671365073841993655285982578504150594298539791983556623535143932992954854215754290410196632233122178986613155112548093812638003840310021222831173523233364933633880955497544863238028608030446260699865778686716591585732609156361965222181105410174461025274430633046335469336805793373049590852037241172659827772256553878369747571483117225549884952570363769952655850924935263917370199574057017569476640230750349696998312231326117417428910508978870672118868211788201212157079178900589193313672154891235102585084722764273685429942398646356615174972323634859894915491250334836758611460436222121570938096566286002320990662210681239221116433991294979485366413009059963907062122364841265702664453389772337092732514892753045076150215244712614921937632928299144562324398499337380405
q5=gcd(n1,n2)
e = 0x10001
q=gmpy2.iroot(q5,5)[0]
#print(q)
q1=n1//q5
p2=n2//q5
fn1=(q-1)*(q1-1)*q*q*q*q
fn2=(q-1)*(p2-1)*q*q*q*q
#fn1=mpz(fn1)
#fn2=mpz(fn2)

d1 = int(gmpy2.invert(mpz(e),mpz(fn1)))
d2 = int(gmpy2.invert(mpz(e),mpz(fn2)))
m1 = pow(c1,d1,n1)
m2 = pow(c2,d2,n2)
#print(m1)
print(long_to_bytes(m1),end='')
print(long_to_bytes(m2))

运行得到结果:

最后说一个萌新容易出现的问题:

在密码学这种大数计算的时候,常常不需要用到小数。

做除法的时候一定要用整除符号"//"而不是普通的除号"/"

前者可以输出整数而后者输出浮点数,会导致后面的转换出现问题。

我就扑街了。

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值