tea 加密解密算法(面向ctf-reverse使用,光速学会tea逆向套路)

一,算法特征

tea算法的主要特征表现在sum和delta变量,以及3行核心加密中出现的右移4左移5,两行各有3个小括号互相异或

在题目中看到这些特征时就应该警醒这是tea相关算法

delta的值一般为0x9E3779B9(-0x61C88647),但题目中往往会改变它的值,并不影响算法的逆向


二,加解密脚本

(一)tea加密脚本

注释写的很详细,可以辅助了解原理

void tea_enc(uint32_t* v, uint32_t* k) {uint32_t v0 = v[0], v1 = v[1];  // v0、v1分别是明文的左、右半部分uint32_t sum = 0;               // sum用作加密过程中的一个累加变量uint32_t delta = 0xd33b470;     //作为sum每次累加的变化值,题目中往往会修改此值for (int i = 0; i < 32; i++) {  // tea加密进行32轮//以下3行是核心加密过程,题目中往往会对部分细节做出修改(但由于异或的对称性质,根本不需要记,写解密函数时照抄就行了)sum += delta;v0 += ((v1 << 4) + k[0]) ^ (v1 + sum) ^ ((v1 >> 5) + k[1]);v1 += ((v0 << 4) + k[2]) ^ (v0 + sum) ^ ((v0 >> 5) + k[3]);}// v0和v1只是加密的临时变量,因此加密后的内容要还给v数组v[0] = v0;v[1] = v1;
}

(二)tea解密脚本 

void tea_dec(uint32_t* v, uint32_t* k) {uint32_t v0 = v[0], v1 = v[1];  // v0、v1分别是密文的左、右半部分uint32_t delta = 0xd33b470;     //作为sum每次累加的变化值,题目中往往会修改此值uint32_t sum = 32 * delta;      //此处需要分析32轮加密结束后sum的值与delta的变化, 以此处加密为例子,32轮每次sum+=delta,因此最后sum=32*deltafor (int i = 0; i < 32; i++) {  // tea加密进行32轮//根据加密时的顺序颠倒下面3行的顺序,将加法改为减法(异或部分都是整体,不用管),就是逆向解密过程v1 -= ((v0 << 4) + k[2]) ^ (v0 + sum) ^ ((v0 >> 5) + k[3]);v0 -= ((v1 << 4) + k[0]) ^ (v1 + sum) ^ ((v1 >> 5) + k[1]);sum -= delta;}// 因此解密后的内容要还给v数组v[0] = v0;v[1] = v1;
}

(三)tea解题实例

下面用两道比较经典的tea算法实战例题来搞清楚这个脚本如何套用,建议自己先尝试一下然后再看wp,两题都看一下,因为tea算法的题目经常对明文形式、输出格式等做变换,全部例举出来很废精力,还是要学会自己举一反三

省略了密钥k和密文input的获取过程,仔细分析main函数中调用tea解密的部分,理解如何套用编写好的tea解密函数

重点抓准——无论明文是什么形式、有多长,解密时一定是每次传入两个uint32_t(32位无符号整数)

(1)例题1->[MoeCTF 2022]ezTea

链接:

