当前位置: 首页 > 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.cnnetsun.cn/news/1953652.html

相关文章:

  • 日本汽车的恐惧,又一个市场被中国汽车破局了,死亡螺旋开始了
  • 直播回顾 | 测试智能体与智能化测试平台分享
  • AO650 3BHT300051R1具有较高的控制精度
  • 智能代码生成个性化适配策略,构建可审计、可回滚、可度量的生成治理闭环
  • HTML头部元信息避坑指南:关键标签的正确使用姿势
  • Radiology: Imaging Cancer 北京大学人民医院洪楠等团队:基于髋骨参考框架的非增强CT自动骶骨肿瘤分类流程评估
  • 从代码孤岛到智能协同,揭秘头部科技公司如何用LLM+GitOps实现PR通过率提升67%、交付周期压缩42%,你团队缺的不是工具,而是这1套协作协议
  • 使用 YApi 管理 API 文档,测试, mock
  • Unity游戏窗口自定义:实现标题栏与边框的动态控制
  • 【实战教程+数据集】YOLOv8车牌识别数据集7811张,从数据标注到模型部署,构建智慧交通车牌检测系统
  • 从 GPT-6 “Spud“ 闹剧看 AI 圈的信息不对称现象
  • Siemens 6DS1311-8AE 总线驱动
  • 【49】软考软件设计师——冲刺复盘:高频易错点与应试策略|复盘清单+应试技巧
  • MongoDB备节点无法读取数据怎么解决_rs.slaveOk()与Secondary读取权限
  • 从PTA题库反推C语言核心考点:浙大版实验指导中的必刷题型与解题套路
  • 如何快速配置虚拟工作空间:ParsecVDisplay终极效率提升指南
  • 洛洛王国-超时
  • 智能文件分拣工具:双模式智能分拣,自定义文件夹命名,按文件类型自动分类,一键批量整理海量文件,零门槛高效管理电脑数字资产
  • 监控通道太多查不过来?国标GB28181视频平台EasyGBS视频质量诊断支持轮询模式,省心太多了
  • 如何用10个Illustrator脚本实现设计自动化:从手动操作到智能工作流的终极指南
  • SITS2026唯一授权技术解密:基于AST+语义图谱的AI设计模式生成引擎(含开源替代方案对比表)
  • RK3588固件烧录避坑指南:从零制作update.img到Windows下安全刷机(解决软链接拷贝问题)
  • 如何快速定位标签错位_结构审查技巧【技巧】
  • OFDM系统核心组件全解析:从帧、符号、子载波到导频与保护间隔的MATLAB实现与可视化
  • RAG揭秘:不只是检索+模型,而是“信息处理流水线”的完整构建!
  • java 基础语法篇 —— 日期与时间基础使用
  • 如何3分钟搞定网易云音乐NCM文件转换:ncmdumpGUI完整指南
  • 破局研发管理“双面角色”:从小团队救火走向系统化治理
  • 告别真机采购!用ADB的wm命令,5分钟搞定Android应用多分辨率兼容性测试
  • 精密机械厂8-12人跨部门云工作站:从单机设计到全流程并行开发的转型