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 加密算法分析
密钥生成
key=os.urandom(16)# 16 字节随机密钥K=[bytes_to_long(key[i:i+4])foriinrange(0,len(key),4)]- 将 16 字节密钥分为 4 组,每组 4 字节(32 位)
- 生成 4 个子密钥:K[0], K[1], K[2], K[3]
加密流程
defencrypt(plaintext):# 1. 填充:使用'0'填充到 8 的倍数plaintext+="0"*(8-len(plaintext)%8)# 2. 分块处理(每块 8 字节)foriinrange(0,len(plaintext),8):block=plaintext[i:i+8]L=bytes_to_long(block[0:4].encode())R=bytes_to_long(block[4:8].encode())# 3. 32 轮 TEA 加密delta=0x9e3779b9sum=0foriinrange(32):sum+=delta L+=((R<<4)+K[0])^(R+sum)^((R>>5)+K[1])R+=((L<<4)+K[2])^(L+sum)^((L>>5)+K[3])ciphertext.append((L,R))returnciphertext关键特征:
- Feistel 网络结构(L 和 R 交替运算)
- 32 轮迭代
- Delta 常数:
0x9e3779b9(基于黄金比例) - 轮函数:
F(L,R,K,sum) = ((R<<4)+K[0]) ^ (R+sum) ^ ((R>>5)+K[1]) - 未使用模运算,导致密文数值非常大
三、解题思路
3.1 攻击策略
TEA 是对称加密算法,解密是加密的逆过程:
- 逆向轮数:从第 32 轮到第 1 轮
- 逆向 sum:从
sum = 32*delta递减到 0 - 逆向运算:将
+=改为-= - 计算顺序:先解密 R,再解密 L(因为 L 依赖新的 R)
3.2 解密公式
加密:
sum+=delta L+=F(R,K,sum)R+=F(L,K,sum)解密:
sum-=delta R-=F(L,K,sum)# 注意:先用旧的 L 计算 RL-=F(R,K,sum)# 再用新的 R 计算 L其中轮函数:
F(X,K,sum)=((X<<4)+K[i])^(X+sum)^((X>>5)+K[j])四、详细步骤
Step 1: 读取密钥和密文
从config.py中读取:
- 密钥:
f55b87dc6755f3153c13bdebe36f42c1(16 字节) - 密文:5 个块,共 40 字节
Step 2: 提取子密钥
K=[int.from_bytes(key[i:i+4],'big')foriinrange(0,16,4)]K[0]=0xf55b87dcK[1]=0x6755f315K[2]=0x3c13bdebK[3]=0xe36f42c1Step 3: 逐块解密
对每个密文块(L, R):
delta=0x9e3779b9sum_val=delta*32# 32 轮后的 sumforiinrange(32):R=R-(((L<<4)+K[2])^(L+sum_val)^((L>>5)+K[3]))L=L-(((R<<4)+K[0])^(R+sum_val)^((R>>5)+K[1]))sum_val-=deltaStep 4: 转换为字符串
L_bytes=(L&0xffffffff).to_bytes(4,'big')R_bytes=(R&0xffffffff).to_bytes(4,'big')block_str=(L_bytes+R_bytes).decode('latin-1')Step 5: 去除填充
去除末尾的所有'0'字符。
五、完整代码
#!/usr/bin/env python3fromconfigimportkey,ctdefsolve():# 提取子密钥K=[int.from_bytes(key[i:i+4],'big')foriinrange(0,len(key),4)]defdecrypt_block(L,R):delta=0x9e3779b9sum_val=delta*32foriinrange(32):R=R-(((L<<4)+K[2])^(L+sum_val)^((L>>5)+K[3]))L=L-(((R<<4)+K[0])^(R+sum_val)^((R>>5)+K[1]))sum_val-=deltareturnL,Rdefto_string(L,R):L=L&0xffffffffR=R&0xffffffffL_bytes=L.to_bytes(4,'big')R_bytes=R.to_bytes(4,'big')return(L_bytes+R_bytes).decode('latin-1')plaintext=""forL,Rinct:L_dec,R_dec=decrypt_block(L,R)plaintext+=to_string(L_dec,R_dec)returnplaintext.rstrip('0')if__name__=="__main__":flag=solve()print(f"Flag:{flag}")六、运行结果
============================================================ 【Flag】shellmates{XXX} ============================================================