当前位置: 首页 > news >正文

Cup_of_TEA - Writeup by AI

Cup_of_TEA - Writeup by AI

一、题目信息

  • 题目来源:Bugku CTF
  • 题目类别:Crypto(密码学)
  • 考点:TEA (Tiny Encryption Algorithm) 加密算法分析与逆向

二、题目分析

2.1 代码结构

题目提供了两个文件:

  1. challenge.py- TEA 加密实现
  2. 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 是对称加密算法,解密是加密的逆过程:

  1. 逆向轮数:从第 32 轮到第 1 轮
  2. 逆向 sum:从sum = 32*delta递减到 0
  3. 逆向运算:将+=改为-=
  4. 计算顺序:先解密 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]=0xe36f42c1

Step 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-=delta

Step 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} ============================================================
http://www.jsqmd.com/news/658468/

相关文章:

  • 告别玄学调参!手把手教你用SX1262 LoRa模块实现5公里稳定通信(附完整代码)
  • 2026年3月废水处理设备供应商推荐,水处理设备/废水处理设备,废水处理设备供应厂家推荐 - 品牌推荐师
  • 基于STM32LXXX的模数转换芯片ADC(ADS7128IRTER)驱动C程序设计
  • Less模块化实战指南:@import参数化引入与项目架构优化
  • 职业院校智慧校园采购怎样才算明智?聊聊性价比与易用性的那些事
  • 算网融合,互联无界:丰润达亮相第三届AI算力产业大会
  • 无人机视角屋顶检测数据集VOC+YOLO格式4107张2类别
  • 2026年口碑好的水泥烟道/GRC水泥烟道稳定供货厂家推荐 - 行业平台推荐
  • AI编程革命:Codex脚本自动化指南
  • AI Agent Harness Engineering 与边缘计算结合的实时控制应用
  • 【原创改进代码】考虑动态能效比感知的含温控负荷虚拟电厂优化调度
  • Framer Motion 中拖拽约束失效的解决方案
  • 美团2023校招测试-简答题(第3/4批)
  • 史上最强模型Claude Opus 4.7发布!一大批公司要倒闭了
  • 终极指南:Switch NAND管理工具NxNandManager的10个核心功能解析
  • AI企业应用平台厂家
  • 从零搭建RDA5807收音机:硬件连接与I2C驱动实战
  • 中国油车的新技术,挖到日本汽车的根,双管齐下真要命!
  • 文件散落成灾,找资料比做项目还累怎么办?
  • 视频智能分析工具终极指南:如何用AI自动理解视频内容
  • 全体技术人做好随时涨薪的准备吧!
  • C++ 进程间高性能同步:基于共享内存循环队列与 C++ 原子原语实现的高吞吐、低延迟双向通信通道
  • 别再踩坑了!手把手教你用VS2019搞定Simulink与CANOE 15.0联合仿真环境搭建
  • 传统摄影师升级AI影像生成师后商业变现能力提升
  • SelectDB Enterprise 4.0.5:强化安全与治理,构建企业级实时分析与 AI 数据底座
  • 学工管理系统官网|学工系统试用|学工一体化平台采购|学生工作管理系统选型|学生工作管理平台厂家
  • 内容资产化治理:轻量化中台驱动企业矩阵运营提质增效
  • 如何用 click 与 mousedown 区分鼠标点击与按下的触发顺序
  • PHP源码运行时风扇狂转怎么办_硬件温控调优方法【说明】
  • Linux内核UFS驱动调试实战:如何追踪一个失败的UPIU命令(含Abort Task流程分析)