corCTF 2021 | supercomputer

#corctf2021

from Crypto.Util.number import getPrime, long_to_bytes
from pwn import *
import random, binascii

flag = open('flag.txt').read()

def v(p, k):
    ans = 0
    while k % p == 0:
        k /= p
        ans += 1
    return ans

p, q, r = getPrime(2048), getPrime(2048), getPrime(2048)
print(p, q, r)
n = pow(p, q) * r

a1 = random.randint(0, n)
a2 = n - a1
assert a1 % p != 0 and a2 % p != 0

t = pow(a1, n) + pow(a2, n)
print(binascii.hexlify(xor(flag, long_to_bytes(v(p, t)))))

#p-adic_number

 n = p^q r

 a_1 + a_2 = n

 t = a_1^n + a_2^n

 c = flag \oplus v(p, t)

 v(p, k)というのは kの中の pの個数

 p,q,r,cが与えられる

この vというのはp進付値そのもの

LTE Lemma を使うと

 v_p(a_1^n + a_2^n) = v_p(a_1 + a_2) + v_p(n) = v_p(n) + v_p(n) = p + p = 2p

へー