''' p = 170990541130074930801165526479429022133700799973347532191727614846803741888876816210632483231997413973919037199883422312436314365293577997262903161076615619596783971730864586404602951191341733308807254112018161897113881363794353050758324742415299277578203838160939521046655099610387485947145087271531951477031 h = 19027613518333504891337723135627869008620752060390603647368919831595397216728378486716291001290575802095059192000315493444659485043387076261350378464749849058547797538347059869865169867814094180939070464336693973680444770599657132264558273692580535803622882040948521678860110391309880528478220088107038861065 c = 75639016590286995205676932417759002029770539425113355588948888258962338419567264292295302442895077764630601149285564849867773180066274580635377957966186472159256462169691456995594496690536094824570820527164224000505303071962872595619159691416247971024761571538057932032549611221598273371855762399417419551483 '''
b = c = n = len(b) L = Matrix(ZZ,n+1,n+1) for i inrange(n): L[i,i] = 1 L[i,-1] = b[i] L[-1,-1] = -c res = L.LLL() for j inrange(n+1): M = res.row(j).list() flag = True for m in M: if m!=0and m!=1: flag = False break if flag: print(j) print(M) flag = ''.join(str(bit) for bit in M[:-1]) print(long_to_bytes(int(flag, 2)))
需要注意的是,恢复flag的时候需要将得到的小基向量的最后一列值去掉
3.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
from Crypto.Util.number import * import random
flag = b'******' m = bytes_to_long(flag)
a = getPrime(1024) b = getPrime(1536)
p = getPrime(512) q = getPrime(512) r = random.randint(2**14, 2**15) assert ((p-r) * a + q) % b < 50
from Crypto.Util.number import * from gmpy2 import *
flag = b'******' flag = bytes_to_long(flag)
p = getPrime(1024) r = getPrime(175) a = inverse(r, p) a = (a*flag) % p
print(f'a = {a}') print(f'p = {p}')
这道题比较简单,进行简单推导:
于是构造格:
预期的小基向量是(r,m),此处大小设置合理,满足hermite定理
1 2 3 4 5 6 7 8 9
from Crypto.Util.number import *
a = 79047880584807269054505204752966875903807058486141783766561521134845058071995038638934174701175782152417081883728635655442964823110171015637136681101856684888576194849310180873104729087883030291173114003115983405311162152717385429179852150760696213217464522070759438318396222163013306629318041233934326478247 p = 90596199661954314748094754376367411728681431234103196427120607507149461190520498120433570647077910673128371876546100672985278698226714483847201363857703757534255187784953078548908192496602029047268538065300238964884068500561488409356401505220814317044301436585177722826939067622852763442884505234084274439591
ge=Matrix(ZZ,[[1,a],[0,p]]) tg=ge.LLL()[0].list() tg=[abs(i) for i in tg] print(long_to_bytes(tg[1]))
''' a = 92716521851427599147343828266552451834533034815416003395170301819889384044273026852184291232938197215198124164263722270347104189412921224361134013717269051168246275213624264313794650441268405062046423740836145678559969020294978939553573428334198212792931759368218132978344815862506799287082760307048309578592 b = 155530728639099361922541063573602659584927544589739208888076194504495146661257751801481540924821292656785953391450218803112838556107960071792826902126414012831375547340056667753587086997958522683688746248661290255381342148052513971774612583235459904652002495564523557637169529882928308821019659377248151898663 p = 100910862834849216140965884888425432690937357792742349763319405418823395997406883138893618605587754336982681610768197845792843123785451070312818388494074168909379627989079148880913190854232917854414913847526564520719350308494462584771237445179797367179905414074344416047541423116739621805238556845903951985783 '''
推导:
根据题目给出的数的大小,我们尽量将m,c这类小数字放在规约后的基向量中,因此构造格:
这样得到的基向量为(1,m,c)显然维度不均衡,进行配平:
1 2 3 4 5 6 7 8 9
from Crypto.Util.number import *
a = 92716521851427599147343828266552451834533034815416003395170301819889384044273026852184291232938197215198124164263722270347104189412921224361134013717269051168246275213624264313794650441268405062046423740836145678559969020294978939553573428334198212792931759368218132978344815862506799287082760307048309578592 b = 155530728639099361922541063573602659584927544589739208888076194504495146661257751801481540924821292656785953391450218803112838556107960071792826902126414012831375547340056667753587086997958522683688746248661290255381342148052513971774612583235459904652002495564523557637169529882928308821019659377248151898663 p = 100910862834849216140965884888425432690937357792742349763319405418823395997406883138893618605587754336982681610768197845792843123785451070312818388494074168909379627989079148880913190854232917854414913847526564520719350308494462584771237445179797367179905414074344416047541423116739621805238556845903951985783
flag = b'******' flag = bytes_to_long(flag) d = getPrime(400)
for i inrange(4): p = getPrime(512) q = getPrime(512) n = p * q e = inverse(d, (p-1)*(q-1)) c = pow(flag, e, n) print(f'e{i} =', e) print(f'n{i} =', n) print(f'c{i} =', c)
p = getPrime(512) q = getPrime(512) n = p * q c = pow(flag, 65537, n) print(f'n =', n) print(f'c =', c) for i inrange(2): d = getPrime(350) e = inverse(d, (p-1)*(q-1)) print(f'e{i} =', e)
ge=Matrix(ZZ,5,5) for i inrange(3): ge[i,i]=2**(32*i) ge[i,-2]=a[i] ge[-1,-1]=2**128 ge[-2,-2]=-p ge[-1,-2]=c
tg=ge.LLL() for row in tg: if(abs(row[-1]))==2**128: ls=row.list() print(ls) break ls=[abs(i) for i in ls] s=1 for i in ls[:3]: s*=i p=gmpy2.iroot(s//(2**96),3)[0] print(p) flag=flag//p print(long_to_bytes(flag))