From 1d407cc85ed25d4e47eadcda5a618daf1ba55613 Mon Sep 17 00:00:00 2001 From: Mats Heggelund Date: Sat, 17 Jan 2026 20:41:44 +0100 Subject: [PATCH] Add NNSCTF 2025 Origami --- NNSCTF2025_Origami/description.yml | 9 ++++ NNSCTF2025_Origami/release_files/output.txt | 2 + NNSCTF2025_Origami/release_files/source.sage | 46 ++++++++++++++++++++ 3 files changed, 57 insertions(+) create mode 100644 NNSCTF2025_Origami/description.yml create mode 100644 NNSCTF2025_Origami/release_files/output.txt create mode 100644 NNSCTF2025_Origami/release_files/source.sage diff --git a/NNSCTF2025_Origami/description.yml b/NNSCTF2025_Origami/description.yml new file mode 100644 index 0000000..9aa2a8f --- /dev/null +++ b/NNSCTF2025_Origami/description.yml @@ -0,0 +1,9 @@ +name: Origami +authors: + - Zukane +original_ctf: NNS CTF 2025 +year: 2025 +description: >- + Origami is a ntruly marvellous artform +base64_flag: Tk5Te2szM3BfZjBsZDFuZ180bmRfZjBsZDFuZ19sMWszXzRuXzByMWc0bTFfbTRzdDNyfQ== +flag_format: 'NNS{FLAG}' \ No newline at end of file diff --git a/NNSCTF2025_Origami/release_files/output.txt b/NNSCTF2025_Origami/release_files/output.txt new file mode 100644 index 0000000..5aed3a4 --- /dev/null +++ b/NNSCTF2025_Origami/release_files/output.txt @@ -0,0 +1,2 @@ +pk = [126, 74, 108, 97, 86, 46, 112, 34, 101, 40, 119, 70, 112, 77, 71, 15, 77, 30, 102, 93, 64, 22, 1, 119, 35, 67, 70, 54, 45, 116, 67, 53, 55, 53, 6, 46, 72, 116, 113, 32, 55, 56, 83, 32, 10, 52, 77, 94, 61, 18, 99, 55, 65, 80, 13, 38, 17, 104, 88, 115, 24, 60, 1, 31, 65, 105, 120, 37, 91, 29, 113, 9, 108, 115, 66, 16, 33, 77, 40, 22, 122, 74, 18, 63, 6, 17, 124, 110, 71, 93, 106, 74, 25, 108, 24, 119, 96, 117, 10, 78, 65, 64, 115, 59, 3, 110, 39, 64, 93, 123, 88, 95, 48, 34, 86, 12, 82, 67, 117, 118, 90, 107, 12, 17, 102, 52, 0, 16, 71, 2, 26, 26, 43, 55, 113, 63, 15, 27, 48, 90, 115, 16, 25, 126, 104, 28, 12, 90, 108, 20, 108, 46, 45, 101, 88, 4, 126, 115, 32, 0, 72, 6, 5, 112, 14, 49, 58, 64, 21, 64, 90, 79, 96, 90, 71, 35, 3, 77, 5, 27, 72, 69, 70, 87, 38, 98, 46, 51, 15, 78, 90, 13, 14, 56, 120, 74, 59, 95, 56, 96, 52, 69, 45, 33, 82, 44, 111, 90, 105, 45, 45, 17, 111, 9, 58, 19, 106, 30, 66, 119, 95, 50, 21, 104, 10, 103, 93, 47, 109, 16, 5, 67, 98, 126, 13, 2, 105, 121, 40, 108, 91, 111, 96, 86, 41, 98, 10, 34, 114, 33, 15, 53, 121, 4, 115, 47] +ct = [89, 49, 11, 57, 106, 101, 122, 57, 34, 67, 63, 35, 21, 72, 84, 23, 65, 4, 91, 79, 51, 86, 68, 94, 81, 50, 102, 8, 18, 64, 28, 7, 69, 91, 82, 13, 2, 17, 29, 12, 88, 81, 98, 26, 94, 102, 18, 94, 82, 30, 79, 118, 55, 41, 101, 109, 44, 78, 124, 118, 9, 79, 110, 94, 75, 62, 52, 116, 46, 13, 55, 24, 43, 89, 46, 119, 11, 1, 33, 83, 117, 80, 35, 109, 39, 44, 114, 0, 59, 86, 13, 29, 14, 93, 124, 17, 30, 29, 67, 67, 79, 30, 46, 35, 38, 33, 58, 120, 112, 68, 74, 85, 110, 57, 27, 3, 107, 42, 70, 105, 12, 16, 101, 17, 4, 125, 19, 57, 70, 35, 114, 28, 111, 108, 123, 31, 49, 95, 74, 77, 82, 44, 123, 62, 47, 6, 87, 116, 17, 68, 39, 24, 26, 107, 75, 20, 33, 10, 17, 55, 101, 4, 115, 92, 98, 101, 22, 23, 95, 91, 19, 15, 111, 60, 29, 124, 113, 60, 28, 15, 74, 107, 76, 78, 81, 115, 118, 15, 93, 117, 72, 46, 81, 18, 44, 37, 126, 24, 77, 27, 31, 67, 99, 60, 96, 66, 93, 112, 13, 10, 91, 0, 80, 12, 67, 46, 115, 53, 37, 64, 43, 120, 116, 27, 58, 3, 62, 14, 79, 41, 39, 30, 103, 39, 50, 56, 123, 21, 2, 55, 110, 99, 100, 24, 62, 20, 10, 102, 80, 44, 51, 9, 100, 31, 79, 92] diff --git a/NNSCTF2025_Origami/release_files/source.sage b/NNSCTF2025_Origami/release_files/source.sage new file mode 100644 index 0000000..293ecc7 --- /dev/null +++ b/NNSCTF2025_Origami/release_files/source.sage @@ -0,0 +1,46 @@ +from Crypto.Util.number import bytes_to_long, long_to_bytes + +n,p,q,df,dg,dr=[512,2,127,35,35,22] +R. = ZZ[] +Rq. = Integers(q)[] +Rqn = Rq.quotient(x^n-1) +Rp. = Integers(p)[] +Rpn = Rp.quotient(w^n-1) + +def random_poly(d): + f = R(0) + for i in sample(range(n),d): + f += R(x**i) + return f + +def secretkey_gen(): + f,g = [0,0] + while not Rpn(f).is_unit() or not Rqn(f).is_unit(): + f = random_poly(df) + g = random_poly(dg) + return f,g + +def publickey_gen(f,g): + h = Rqn(g)/Rqn(f) + return h + +def encrypt(h,m): + r = random_poly(dr) + c = p * h * Rqn(r) + Rqn(m) + return c + +def encode(val): + poly = R(0) + for i in range(n): + poly += (val & 1) * x^i + val >>= 1 + return poly + +f,g = secretkey_gen() +pk = publickey_gen(f,g) + +flag = encode(bytes_to_long(b"NNS{???????????????????????????????????????????????}")) +ct = encrypt(pk,flag) + +print(f"pk = {pk.lift().coefficients(sparse=False)}") +print(f"ct = {ct.lift().coefficients(sparse=False)}") \ No newline at end of file