from Crypto.Util.number import * from Crypto.Util.Padding import pad from Crypto.Cipher import AES import os N = 18795243691459931102679430418438577487182868999316355192329142792373332586982081116157618183340526639820832594356060100434223256500692328397325525717520080923556460823312550686675855168462443732972471029248411895298194999914208659844399140111591879226279321744653193556611846787451047972910648795242491084639500678558330667893360111323258122486680221135246164012614985963764584815966847653119900209852482555918436454431153882157632072409074334094233788430465032930223125694295658614266389920401471772802803071627375280742728932143483927710162457745102593163282789292008750587642545379046283071314559771249725541879213 c = 10533300439600777643268954021939765793377776034841545127500272060105769355397400380934565940944293911825384343828681859639313880125620499839918040578655561456321389174383085564588456624238888480505180939435564595727140532113029361282409382333574306251485795629774577583957179093609859781367901165327940565735323086825447814974110726030148323680609961403138324646232852291416574755593047121480956947869087939071823527722768175903469966103381291413103667682997447846635505884329254225027757330301667560501132286709888787328511645949099996122044170859558132933579900575094757359623257652088436229324185557055090878651740 print(p.bit_length())
p = gcd(N,c) assert N % p == 0 q = N // p
phi = (p-1)*(q-1) iv = b'\x91\x16\x04\xb9\xf0RJ\xdd\xf7}\x8cW\xe7n\x81\x8d' ciphertext = bytes.fromhex("bf87027bc63e69d3096365703a6d47b559e0364b1605092b6473ecde6babeff2") e = 3 d = inverse_mod(e,phi) key = pow(c,d,N) cipher = AES.new(key = long_to_bytes(key)[:16], iv = iv, mode = AES.MODE_CBC)
print(ciphertext) flag = cipher.decrypt(ciphertext) print(flag)
from random import randint from Crypto.Util.number import getPrime, inverse, long_to_bytes, bytes_to_long from math import gcd import signal from secret import flag
defgen_coprime_num(pbits): lbits = 2 * pbits + 8 lb = 2**lbits ub = 2**(lbits + 1) whileTrue: r = randint(lb, ub) s = randint(lb, ub) if gcd(r, s) == 1: return r, s
defmult_mod(A, B, p): result = [0] * (len(A) + len(B) - 1) for i inrange(len(A)): for j inrange(len(B)): result[i + j] = (result[i + j] + A[i] * B[j]) % p return result
defgen_key(p): f = [randint(1, 2**128) for i in":)"] h = [randint(1, 2**128) for i in":("] R1, S1 = gen_coprime_num(p.bit_length()) R2, S2 = gen_coprime_num(p.bit_length())
B = [[randint(1, p - 1) for i in":("] for j in":)"]
P = [] for b in B: P.append(mult_mod(f, b, p)) Q = [] for b in B: Q.append(mult_mod(h, b, p))
for i inrange(len(P)): for j inrange(len(P[i])): P[i][j] = P[i][j] * R1 % S1 Q[i][j] = Q[i][j] * R2 % S2
sk = [(R1, S1), (R2, S2), f, h, p] pk = [P, Q, p]
return sk, pk
defencrypt(pk, pt): P, Q, p = pk pt = bytes_to_long(pt)
PP = 0 QQ = 0
for i inrange(len(P)): u = randint(1, p) for j inrange(len(P[0])): PP = PP + P[i][j] * (u * pt**j % p) QQ = QQ + Q[i][j] * (u * pt**j % p)
return PP, QQ
defdecrypt(sk, ct): RS1, RS2, f, h, p = sk R1, S1 = RS1 R2, S2 = RS2
P, Q = ct invR1 = inverse(R1, S1) invR2 = inverse(R2, S2) P = (P * invR1 % S1) % p Q = (Q * invR2 % S2) % p
f0q = f[0] * Q % p f1q = f[1] * Q % p h0p = h[0] * P % p h1p = h[1] * P % p
from sage.allimport * from sage.misc import prandom import random from Crypto.Cipher import AES from Crypto.Hash import SHA256 from Crypto.Util.Padding import pad
q = 1342261 n = 1031 PR = PolynomialRing(Zmod(q), "x") x = PR.gens()[0] Q = PR.quotient(x**n + 1) flag = b"flag{*****************************}"
defGenNTRU(): f = [sample(prandom) for _ inrange(n)] g1 = [sample(prandom)for _ inrange(n)] g2 = [sample(prandom) for _ inrange(n)] g1x = Q(g1) g2x = Q(g2)
whileTrue: fx = Q(f) try: h1 = g1x / fx h2 = g2x / fx return (h1.lift(), h2.lift(), fx) except: prandom.shuffle(f) continue
for _ inrange(20259): c = int(input("c :")) if c == 1: coin = random.getrandbits(1) if coin == 0: pk1, pk2, fx = GenNTRU() else: pk1, pk2, fx = Q.random_element().lift(), Q.random_element().lift(), Q([sample(prandom) for _ inrange(n)])