Cup_of_TEA - Writeup by AI
Cup_of_TEA - Writeup by AI一、题目信息题目来源Bugku CTF题目类别Crypto密码学考点TEA (Tiny Encryption Algorithm) 加密算法分析与逆向二、题目分析2.1 代码结构题目提供了两个文件challenge.py- TEA 加密实现config.py- 生成的密钥和密文2.2 加密算法分析密钥生成keyos.urandom(16)# 16 字节随机密钥K[bytes_to_long(key[i:i4])foriinrange(0,len(key),4)]将 16 字节密钥分为 4 组每组 4 字节32 位生成 4 个子密钥K[0], K[1], K[2], K[3]加密流程defencrypt(plaintext):# 1. 填充使用0填充到 8 的倍数plaintext0*(8-len(plaintext)%8)# 2. 分块处理每块 8 字节foriinrange(0,len(plaintext),8):blockplaintext[i:i8]Lbytes_to_long(block[0:4].encode())Rbytes_to_long(block[4:8].encode())# 3. 32 轮 TEA 加密delta0x9e3779b9sum0foriinrange(32):sumdelta L((R4)K[0])^(Rsum)^((R5)K[1])R((L4)K[2])^(Lsum)^((L5)K[3])ciphertext.append((L,R))returnciphertext关键特征Feistel 网络结构L 和 R 交替运算32 轮迭代Delta 常数0x9e3779b9基于黄金比例轮函数F(L,R,K,sum) ((R4)K[0]) ^ (Rsum) ^ ((R5)K[1])未使用模运算导致密文数值非常大三、解题思路3.1 攻击策略TEA 是对称加密算法解密是加密的逆过程逆向轮数从第 32 轮到第 1 轮逆向 sum从sum 32*delta递减到 0逆向运算将改为-计算顺序先解密 R再解密 L因为 L 依赖新的 R3.2 解密公式加密sumdelta LF(R,K,sum)RF(L,K,sum)解密sum-delta R-F(L,K,sum)# 注意先用旧的 L 计算 RL-F(R,K,sum)# 再用新的 R 计算 L其中轮函数F(X,K,sum)((X4)K[i])^(Xsum)^((X5)K[j])四、详细步骤Step 1: 读取密钥和密文从config.py中读取密钥f55b87dc6755f3153c13bdebe36f42c116 字节密文5 个块共 40 字节Step 2: 提取子密钥K[int.from_bytes(key[i:i4],big)foriinrange(0,16,4)]K[0]0xf55b87dcK[1]0x6755f315K[2]0x3c13bdebK[3]0xe36f42c1Step 3: 逐块解密对每个密文块(L, R)delta0x9e3779b9sum_valdelta*32# 32 轮后的 sumforiinrange(32):RR-(((L4)K[2])^(Lsum_val)^((L5)K[3]))LL-(((R4)K[0])^(Rsum_val)^((R5)K[1]))sum_val-deltaStep 4: 转换为字符串L_bytes(L0xffffffff).to_bytes(4,big)R_bytes(R0xffffffff).to_bytes(4,big)block_str(L_bytesR_bytes).decode(latin-1)Step 5: 去除填充去除末尾的所有0字符。五、完整代码#!/usr/bin/env python3fromconfigimportkey,ctdefsolve():# 提取子密钥K[int.from_bytes(key[i:i4],big)foriinrange(0,len(key),4)]defdecrypt_block(L,R):delta0x9e3779b9sum_valdelta*32foriinrange(32):RR-(((L4)K[2])^(Lsum_val)^((L5)K[3]))LL-(((R4)K[0])^(Rsum_val)^((R5)K[1]))sum_val-deltareturnL,Rdefto_string(L,R):LL0xffffffffRR0xffffffffL_bytesL.to_bytes(4,big)R_bytesR.to_bytes(4,big)return(L_bytesR_bytes).decode(latin-1)plaintextforL,Rinct:L_dec,R_decdecrypt_block(L,R)plaintextto_string(L_dec,R_dec)returnplaintext.rstrip(0)if__name____main__:flagsolve()print(fFlag:{flag})六、运行结果 【Flag】shellmates{XXX}