#include <stdint.h>
#include <stdio.h>
void tea_dec(uint32_t* v, uint32_t* k) {uint32_t v0 = v[0], v1 = v[1];  // v0、v1分别是密文的左、右半部分uint32_t delta = 0xd33b470;     //作为sum每次累加的变化值,题目中往往会修改此值uint32_t sum = 32 * delta;      //此处需要分析32轮加密结束后sum的值与delta的变化, 以此处加密为例子,32轮每次sum+=delta,因此最后sum=32*deltafor (int i = 0; i < 32; i++) {  // tea加密进行32轮//根据加密时的顺序颠倒下面3行的顺序,将加法改为减法(异或部分都是整体,不用管),就是逆向解密过程v1 -= ((v0 << 4) + k[2]) ^ (v0 + sum) ^ ((v0 >> 5) + k[3]);v0 -= ((v1 << 4) + k[0]) ^ (v1 + sum) ^ ((v1 >> 5) + k[1]);sum -= delta;}// 解密后的内容要还给v数组v[0] = v0;v[1] = v1;
}int main() {// k为加解密密钥,4个32位无符号整数,密钥长度为128位uint32_t k[4] = {1, 2, 3, 4};// v为要加解密的数据,两个32位无符号整数//但是稍微难一点点的都不会直接加密两个uint32_t,除非签到题。像这里的例子就是给了32个uint8_t//(常见的题目还有给几个uint32_t的,其实无非是拆开写成0x17、0x65...和连着写成0x1765的区别)//在后面的循环里每次传两组,每组4个组成uint32_t用于tea算法int8_t input[33] = {0x17, 0x65, 0x54, 0x89, 0xed, 0x65, 0x46, 0x32, 0x3d, 0x58, 0xa9, 0xfd, 0xe2, 0x5e, 0x61, 0x97,0xe4, 0x60, 0xf1, 0x91, 0x73, 0xe9, 0xe9, 0xa2, 0x59, 0xcb, 0x9a, 0x99, 0xec, 0xb1, 0xe1, 0x7d};for (int i = 0; i < 32; i += 8) {//每组4个组成uint32_t用于tea算法,tea算法每次加解密操作的v一定是两个uint_32,至于怎么传入两个uint_32,题目有各种呈现方式,需要做题者自行分析uint32_t v[2] = {*(uint32_t*)&input[i], *(uint32_t*)&input[i + 4]};tea_dec(v, k);// tea输出字符的固定算法,外层循环两次是因为明文分为左半和右半两个uint32_t// 内层循环4次是因为一个字符占1个字节即8位,每次&0xff可以摘下最后1字节打印出对应ASCII字符,然后>>8准备下一字节for (int j = 0; j < 2; j++) {for (int k = 0; k < 4; k++) {printf("%c", v[j] & 0xff);v[j] >>= 8;}}}return 0;
}

(2)例题2->[GWCTF 2019]xxor

链接:NSSCTF | 在线CTF平台

