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反解的一个结合,如果不熟悉知识点的建议先看下以下两篇:
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))