网站的制作视频,怎么做企业网站推广赚钱,网站页面图片,可以推广的网站有哪些附件提供一个Python加密脚本生成8字节(64位)随机密钥用密钥的MD5哈希值作为随机数种子逐字节加密flag#xff08;与随机数异或#xff09;输出密文和bytes_to_long(key)12的值输出#xff1a;[140, 96, 112, 178, 38, 180, 158, 240, 179, 202, 251, 138, 188, 185,…附件提供一个Python加密脚本生成8字节(64位)随机密钥用密钥的MD5哈希值作为随机数种子逐字节加密flag与随机数异或输出密文和bytes_to_long(key)12的值输出[140, 96, 112, 178, 38, 180, 158, 240, 179, 202, 251, 138, 188, 185, 23, 67, 163, 22, 150, 18, 143, 212, 93, 87, 209, 139, 92, 252, 55, 137, 6, 231, 105, 12, 65, 59, 223, 25, 179, 101, 19, 215] 2669175714787937二、漏洞分析1. 核心漏洞密钥部分泄露print(bytes_to_long(key) 12) # 输出: 26691757147879378字节密钥 64位右移12位保留高52位丢弃低12位攻击面只需暴力破解4096 (2¹²) 种可能2. 次要漏洞确定性随机序列random.seed(int(hashlib.md5(key).hexdigest(), 16))伪随机数生成器(PRG)在相同种子下产生完全相同的序列MD5哈希是确定性函数相同输入→相同输出完整链条相同密钥→相同MD5→相同随机序列→相同加密结果3. 设计缺陷弱随机源使用Python标准库random而非密码学安全的secrets模块os.urandom(8)虽然安全但后续处理破坏了安全性三、密码学知识点1. 位操作基础1字节 8位8字节 64位右移n位x nfloor(x / 2^n)丢弃低n位左移n位x nx * 2^n低位补0位恢复original (shifted n) | low_n_bits2. 随机数生成器特性确定性固定种子→固定序列标准库 vs 密码学安全random用于模拟/游戏不适合加密secrets.SystemRandom基于操作系统熵源适合加密3. 异或(XOR)加密原理加密ciphertext plaintext ^ random_byte解密plaintext ciphertext ^ random_byte自逆操作安全性完全依赖随机数质量和密钥保密性4. 暴力破解可行性分析密钥空间2¹² 4,096种可能现代CPU性能每秒可执行数十亿次操作破解时间 100毫秒实际测试约50-200ms安全阈值通常需要2⁸⁰以上才被认为安全四、解题思路1. 信息收集已知密文42字节的整数列表已知key_high 2669175714787937密钥高52位2. 密钥重构完整密钥 (key_high 12) | low_12_bits枚举low_12_bits从0到40953. 随机序列重现对每个候选密钥计算MD5哈希设置相同随机种子生成相同随机序列4. 验证机制检查解密结果是否以flag{开头验证是否为有效UTF-8字符串检查是否只包含可打印字符五、完整解题代码import random import hashlib from Crypto.Util.number import long_to_bytes # 1. 已知常量 ciphertext [140, 96, 112, 178, 38, 180, 158, 240, 179, 202, 251, 138, 188, 185, 23, 67, 163, 22, 150, 18, 143, 212, 93, 87, 209, 139, 92, 252, 55, 137, 6, 231, 105, 12, 65, 59, 223, 25, 179, 101, 19, 215] known_high_bits 2669175714787937 # key 12 的值 # 2. 还原原题rand函数 def rand(rng): 完全复制原题中的随机函数 return rng - random.randrange(rng) # 3. 解密核心函数 def decrypt_with_key(key_bytes): 使用给定密钥尝试解密 # 3.1 重现随机种子 seed int(hashlib.md5(key_bytes).hexdigest(), 16) random.seed(seed) # 3.2 严格模拟加密过程 flag_chars [] for c in ciphertext: rand(256) # 丢弃一个随机数与加密过程完全一致 r rand(256) % 256 # 获取用于加密的随机数256%2560 plain_byte c ^ r flag_chars.append(plain_byte) # 3.3 尝试转换为可读字符串 try: return bytes(flag_chars).decode(utf-8) except UnicodeDecodeError: return None # 4. 暴力破解主循环 print([*] 开始暴力破解尝试 4096 种密钥组合...) solution_found False for low_12 in range(4096): # 4.1 重构完整64位密钥 full_key_value (known_high_bits 12) | low_12 key_bytes long_to_bytes(full_key_value, 8) # 明确8字节长度 # 4.2 尝试解密 try: flag decrypt_with_key(key_bytes) except Exception as e: continue # 4.3 验证解密结果 if flag and flag.startswith(flag{) and } in flag: print(f\n[] 破解成功! 密钥低12位: {low_12}) print(f[] 完整密钥 (hex): {key_bytes.hex()}) print(f[] Flag: {flag}) print(f[] 尝试次数: {low_12 1}/4096) solution_found True break # 4.4 进度提示 if low_12 % 500 0 and low_12 0: print(f[*] 已尝试 {low_12}/4096 种组合...) if not solution_found: print([-] 破解失败未找到有效flag。)执行结果[*] 开始暴力破解尝试 4096 种密钥组合... [*] 已尝试 500/4096 种组合... [*] 已尝试 1000/4096 种组合... [*] 已尝试 1500/4096 种组合... [*] 已尝试 2000/4096 种组合... [*] 已尝试 2500/4096 种组合... [] 破解成功! 密钥低12位: 2935 [] 完整密钥 (hex): 97b99e652b261b77 [] Flag: flag{e319a58c-4dd6-4e6a-a3fb-f4b0d339faba} [] 尝试次数: 2936/4096