from Crypto.Util.number import * import gmpy2 from flag import flag
defgenerate(): p = getStrongPrime(2048) whileTrue: f = getRandomNBitInteger(1024) g = getStrongPrime(768) h = gmpy2.invert(f, p) * g % p return (p, f, g, h)
defencrypt(plaintext, p, h): m = bytes_to_long(plaintext) r = getRandomNBitInteger(1024) c = (r * h + m) % p return c
defGaussLatticeReduction(v1, v2): whileTrue: if v2.norm() < v1.norm(): v1, v2 = v2, v1 m = round( v1*v2 / v1.norm()^2 ) if m == 0: return (v1, v2) v2 = v2 - m*v1
1 2 3 4 5 6 7
h = ... p = ... v1 = vector(ZZ, [1,h]) v2 = vector(ZZ, [0,p]) f,g = GaussLatticeReduction(v1, v2)[0] print(f) print(g)
也可用sage自带的LLL算法求解
1 2 3 4 5 6
h = ... p = ... s = matrix([[1,h],[0,p]]) f,g = s.LLL()[0] print(f) print(g)
验证一下f和g的位数,与task一样,这样就得到了f和g
接下来求解明文就很好做了
exp
1 2 3 4 5 6 7 8 9 10 11 12 13 14
from Crypto.Util.number import *
h = 7257231567493321493497732423756001924698993879741072696808433246581786362611889417289029671240997843541696187487722285762633068287623369923457879458577466240950224087015909821079480431797917376609839097610864517760515986973340148901898582075413756737310797402537478388864632901178463429574227279668004092519322204990617969134092793157225082977967228366838748193084097651575835471869030934527383379794480007872562067799484905159381690179011192017159985260435844246766711550315143517066359521598424992244464723490166447105679062078049379153154659732304112563255058750656946353654402824529058734270363154894216317570784 p = 23969137365202547728693945383611572667294904799854243194734466236017441545927679469239814785947383727854265554138290421827510545078908517696536495567625593439996528098119344504866817224169113920532528233185011693829122447604993468817512696036673804626830507903206709121383065701222707251053362179946170981868061834734684494881504724254812067180384269711822738708203454131838741703416329765575995359232573740932069147491776326045743679105041246906081872936901848272288949389026129761726749334006319072981386763830897454245553866145620689939497868469730297795063648030738668273210516497399954626983672357236110363894081 c = 6388077150013017095358415295704360631706672647932184267739118115740221804173068089559645506533240372483689997499821300861865955720630884024099415936433339512125910973936154713306915269365877588850574948033131161679256849814325373882706559635563285860782658950169507940368219930971600522754831612134153314448445006958300840618894359885321144158064446236744722180819829183828290798747455324761671198097712539900569386477647697973195787663298318786718012522378981137877863153067057280649127202971806609339007027052518049995341356359016898069863799529357397514218249272201695539181908803360181347114492616706419618151757 s = matrix([[1,h],[0,p]]) f,g = s.LLL()[0] #print(f) #print(g) inv_f = inverse(f,g) a = c*f%p m = a*inv_f%g print(long_to_bytes(m)) #b'flag{c3bb1f88-2c0b-48fc-9902-beada6d50df6}'