#include <stdint.h>
#include <stdio.h>
void tea_dec(uint32_t* v, uint32_t* k) {uint32_t v0 = v[0], v1 = v[1];  // v0、v1分别是密文的左、右半部分uint32_t delta = 1166789954;    //作为sum每次累加的变化值,题目中往往会修改此值uint32_t sum = 64 * delta;      //题目中的tea加密轮数为64轮,因此解密时要做出对应的修改,最终sum是64倍的deltafor (int i = 0; i < 64; i++) {  // tea加密进行64轮//根据加密时的顺序颠倒下面3行的顺序,将加法改为减法(异或部分都是整体,不用管),就是逆向解密过程v1 -= (v0 + sum + 20) ^ ((v0 << 6) + k[2]) ^ ((v0 >> 9) + k[3]) ^ 0x10;v0 -= (v1 + sum + 11) ^ ((v1 << 6) + k[0]) ^ ((v1 >> 9) + k[1]) ^ 0x20;sum -= delta;}// 解密后的内容要还给v数组v[0] = v0;v[1] = v1;
}int main() {// k为加解密密钥,4个32位无符号整数,密钥长度为128位uint32_t k[4] = {2, 2, 3, 4};// v为要加解密的数据,两个32位无符号整数//但是稍微难一点点的都不会直接加密两个uint32_t,除非签到题。像这里的例子就是给了6个uint32_t//但是在加解密时一定是拆开进行,每次传入两个uint32_tuint32_t v[6];//根据题目解出密文是这些(z3求方程未知数的解)//这里给数组v的元素赋值时不能写成{-548868226, 550153460, ...}这种形式//否则会报类型转换的错误,但是单独给每个元素赋值就可以,不清楚原因,但是也算学到一招,避免以后遇到这种问题没法解决v[0] = -548868226;v[1] = 550153460;v[2] = 3774025685;v[3] = 1548802262;v[4] = 2652626477;v[5] = -2064448480;for(int i = 0; i <= 2; i++){//循环3次,每次传入两个uint32_t解密得到明文tea_dec(&v[2 * i], k);}for (int i = 0; i < 6; i++) {//根据题目提示,打印出明文的十六进制形式printf("%X", v[i]);//结果:666C61677B72655F69735F6772656174217D}//然后你可以找解密网站进行十六进制转字符串,也可以开个python脚本,直接运行下面这两行代码进行十六进制转字符串/*hex_data = '666C61677B72655F69735F6772656174217D'print(bytes.fromhex(hex_data).decode())*/return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1536807.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

深入了解字符函数和字符串函数

前言&#xff1a;今天给大家深入理解一下字符函数 和 字符串函数。通过使用 和 模拟实现 带大家加深理解&#xff0c;让大家灵活使用。 字符函数 在C语言中&#xff0c;有一系列函数是专门做字符分类的&#xff0c;也就是一个字符属于什么类型的字符。 这些函数的使用都要包含…

IDEA复制代码到MD笔记格式还手动调,赶紧试试这个功能,一步到位

你是否曾经有过这种复制代码到笔记代码块的经历&#xff0c;选中后代码左侧有一些空格 然后粘到Markdown笔记里除第一行外&#xff0c;其他几行都要手动向前缩进&#xff0c;真是逼死强迫症啊 但是&#xff0c;其实idea工具中有一个“列选择模式”的功能&#xff0c;我们可以…

初中生物--5.单细胞生物

单细胞生物 单细胞生物整个身体只由一个细胞构成&#xff0c;是生物 圈中非常原始&#xff0c;形态微小、结构简单的一类生物。大多数生活在水域或湿润的环境中&#xff0c;也有寄生在 其他生物身体上 例如&#xff1a;大肠杆菌、眼虫、酵母菌、变形虫、衣藻、草履虫 草履虫 …

微信视频号导出视频软件

最近研究了一下微信视频号导出视频的方法&#xff0c;目前发现还是比较难搞&#xff0c;查了一些资料&#xff0c;写了一个可以导出视频的软件&#xff0c;目前还不完善&#xff0c;但是导出视频到本地还是没问题&#xff0c;先用着吧&#xff0c;后期再完善。先记录一下。 测…

linux网络编程1

24.9.16学习目录 一.TCP/IP协议简介1.TCP/IP的分层结构2.协议的简介 二、MAC地址和IP地址1.网卡2.MAC地址3.IP地址&#xff08;1&#xff09;IP地址的分类&#xff08;2&#xff09;IP地址的特点&#xff08;3&#xff09;回环IP地址 3.子网掩码4.端口&#xff08;1&#xff09…

神经网络通俗理解学习笔记(5) 自然语言处理

自然语言处理 词嵌入和word2vec词义搜索和句意表示预训练模型Hugging Face库介绍经典NLP数据集代码案例-电影评论情感分析 词嵌入和word2vec 词嵌入是一种 将高维的数据表示映射到低维空间的方法 word embedding 是将语言中的词编码成向量便于后续的分析和处理 词嵌入和词向量…

JavaScript 事件处理

一、简介 ​ 事件&#xff1a;发生在HTML元素上的事情&#xff0c;可以是用户的行为&#xff0c;也可以是浏览器的行为&#xff0c;如 用户点击了某个HTML元素用户将鼠标移动到某个HTML元素上用户输入数据时光标离开页面加载完成 ​ 事件源&#xff1a;事件触发的源头&#xf…

Maya怎么把黑色的面反转为白色面

1、选中需要调整的面。 2、点击菜单栏中的“网格显示”&#xff0c;再点击点击“反转(Reverse)”。 3、反转后&#xff0c;原本黑色的面将会变成正常的面&#xff0c;法线方向也会相应改变。 按住ctrlshift鼠标中键 拖动快捷图标至工具栏

photozoom pro 9如何激活解锁 2024最新激活解锁代码

您好,现在程程来为大家解答以上的问题。photozoom pro 9解锁代码&#xff0c;photozoom pro 9解锁代码相信很多小伙伴还不知道,现在让我们一起来看... 您好,现在程程来为大家解答以上的问题。photozoom pro 9解锁代码&#xff0c;photozoom pro 9解锁代码相信很多小伙伴还不知道…

54.【C语言】 字符函数和字符串函数(strncpy,strncat,strncmp函数)

和strcpy,strcat,strcmp函数对应的是strncpy,strncat,strncmp函数 8.strncpy函数 *简单使用 cplusplus的介绍 点我跳转 翻译: 函数 strncpy char * strncpy ( char * destination, const char * source, size_t num ); 从字符串中复制一些字符 复制源(source)字符串的前num个…

LeetCode题集-4 - 寻找两个有序数组的中位数,图文并茂,六种解法,万字讲解

题目&#xff1a;给定两个大小分别为 m 和 n 的正序&#xff08;从小到大&#xff09;数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数 。 算法的时间复杂度应该为 O(log (mn)) 。 作为目前遇到的第一个困难级别题目&#xff0c;我感觉这题还是挺难的&#xff0c…

Linux常用命令以及操作技巧

&#x1f30f;个人博客主页&#xff1a;意疏-CSDN博客 希望文章能够给到初学的你一些启发&#xff5e; 如果觉得文章对你有帮助的话&#xff0c;点赞 关注 收藏支持一下笔者吧&#xff5e; 阅读指南&#xff1a; 开篇说明帮助命令常见的七个linux操作终端实用的技巧跟文件目录…

idea集成和使用Git指南

前言 Git是一个分布式的版本控制工具&#xff0c;可以管理我们开发过程中的源代码文件&#xff0c;而idea是Java的集成开发环境&#xff0c;在idea中配置Git&#xff0c;可以提高我们的团队开发效率。因此在idea中集成Git并使用Git管理我们的源代码是必要的 第一步&#xff1a;…

计算机毕业设计python校园物资招标投标竞标系统 w235g

目录 技术栈和环境说明具体实现截图预期达到的目标系统设计详细视频演示技术路线解决的思路性能/安全/负载方面可行性分析论证python-flask核心代码部分展示python-django核心代码部分展示研究方法感恩大学老师和同学源码获取 技术栈和环境说明 本系统以Python开发语言开发&am…

Java 入门指南:JVM(Java虚拟机)垃圾回收机制 —— 死亡对象判断方法

文章目录 垃圾回收机制死亡对象判断方法引用计数法可达性分析算法可以作为 GC Roots 的对象判断对象被回收需要经历的过程 引用类型引用汇总引用队列 废弃常量判定废弃常量废弃原因遵循原则 无用的类所需条件造成的问题解决步骤 垃圾回收机制 垃圾回收&#xff08;Garbage Col…

【探索数据结构与算法】插入排序:原理、实现与分析(图文详解)

目录 一、插入排序 算法思想 二、插入排序 算法步骤 四、复杂度分析 时间复杂度&#xff1a;O(n^2) 空间复杂度&#xff1a;O(1) 稳定性&#xff1a;稳定算法 五、应用场景 &#x1f493; 博客主页&#xff1a;C-SDN花园GGbond ⏩ 文章专栏&#xff1a;探索数据结构…

STM32之FMC—扩展外部 SDRAM

文章目录 一、FMC外设介绍二、SDRAM 控制原理1、SDRAM关键参数a、容量、分区b、引脚SDRAM 使用 2、SDRAM芯片IS42S16400J3、SDRAM 控制引脚说明控制逻辑地址控制SDRAM 的存储阵列SDRAM 的命令预充电刷新 W9825G6KH&#xff1a;W9825G6KH引脚 三、STM32F429 FMC四、其他文章打开…

基于ssm的个性化影片推荐系统设计与实现

需要项目源码请联系我&#xff0c;目前有各类成品 毕设 javaweb ssh ssm springboot等等项目框架&#xff0c;源码丰富。 专业团队&#xff0c;咨询就送开题报告&#xff0c;活动限时免费&#xff0c;有需要的朋友可以来咨询。 一、摘要 随着科学技术的飞速发展&#xff0c;社…

Matlab simulink建模与仿真 第十五章(信号源库)

参考视频&#xff1a;simulink1.1simulink简介_哔哩哔哩_bilibili 一、信号源库中的模块概览 注&#xff1a;部分模块在第二章中有介绍&#xff0c;本章不再赘述。 二、from输入源模块 1、From Workspace模块 &#xff08;1&#xff09;该模块可从MATLAB工作区、模型工作区…

双指针算法专题(2)

找往期文章包括但不限于本期文章中不懂的知识点&#xff1a; 个人主页&#xff1a;我要学编程(ಥ_ಥ)-CSDN博客 所属专栏&#xff1a; 优选算法专题 想要了解双指针算法的介绍&#xff0c;可以去看下面的博客&#xff1a;双指针算法的介绍 目录 611.有效三角形的个数 LCR 1…