defbackpack_encrypt_flag(flag_bytes, M, group_len): bits = [] for byte in flag_bytes: bits.extend([int(b) for b informat(byte, "08b")])
whilelen(bits) % group_len != 0: bits.append(0)
S_list = [] for i inrange(0, len(bits), group_len): group = bits[i:i + group_len] S = sum(bit * m for bit, m inzip(group, M)) S_list.append(S) return S_list
defbackpack(flag_bytes): R = [10] whilelen(R) < 8: next_val = randint(2 * R[-1], 3 * R[-1]) R.append(next_val) B = randint(2 * R[-1] + 1, 3 * R[-1]) A = getPrime(100) M = [A * ri % B for ri in R] S_list = backpack_encrypt_flag(flag_bytes, M, len(M)) return R, A, B, M, S_list
p = getPrime(512) q = getPrime(512) n = p*q e = 0x10000 m = bytes_to_long(flag1) k = randint(1, 999) problem1 = (pow(p,e,n)-pow(q,e,n)) % n problem2 = pow(p-q,e,n)*pow(e,k,n) c = pow(m,e,n)
R, A, B, M, S_list = backpack(flag2)
withopen(r"C:\Users\Rebirth\Desktop\data.txt", "w") as f: f.write(f"problem1 = {problem1}\n") f.write(f"problem2 = {problem2}\n") f.write(f"n = {n}\n") f.write(f"c = {c}\n") f.write("-------------------------\n") f.write(f"R = {R}\n") f.write(f"A = {A}\n") f.write(f"B = {B}\n") f.write(f"M = {M}\n") f.write(f"S_list = {S_list}\n") f.write("-------------------------\n") f.write(f"What you need to submit is Flags!\n")
part1
RSA,题目给出的是
p1=(pe−qe)modn
p2=(p−q)emodn∗ekmodn
这里我们的思路是枚举k的取值,计算出pow(e,k,n)之后用p2来除它,得到P,那么由二项式定理
ekmodnp2=P=(p−q)emodn=pe+qemodn
上下相加,容易得到
p1+P=2pemodn
p=gcd(p1+P,n)
同样的方法我们也能枚举出q,再用位数和正负号作为制约就能爆破出p,q的值,脚本如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
problem1 = 24819077530766367166035941051823834496451802693325219476153953490742162231345380863781267094224914358021972805811737102184859249919313532073566493054398702269142565372985584818560322911207851760003915310535736092154713396343146403645986926080307669092998175883480679019195392639696872929250699367519967334248 problem2 = 20047847761237831029338089120460407946040166929398007572321747488189673799484690384806832406317298893135216999267808940360773991216254295946086409441877930687132524014042802810607804699235064733393301861594858928571425025486900981252230771735969897010173299098677357738890813870488373321839371734457780977243838253195895485537023584305192701526016 n = 86262122894918669428795269753754618836562727502569381672630582848166228286806362453183099819771689423205156909662196526762880078792845161061353312693752568577607175166060900619163231849790003982326663277243409696279313372337685740601191870965951317590823292785776887874472943335746122798330609540525922467021 c = 74962027356320017542746842438347279031419999636985213695851878703229715143667648659071242394028952959096683055640906478244974899784491598741415530787571499313545501736858104610426804890565497123850685161829628373760791083545457573498600656412030353579510452843445377415943924958414311373173951242344875240776 e=65536
for i inrange(1,1000): k = pow(e,i,n) Pr2 = problem2//k # print(isinstance(Pr2,int)) sum = problem1+Pr2 sub = Pr2 - problem1 if sub>0 : q = GCD(sub,n) print(q) # 爆破p q #p = 9586253455468582613875015189854230646329578628731744411408644831684238720919107792959420247980417763684885397749546095133107188260274536708721056484419031 #q = 8998523072192453101232205847855618180700579235012899613083663121402246420191771909612939404791268078655630846054784775118256720627970477420936836352759291
from Crypto.Util.number import * from math import gcd from sage.allimport *
# 给定参数 p = 9586253455468582613875015189854230646329578628731744411408644831684238720919107792959420247980417763684885397749546095133107188260274536708721056484419031 q = 8998523072192453101232205847855618180700579235012899613083663121402246420191771909612939404791268078655630846054784775118256720627970477420936836352759291 n = p * q e = 65536 c = 74962027356320017542746842438347279031419999636985213695851878703229715143667648659071242394028952959096683055640906478244974899784491598741415530787571499313545501736858104610426804890565497123850685161829628373760791083545457573498600656412030353579510452843445377415943924958414311373173951242344875240776 possible_m = [] defdecrypt_rsa_with_coprime_e(p, q, e, c): # 计算模p和模q的c值 c_p = c % p c_q = c % q
#t.sage import random from sympy import nextprime defpart1(): p = random_prime(2^512, 2^513) a = random.randint(0, p-1) b = random.randint(0, p-1) while (4 * a**3 + 27 * b**2) % p == 0: a = random.randint(0, p-1) b = random.randint(0, p-1)
E = EllipticCurve(GF(p), [a, b])#构造一个模p环下的关于a,b的椭圆曲线
P=E.random_point()#曲线上的随机一个点
n = [random.randint(1, 2**20) for _ inrange(3)] #随机的一个点 assert part1=''.join([hex(i)[2:] for i in n]) cipher = [n[i] * P for i inrange(3)]
print(f"N = {p}") print(f"a = {a}, b = {b}") print(f"P = {P}") for i inrange(3): print(f"cipher{i} = {cipher[i]}") # CRT
defpart2(): p = 839252355769732556552066312852886325703283133710701931092148932185749211043 a = 166868889451291853349533652847942310373752202024350091562181659031084638450 b = 168504858955716283284333002385667234985259576554000582655928538041193311381 P = E.random_point() Q = key*P print("p = ",p) print("a = ",a) print("b = ",b) print("P = ",P) print("Q = ",Q) assert part2=key part1() print("-------------------------------------------") part2() assert flag="flag{"+str(part1)+"-"+str(part2)+"}"
from sage.allimport * from Crypto.Util.number import * n = 8186762541745429544201163537921168767557829030115874801599552603320381728161178278432652391299286759969365150578265902315058515370390070500719061057476940 print(n.bit_length()) # 2*2*5*11*499*683*124696170958113532210068667*875618937758378886905025632349007870524674918888468835522805095350653442872611049093102429356717528012933133846029979343 # 椭圆曲线参数 p = 8186762541745429544201163537921168767557829030115874801599552603320381728161132002130533050721684554609459754424458805702284922582219134865036743485620797 a = 1495420997701481377470828570661032998514190598989197201754979317255564287604311958150666812378959018880028977121896929545639701195491870774156958755735447 b = 5991466901412408757938889677965118882508317970919705053385317474407117921506012065861844241307270755999163280442524251782766457119443496954015171881396147 E = EllipticCurve(GF(p), [a, b])
# 生成元和密文点 P = E( 6053058761132539206566092359337778642106843252217768817197593657660613775577674830119685211727923302909194735842939382758409841779476679807381619373546323, 7059796954840479182074296506322819844555365317950589431690683736872390418673951275875742138479119268529134101923865062199776716582160225918885119415223226 )
defpohlig_hellman(P, Q, primes): dlogs = [] for fac in primes: t = P.order() // fac PP = t * P QQ = t * Q dlog = PP.discrete_log(QQ) # 自动选择最佳算法 dlogs.append(dlog) print(f"Factor: {fac}, Discrete Log: {dlog}") return crt(dlogs, primes)