R = [] #R太占版面了,就删掉了。题目附件里已经给出 n = 58113574203067314600162910771848744432179168354040678920098167335472534222998261639291145191568159464990603689062679467360303185717662426122140998218656632568172511390111887830539687208220100574329903748617343193392646019854280519859403817579746765861359633174218846216669659258251676438195667516224684805919 c = 56754194307199340085459028397027924827853574000671575387226403396873568994756738512141122143372650573201079937375922460851170745485734799044781029943783218210457587599666501326645229924138230588050782907693019958930006807017898115655426823272342984109999519420817119999272583495848119171867835187241510764427
defparinad(n): returnbin(n)[2:].count('1') % 2
# 1. 求出p和q Q = int(''.join(str(parinad(R[i])) for i inrange(512)), 2) Q_alt = (1<<512) - 1 - Q if n % Q == 0and isPrime(Q): p = Q else: p = Q_alt #print(p) assert isPrime(p) and n%p==0
# 步骤3: 计算 19 模 L 的逆元(用于索引映射) try: inv19 = inverse_mod(19, L) # 19 在模 L 下的逆元 except Exception as e: raise ValueError(f"19 和 L={L} 不互质,无法计算逆元。错误: {e}")
# 步骤4: 映射每个点到 flag 字符 flag_array = [None] * L # 初始化 flag 数组
for x, y in points: # 计算 a = (19n - 14) % L(来自真点 x 公式) a = -1 - x # 因为 x = -(1 + a) if a < 0or a >= L: print(f"警告: x={x} 的 a={a} 超出 [0, L-1]。跳过。") continue # 计算 n(真点索引) c = a + 14# 来自 a = (19n - 14) % L n_val = (c * inv19) % L # n = (c * inv19) mod L # 计算 b(flag 字符位置) b_val = (63 * n_val - 40) % L # b = (63n - 40) % L # 检查 y 是否为可打印 ASCII if y < 32or y > 126: print(f"警告: x={x} 的 y={y} 不是可打印 ASCII。跳过。") continue # 存储字符(位置 b_val) flag_array[b_val] = chr(y)
# 检查是否所有位置都已填充 ifNonein flag_array: missing = [i for i, char inenumerate(flag_array) if char isNone] print(f"警告: 位置 {missing} 未填充。尝试调整点集合或 L。") else: print("所有位置填充成功。")
defdecode(p_man:str): orig_bits = '' for i inrange(0, len(p_man), 2): two_bits = p_man[i:i + 2] if two_bits == '01': orig_bits += '0' elif two_bits == '11': orig_bits += '1' else: raise ValueError(f"Invalid bit pair: {two_bits}") return orig_bits
defrecover_256(n:int): q = 2**256-1 modulus = 2 ** (32 + 64 + 128 + 256) inv = pow(q, -1, modulus) p = bin((n % modulus) * inv % modulus)[2:] iflen(p) % 2: p = '0' + p assertall(p[i] == '1'for i inrange(1, len(p), 2)) return p
defrecover_128(n:int): q = int('11011101001110011100110101111001000101001101011110110111001100100001011111001100001100001010001110110001100001000100110111111111'+'1'*256,2) modulus = 2 ** (32 + 64 + 128 + 256) inv = pow(q, -1, modulus) p = bin((n % modulus) * inv % modulus)[2:] iflen(p) % 2: p = '0' + p assertall(p[i] == '1'for i inrange(1, len(p), 2)) return p
defrecover_64(n:int): q = int('111101111110100010100000100010100110101111000001100000011010011011011101001110011100110101111001000101001101011110110111001100100001011111001100001100001010001110110001100001000100110111111111'+'1'*256,2) modulus = 2 ** (32 + 64 + 128 + 256) inv = pow(q, -1, modulus) p = bin((n % modulus) * inv % modulus)[2:] iflen(p) % 2: p = '0' + p assertall(p[i] == '1'for i inrange(1, len(p), 2)) return p
defrecover_32(n:int): q = int('11110111000111010010000101100001111101111110100010100000100010100110101111000001100000011010011011011101001110011100110101111001000101001101011110110111001100100001011111001100001100001010001110110001100001000100110111111111'+'1'*256,2) modulus = 2 ** (32 + 64 + 128 + 256) inv = pow(q, -1, modulus) p = bin((n % modulus) * inv % modulus)[2:] iflen(p) % 2: p = '0' + p assertall(p[i] == '1'for i inrange(1, len(p), 2)) return p
defrecover_16(n:int): q = int('110101000111000011110111000111010010000101100001111101111110100010100000100010100110101111000001100000011010011011011101001110011100110101111001000101001101011110110111001100100001011111001100001100001010001110110001100001000100110111111111'+'1'*256,2) modulus = 2 ** (32 + 64 + 128 + 256) inv = pow(q, -1, modulus) p = bin((n % modulus) * inv % modulus)[2:] iflen(p) % 2: p = '0' + p assertall(p[i] == '1'for i inrange(1, len(p), 2)) return p
defrecover(n:int,q_bit:str): q = int(q_bit+'1'*256, 2) modulus = 2 ** (len(q_bit) + 256) inv = pow(q, -1, modulus) p = bin((n % modulus) * inv % modulus)[2:] iflen(p) % 2: p = '0' + p assertall(p[i] == '1'for i inrange(1, len(p), 2)) return p
# 给定参数 n = 147170819334030469053514652921356515888015711942553338463409772437981228515273287953989706666936875524451626901247038180594875568558137526484665015890594045767912340169965961750130156341999306808017498374501001042628249176543370525803456692022546235595791111819909503496986338431136130272043196908119165239297
for i inrange(1,461): res = int(x19*(10**i)) if(is_bytes_printable(long_to_bytes(res))): print(long_to_bytes(res)) #CCTF{h3Ur1s7!c5_anD_iNv4rIanTs_iN_CryptoCTF_2025!} #本题有ChatGPT和Deepseek提供错误思路,自行调试得到思路和代码
# 代入已知的 u, v, w 后,g, i, k 成为关于 x, y, z 的方程 g = a1 * u * x * y + a2 * v + a3 * x + a4 * y + a5 i = b1 * v * y * z + b2 * w + b3 * y + b4 * z + b5 k = c1 * w * x * z + c2 * u + c3 * x + c4 * z + c5