Do you have good eyes?

发布时间:2026/7/3 1:35:54
Do you have good eyes? 这是一个区分MLWEModule Learning With Errors实例和均匀随机实例的挑战。我们需要通过分析给出的矩阵A和向量t来判断t是MLWE构造的还是完全随机的。让我分析一下代码和策略问题分析参数使用Dilithium Level 5参数q 8380417n 256环的秩k 8, l 7eta 2小误差范围两种情况MLWE: t A*s e其中s和e的系数在[-2, 2]范围内Random: t是完全随机的向量需要区分给定(A, t)判断是MLWE还是随机解决方案思路关键观察在MLWE情况下t A*s e其中s和e都很小系数在[-2,2]。这意味着t在A的列空间附近而随机t则没有这个性质。一个简单的区分方法pythonfrom pwn import * import ast import base64 import gzip # 连接到服务器 host archive.cryptohack.org port 43607 def decompress_data(encoded_str): 解压缩并解析数据 decoded base64.b64decode(encoded_str) decompressed gzip.decompress(decoded) return ast.literal_eval(decompressed.decode()) def is_mlwe_instance(A, t, q8380417): 判断是否可能是MLWE实例 k len(A) # 8 l len(A[0]) # 7 # 方法1: 检查t是否接近A的列空间 # 对每个可能的s系数在[-2,2]检查是否能得到t # 更实用的方法检查t的分布 # MLWE的t应该有一定的结构 # 计算t的随机性指标 from statistics import variance import math # 方法检查A和t之间是否存在线性关系 # 尝试找到一个小的s使得A*s接近t # 简化方法使用格约简或LLL # 但这里我们使用启发式方法 # 计算A的列空间和t的距离 # 由于参数较小我们可以尝试穷举部分s # 实际上对于eta2每个系数有5种可能 # 但维度是7*256太大无法穷举 # 使用另一种方法检查t的系数分布 # MLWE的t系数应该接近正态分布而随机的是均匀分布 all_coeffs [] for row in t: for coeff in row: if hasattr(coeff, polynomial): for c in coeff.polynomial().coefficients(sparseFalse): all_coeffs.append(c % q) else: all_coeffs.append(coeff % q) # 计算统计特征 # MLWE的系数应该更集中在0附近因为s和e都小 # 简单启发式检查向量t是否小 norm sum(c*c for c in all_coeffs) # 如果t很小可能是MLWE如果t很大可能是随机 # 更好的方法检查是否能找到小的s # 这里使用一个简化的判断 return True # 占位符 def solve_challenge(): conn remote(host, port) # 接收初始消息 print(conn.recvline().decode()) threshold 128 count 0 while count threshold: # 接收A和t line conn.recvline().decode() while not line.startswith(sanitize_mat(A) ): line conn.recvline().decode() # 解析A A_str line.split( )[1].strip() print(fA length: {len(A_str)}) line conn.recvline().decode() while not line.startswith(sanitize_vec(t) ): line conn.recvline().decode() t_str line.split( )[1].strip() print(ft length: {len(t_str)}) # 解压数据 try: A decompress_data(A_str) t decompress_data(t_str) except: print(解压失败尝试重新连接) conn.close() return # 判断 # 由于我们无法在本地轻易实现完整的判断 # 我们需要一个更聪明的策略 # 观察MLWE实例的t A*s e其中s和e很小 # 这意味着t的每个元素的模应该相对较小 # 检查向量t的大小 # 计算t的二范数 norm_squared 0 for row in t: for coeff in row: # 处理多项式系数 if hasattr(coeff, polynomial): coeffs coeff.polynomial().coefficients(sparseFalse) # 补齐到RING_RANK长度 coeffs coeffs [0] * (256 - len(coeffs)) for c in coeffs: val c % q if val q//2: val val - q norm_squared val * val else: val coeff % q if val q//2: val val - q norm_squared val * val # MLWE的t应该相对较小 avg_norm norm_squared / (8 * 256) is_mlwe avg_norm 1000 # 启发式阈值 print(fNorm: {avg_norm:.2f}, 判断: {MLWE if is_mlwe else Random}) # 发送答案 conn.sendline(str(1 if is_mlwe else 0).encode()) # 接收响应 response conn.recvline().decode() if wp in response: count 1 print(f正确! 进度: {count}/{threshold}) else: print(错误!) # 继续尝试 # 获取flag final conn.recvall().decode() print(final) if __name__ __main__: solve_challenge()更精确的判别方法实际上最可靠的方法是使用格基约简来寻找小的spythondef better_judge(A, t): 使用LLL格基约简来判断 # 构造格基 # 目标是找到小的s使得 A*s ≈ t # 这可以转化为CVP问题 # 构造矩阵 # [qI 0 0] # [A I 0] # [0 0 I] # 简化版本构造一个格来求解A*s t mod q # 使用Babais nearest plane algorithm # 由于实现复杂这里给出概念 pass由于挑战连接需要实时交互建议在本地先实现判断逻辑然后再连接服务器。关键是要准确区分MLWE和均匀随机分布利用误差s和e的范数较小的特点。