crypto_combination2022(rsa综合)

rsa解密综合题,题目如下:

from Crypto.Util.number import *
import gmpy2
flag = b'xxxxx'

plaintext = bytes_to_long(flag)
length = plaintext.bit_length()

a = getPrime(length)
b = getPrime(length)
nn = getPrime(length)
seed = getPrime(length)
p = getStrongPrime(1024)
q = gmpy2.next_prime(p ^ ((1<<1024)-1))
n = p * q
e = 65537

print("seed = ",seed)
print('n = ',n)
print("a = ",a)
print("b = ",b)
print("nn = ",nn)

m = int.from_bytes(flag, 'big')
assert m < n
c = pow(m, e, n)
for i in range(33):
    seed = (a*seed+b)%nn
    ciphertext = seed^c

print("ciphertext = ",ciphertext)









'''
seed =  2616968545391898932804595821594394065310086698023659783597521792322662901998619153134735613563
n =  5319028255091513775959775806779648711361750251611282980054059887643921656051909168114973572160198795209585462159405717054229926361076914423691116263140687320327909280079754926705606179485234890596754483568397896142069115175034085033065341416906680615887795302475434843434965325025271093514686081319826403262257474936696659627113196550306411192618745254317682179909027384501440568694903574451252546200928935108247236250298066266514614301482402416570825057309154750684521345883570732140530048687181793278727367577126715041638027682617958676568454154353488518566363231442102123526611720744980608045603391671950243354971
a =  3072360956045853767112457740327196095216567286922346423750617621380625434950398248270559164787
b =  3514225395737121797289327791072417091104636264043913703609606268543254988843457009610171852761
nn =  2635041022398997829758206181157709368481479724578556902424407883884728998186575027294489633689
ciphertext =  4748905705103389567527701054671768871313228294736521449607450301540949814375449880096486766115435042996078525405037962422424369865343932282661030213018963382263447644809123266247239391868131868324585995923053987599877739361123259727972448340439258856833372459999054246995859168807193244324397372314101797234724329111045187328886815613523419175996173869083331788115369150871738788297123797684498720454470508828972873080376660197034782299565424481165642561014363072014243701630122638285021547699337952267285872527131272165569007324520629545252032851577019535228790279569024436573026602724087653372132769565474606806034
'''

实际上就是rsa已知高位攻击加LCG反解的一个结合,如果不熟悉知识点的建议先看下以下两篇:

ctf之lcg算法_小健健健的博客-CSDN博客

Anti-Fermat(来自zer0pts CTF 2022)_山猪儿烦不得的博客-CSDN博客

sage解密脚本如下:

from Crypto.Util.number import *
import gmpy2
n = 5319028255091513775959775806779648711361750251611282980054059887643921656051909168114973572160198795209585462159405717054229926361076914423691116263140687320327909280079754926705606179485234890596754483568397896142069115175034085033065341416906680615887795302475434843434965325025271093514686081319826403262257474936696659627113196550306411192618745254317682179909027384501440568694903574451252546200928935108247236250298066266514614301482402416570825057309154750684521345883570732140530048687181793278727367577126715041638027682617958676568454154353488518566363231442102123526611720744980608045603391671950243354971
e=65537
t1=1<<1024
p=(2**1024+gmpy2.iroot((2**1024)**2-4*n,2)[0])//2
p=int(p)
print(p)

P.<x>=PolynomialRing(Zmod(n))  #对p进一步爆破
for i in range(1,100):
    f=x+ZZ(((p>>i)<<i))      #注意加上整数环ZZ,因为x是个环内的数,不然会报错,不信你可以试试
    root=f.small_roots(X=2^i,beta=0.4)
    if root!=[]:
        p=root[0]+ZZ(((p>>i)<<i))
        break
print(p)

q=ZZ(n)//ZZ(p)

#142422483713178404259903210997960200106776069896596417500118465579369680933307132333240197823745020536403390237638695295502609604281497353296735919836118407576945213965778704787147274616297718891326096616493611384063382897269594485379119365873607498667457648663206931927441850319360106129522548333900880390099
#37346829773053186513027308080942273255021627997634239773311615578362994872193830799468279498662515484716723642232698062156180164532919269196111510803355716800822679459086780489154944984948375228126986335591394384774767785072868396094793744667219738495892862021379366312505395619119610175312807995723343747929

#LCG
#seed =  2616968545391898932804595821594394065310086698023659783597521792322662901998619153134735613563
#a =  3072360956045853767112457740327196095216567286922346423750617621380625434950398248270559164787
#b =  3514225395737121797289327791072417091104636264043913703609606268543254988843457009610171852761
#nn =  2635041022398997829758206181157709368481479724578556902424407883884728998186575027294489633689

#MMI = lambda A, n,s=1,t=0,N=0: (n < 2 and t%N or MMI(n, A%n, t, s-A//n*t, N or n),-1)[n<1] #逆元计算
#ani=MMI(a,nn) 
#for i in range(33):
#    seed = (ani*(seed-b))%nn
#oriseed
#print(seed)

seed =  2616968545391898932804595821594394065310086698023659783597521792322662901998619153134735613563
a =  3072360956045853767112457740327196095216567286922346423750617621380625434950398248270559164787
b =  3514225395737121797289327791072417091104636264043913703609606268543254988843457009610171852761
nn =  2635041022398997829758206181157709368481479724578556902424407883884728998186575027294489633689

for i in range(33):
    seed = (a*seed+b)%nn

ciphertext =  4748905705103389567527701054671768871313228294736521449607450301540949814375449880096486766115435042996078525405037962422424369865343932282661030213018963382263447644809123266247239391868131868324585995923053987599877739361123259727972448340439258856833372459999054246995859168807193244324397372314101797234724329111045187328886815613523419175996173869083331788115369150871738788297123797684498720454470508828972873080376660197034782299565424481165642561014363072014243701630122638285021547699337952267285872527131272165569007324520629545252032851577019535228790279569024436573026602724087653372132769565474606806034
c=ciphertext^^seed

phi=ZZ((p-1)*(q-1))
d=gmpy2.invert(e,phi)
m=ZZ(pow(c,d,n))
print(m)

assert m < n
print(long_to_bytes(m))

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值