CTF-RE: TEA系列解密脚本
//
// Created by A5rZ on 2024/10/26.
//#ifndef WORK_TEA_H
#define WORK_TEA_H#endif //WORK_TEA_H#include <cstdint>
#include <cstdio>// 定义TEA加密算法的轮次,一般建议为32轮
#define TEA_ROUNDS 32
#define DELTA 0x9e3779b9// TEA加密函数
void TEA_encrypt(uint32_t* v, const uint32_t* key) {uint32_t v0 = v[0], v1 = v[1];uint32_t sum = 0;for (int i = 0; i < TEA_ROUNDS; i++) {sum += DELTA;v0 += ((v1 << 4) + key[0]) ^ (v1 + sum) ^ ((v1 >> 5) + key[1]);v1 += ((v0 << 4) + key[2]) ^ (v0 + sum) ^ ((v0 >> 5) + key[3]);}v[0] = v0;v[1] = v1;
}/*void TEA_decrypt(uint32_t* v, const uint32_t* key) {uint32_t v0 = v[0], v1 = v[1];uint32_t sum = DELTA * TEA_ROUNDS;for (int i = 0; i < TEA_ROUNDS; i++) {v1 -= ((v0 << 4) + key[2]) ^ (v0 + sum) ^ ((v0 >> 5) + key[3]);v0 -= ((v1 << 4) + key[0]) ^ (v1 + sum) ^ ((v1 >> 5) + key[1]);sum -= DELTA;}v[0] = v0;v[1] = v1;
}
*/// TEA解密函数
void TEA_decrypt(uint32_t* v, const uint32_t* key) {uint32_t v0 = v[0], v1 = v[1];uint32_t sum = DELTA * TEA_ROUNDS;for (int i = 0; i < TEA_ROUNDS; i++) {v1 -= ((v0 << 4) + key[2]) ^ (v0 + sum) ^ ((v0 >> 5) + key[3]);v0 -= ((v1 << 4) + key[0]) ^ (v1 + sum) ^ ((v1 >> 5) + key[1]);sum -= DELTA;}v[0] = v0;v[1] = v1;
}void TEA_fast_decrypt(uint32_t* data, int data_length, const uint32_t* key) {// 假设数组长度是偶数if (data_length % 2 != 0) {printf("error1输入数组的长度必须是偶数。\n");return;}for (int i = 0; i < data_length; i += 2) {// 取出两个元素进行解密uint32_t v[2] = { data[i], data[i + 1] };// 使用XTEA解密TEA_decrypt(v, key);// 打印解密后的结果printf("%08x %08x\n", v[0], v[1]);}
}#define XTEA_ROUNDS 64 // XTEA一般使用64轮加密
#define XTEA_DELTA 0x9E3778B9// XTEA加密函数
void XTEA_encrypt(uint32_t* v, const uint32_t* key) {uint32_t v0 = v[0], v1 = v[1];uint32_t sum = 0;for (int i = 0; i < XTEA_ROUNDS; i++) {v0 += ((v1 << 4 ^ v1 >> 5) + v1) ^ (sum + key[sum & 3]);sum += XTEA_DELTA;v1 += ((v0 << 4 ^ v0 >> 5) + v0) ^ (sum + key[(sum >> 11) & 3]);}v[0] = v0;v[1] = v1;
}/*
void XTEA_decrypt(uint32_t* v, const uint32_t* key) {uint32_t v0 = v[0], v1 = v[1];uint32_t sum = XTEA_DELTA * XTEA_ROUNDS;for (int i = 0; i < XTEA_ROUNDS; i++) {v1 -= ((v0 << 4 ^ v0 >> 5) + v0) ^ (sum + key[(sum >> 11) & 3]);sum -= XTEA_DELTA;v0 -= ((v1 << 4 ^ v1 >> 5) + v1) ^ (sum + key[sum & 3]);}v[0] = v0;v[1] = v1;
}
*/// XTEA解密函数
void XTEA_decrypt(uint32_t* v, const uint32_t* key) {uint32_t v0 = v[0], v1 = v[1];uint32_t sum = XTEA_DELTA * XTEA_ROUNDS;for (int i = 0; i < XTEA_ROUNDS; i++) {v1 -= (((v0 << 4 ^ v0 >> 5) + v0) ^ (sum + key[(sum >> 11) & 3])) ^ v0;sum -= XTEA_DELTA;v0 -= (((v1 << 4 ^ v1 >> 5) + v1) ^ (sum + key[sum & 3])) ^ v1;}v[0] = v1;v[1] = v0;
}void XTEA_fast_decrypt(uint32_t* data, int data_length, const uint32_t* key) {// 假设数组长度是偶数if (data_length % 2 != 0) {printf("error1输入数组的长度必须是偶数。\n");return;}for (int i = 0; i < data_length; i += 2) {// 取出两个元素进行解密uint32_t v[2] = { data[i], data[i + 1] };// 使用XTEA解密XTEA_decrypt(v, key);// 打印解密后的结果printf("%08x %08x\n", v[0], v[1]);}
}// 定义常量 DELTA,用于加密和解密操作中的累加器增量
#define XXTEA_DELTA 0x9E3779B9// XXTEA 加密函数
void XXTEA_encrypt(uint32_t *v, int n, const uint32_t k[4]) {// 如果数组大小 n 小于 2,不进行加密,直接返回if (n < 2) return;// 初始化 z 和 y,z 为数组最后一个元素,y 为第一个元素uint32_t z = v[n - 1], y = v[0], sum = 0;// 计算加密轮数,XXTEA 的轮数依赖于数据块的个数 nuint32_t rounds = 6 + 52 / n;// 外层循环执行轮数次for (uint32_t i = 0; i < rounds; i++) {// 累加器 sum 增加 DELTA,每轮都递增sum += XXTEA_DELTA;// 计算 e,用于密钥选择uint32_t e = (sum >> 2) & 3;// 内层循环处理 n-1 个数据块for (uint32_t p = 0; p < n - 1; p++) {y = v[p + 1]; // 下一个块的值// 更新当前块的值,使用 z 和 y 进行加密操作,结合移位、异或和密钥v[p] += ((z >> 5) ^ (y << 2)) + ((y >> 3) ^ (z << 4)) ^ (sum ^ y) + (k[(p & 3) ^ e] ^ z);z = v[p]; // 更新 z 为当前块}// 最后一个数据块的加密操作y = v[0]; // 第一个块的值v[n - 1] += ((z >> 5) ^ (y << 2)) + ((y >> 3) ^ (z << 4)) ^ (sum ^ y) + (k[((n - 1) & 3) ^ e] ^ z);z = v[n - 1]; // 更新 z 为最后一个块}
}/*
void XXTEA_decrypt(uint32_t *v, int n, const uint32_t k[4]) {// 如果数组大小 n 小于 2,不进行解密,直接返回if (n < 2) return;// 初始化 z 和 y,z 为数组最后一个元素,y 为第一个元素uint32_t z = v[n - 1], y = v[0];// 初始化累加器 sum,为加密的总和,解密时从最大值开始递减uint32_t sum = XXTEA_DELTA * (6 + 52 / n);// 外层循环执行轮数次,与加密时的轮数相同for (uint32_t i = 0; i < 6 + 52 / n; i++) {// 计算 e,用于密钥选择uint32_t e = (sum >> 2) & 3;// 内层循环处理 n-1 个数据块,从数组末尾往前遍历for (uint32_t p = n - 1; p > 0; p--) {z = v[p - 1]; // 前一个块的值// 更新当前块的值,使用 z 和 y 进行解密操作,结合移位、异或和密钥v[p] -= ((z >> 5) ^ (y << 2)) + ((y >> 3) ^ (z << 4)) ^ (sum ^ y) + (k[(p & 3) ^ e] ^ z);y = v[p]; // 更新 y 为当前块}// 第一个数据块的解密操作z = v[n - 1]; // 最后一个块的值v[0] -= ((z >> 5) ^ (y << 2)) + ((y >> 3) ^ (z << 4)) ^ (sum ^ y) + (k[(0 & 3) ^ e] ^ z);y = v[0]; // 更新 y 为第一个块// 累加器 sum 减少 DELTA 值,与加密时相反sum -= XXTEA_DELTA;}
}
*/void XXTEA_decrypt(uint32_t *v, int n, const uint32_t k[4]) {/** - `v` 是要加密/解密的数据块,类型为 `uint32_t*`,表示数据的多个 32 位块。* - `n` 是数据块的个数,即数据中包含的 32 位块的数量。* - `k[4]` 是 128 位的密钥,分成四个 32 位的无符号整数。*/// 如果数组大小 n 小于 2,不进行解密,直接返回if (n < 2) return;// 初始化 z 和 y,z 为数组最后一个元素,y 为第一个元素uint32_t z = v[n - 1], y = v[0];// 初始化累加器 sum,为加密的总和,解密时从最大值开始递减uint32_t sum = XXTEA_DELTA * (6 + 52 / n);// 外层循环执行轮数次,与加密时的轮数相同for (uint32_t i = 0; i < 6 + 52 / n; i++) {// 计算 e,用于密钥选择uint32_t e = (sum >> 2) & 3;// 内层循环处理 n-1 个数据块,从数组末尾往前遍历for (uint32_t p = n - 1; p > 0; p--) {z = v[p - 1]; // 前一个块的值// 更新当前块的值,使用 z 和 y 进行解密操作,结合移位、异或和密钥v[p] -= ((z >> 5) ^ (y << 2)) + ((y >> 3) ^ (z << 4)) ^ (sum ^ y) + (k[(p & 3) ^ e] ^ z);y = v[p]; // 更新 y 为当前块}// 第一个数据块的解密操作z = v[n - 1]; // 最后一个块的值v[0] -= ((z >> 5) ^ (y << 2)) + ((y >> 3) ^ (z << 4)) ^ (sum ^ y) + (k[(0 & 3) ^ e] ^ z);y = v[0]; // 更新 y 为第一个块// 累加器 sum 减少 DELTA 值,与加密时相反sum -= XXTEA_DELTA;}
}
相关文章:
CTF-RE: TEA系列解密脚本
// // Created by A5rZ on 2024/10/26. //#ifndef WORK_TEA_H #define WORK_TEA_H#endif //WORK_TEA_H#include <cstdint> #include <cstdio>// 定义TEA加密算法的轮次,一般建议为32轮 #define TEA_ROUNDS 32 #define DELTA 0x9e3779b9// TEA加密函数 v…...
信号量和线程池
1.信号量 POSIX信号量,用与同步操作,达到无冲突的访问共享资源目的,POSIX信号量可以用于线程间同步 初始化信号量 #include <semaphore.h> int sem_init(sem_t *sem, int pshared, unsigned int value); sem:指向sem_t类…...
【人工智能】10分钟解读-深入浅出大语言模型(LLM)——从ChatGPT到未来AI的演进
文章目录 一、前言二、GPT模型的发展历程2.1 自然语言处理的局限2.2 机器学习的崛起2.3 深度学习的兴起2.3.1 神经网络的训练2.3.2 神经网络面临的挑战 2.4 Transformer的革命性突破2.4.1 Transformer的核心组成2.4.2 Transformer的优势 2.5 GPT模型的诞生与发展2.5.1 GPT的核心…...
「QT」几何数据类 之 QPointF 浮点型点类
✨博客主页何曾参静谧的博客📌文章专栏「QT」QT5程序设计📚全部专栏「VS」Visual Studio「C/C」C/C程序设计「UG/NX」BlockUI集合「Win」Windows程序设计「DSA」数据结构与算法「UG/NX」NX二次开发「QT」QT5程序设计「File」数据文件格式「PK」Parasolid…...
可能是全网第一个MySQL Workbench插件编写技巧
引言 应公司要求,数据库的敏感数据在写入到数据库中要进行加密,但是在测试环境查询数据的时候要手动解密,很不方便,有的时候数据比较多,解密比较麻烦。遂研究了一下如何通过 MySQL Workbench 的插件来实现查询数据一键…...
D62【python 接口自动化学习】- python基础之数据库
day62 SQL 基础 学习日期:20241108 学习目标:MySQL数据库-- 131 SQL基础和DDL 学习笔记: SQL的概述 SQL语言的分类 SQL的语法特征 DDL - 库管理 DDL - 表管理 总结 SQL是结构化查询语言,用于操作数据库,通用于绝大…...
探索美赛:从准备到挑战的详细指南
前言 美国大学生数学建模竞赛(MCM/ICM),简称“美赛”,是全球规模最大的数学建模竞赛之一。它鼓励参赛者通过数学建模来解决现实世界中的复杂问题,广受世界各地大学生的欢迎。本文将详细介绍美赛的全过程,从…...
IP地址查询——IP归属地离线库
自从网络监管部门将现实IP地址列入监管条例,IP地址的离线库变成网络企业发展业务的不可或缺的一部分,那么IP地址离线库是什么,又能够给我们带来什么呢? 什么是IP地址离线库? IP地址离线库是IP地址服务商将通过各种合…...
“倒时差”用英语怎么说?生活英语口语学习柯桥外语培训
“倒时差”用英语怎么说? “倒时差”,这个让无数旅人闻之色变的词汇,在英语中对应的正是“Jet Lag”。"Jet" 指的是喷气式飞机,而 "lag" 指的是落后或延迟。这个短语形象地描述了当人们乘坐喷气式飞机快速穿…...
Linux入门攻坚——37、Linux防火墙-iptables-3
私网地址访问公网地址的问题,请求时,目标地址是公网地址,可以在公网路由器中进行路由,但是响应报文的目的地址是私网地址,此时在公网路由器上就会出现问题。公网地址访问私网地址的问题,需要先访问一个公网…...
微服务架构面试内容整理-安全性-Spring Security
Spring Security 是 Spring 框架中用于实现认证和授权的安全模块,它提供了全面的安全解决方案,可以帮助开发者保护 Web 应用、微服务和 API 免受常见的安全攻击。以下是 Spring Security 的主要特点、工作原理和使用场景: 主要特点 1. 身份认证与授权: 提供多种认证方式,…...
新的服务器Centos7.6 安装基础的环境配置(新服务器可直接粘贴使用配置)
常见的基础服务器配置之Centos命令 正常来说都是安装一个docker基本上很多问题都可以解决了,我基本上都是通过docker去管理一些容器如:mysql、redis、mongoDB等之类的镜像,还有一些中间件如kafka。下面就安装一个 docker 和 nginx 的相关配置…...
深度学习:广播机制
广播机制(Broadcasting)是 PyTorch(以及其他深度学习框架如 NumPy)中的一种强大功能,它允许不同形状的张量进行逐元素操作,而不需要显式地扩展张量的维度。广播机制通过自动扩展较小的张量来匹配较大张量的…...
音视频入门基础:FLV专题(25)——通过FFprobe显示FLV文件每个packet的信息
音视频入门基础:FLV专题系列文章: 音视频入门基础:FLV专题(1)——FLV官方文档下载 音视频入门基础:FLV专题(2)——使用FFmpeg命令生成flv文件 音视频入门基础:FLV专题…...
Openstack7--安装消息队列服务RabbitMQ
只需要在控制节点安装 安装RabbitMQ yum -y install rabbitmq-server 启动RabbitMQ并设置开机自启 systemctl start rabbitmq-server;systemctl enable rabbitmq-server 创建 rabbitmq 用户 并设置密码为 000000 rabbitmqctl add_user rabbitmq 000000 如果你不慎创错了…...
day55 图论章节刷题Part07([53.寻宝]prim算法、kruskal算法)
前言:使用最小生成树的方法解决将所有节点连接起来所需的最小路径问题。 prim算法 Prim算法是一种贪心算法,从任意一个顶点开始构建最小生成树。每次选择当前已加入生成树的顶点中,距离最近的尚未加入生成树的顶点,直到所有顶点…...
LeetCode 93-复制 IP地址
题目链接:LeetCode93 欢迎留言交流,每天都会回消息。 class Solution {//定义结果集,返回最终结果List<String> rs new ArrayList<>();public List<String> restoreIpAddresses(String s) {//将字符串包装为可变长度的字…...
海底捞点单
单点锅底推荐: 番茄锅底通31 牛油麻辣通44 清汤麻辣备44 菌汤锅底通31 小吃&主食: 捞派捞面一黄金小馒头一茴香小油条 红糖枇杷一小酥肉 DIY锅底推荐: 1.寿喜锅:海鲜味酱4勺陈醋1勺蚝油2勺盐适量白糖7勺 芹菜1勺 2.麻辣锅底…...
It’s All About Your Sketch: Democratising Sketch Control in Diffusion Models
翻译: 摘要 本文揭示了草图在扩散模型中的潜力,解决了生成式人工智能中直接草图控制的虚假承诺。我们重要的是使这个过程更加普及,让业余的草图也能生成精确的图像,真正实现“你画的就是你得到的”。一项初步研究强调了这一研究的…...
Java基础-组件及事件处理(下)
(创作不易,感谢有你,你的支持,就是我前行的最大动力,如果看完对你有帮助,请留下您的足迹) 目录 面板组件 说明 常见组件 JScrollPane常用构造方法 JScrollPane设置面板滚动策略的方法 JScrollPane滚…...
C++初阶-list的底层
目录 1.std::list实现的所有代码 2.list的简单介绍 2.1实现list的类 2.2_list_iterator的实现 2.2.1_list_iterator实现的原因和好处 2.2.2_list_iterator实现 2.3_list_node的实现 2.3.1. 避免递归的模板依赖 2.3.2. 内存布局一致性 2.3.3. 类型安全的替代方案 2.3.…...
【Oracle APEX开发小技巧12】
有如下需求: 有一个问题反馈页面,要实现在apex页面展示能直观看到反馈时间超过7天未处理的数据,方便管理员及时处理反馈。 我的方法:直接将逻辑写在SQL中,这样可以直接在页面展示 完整代码: SELECTSF.FE…...
DockerHub与私有镜像仓库在容器化中的应用与管理
哈喽,大家好,我是左手python! Docker Hub的应用与管理 Docker Hub的基本概念与使用方法 Docker Hub是Docker官方提供的一个公共镜像仓库,用户可以在其中找到各种操作系统、软件和应用的镜像。开发者可以通过Docker Hub轻松获取所…...
8k长序列建模,蛋白质语言模型Prot42仅利用目标蛋白序列即可生成高亲和力结合剂
蛋白质结合剂(如抗体、抑制肽)在疾病诊断、成像分析及靶向药物递送等关键场景中发挥着不可替代的作用。传统上,高特异性蛋白质结合剂的开发高度依赖噬菌体展示、定向进化等实验技术,但这类方法普遍面临资源消耗巨大、研发周期冗长…...
Day131 | 灵神 | 回溯算法 | 子集型 子集
Day131 | 灵神 | 回溯算法 | 子集型 子集 78.子集 78. 子集 - 力扣(LeetCode) 思路: 笔者写过很多次这道题了,不想写题解了,大家看灵神讲解吧 回溯算法套路①子集型回溯【基础算法精讲 14】_哔哩哔哩_bilibili 完…...
【2025年】解决Burpsuite抓不到https包的问题
环境:windows11 burpsuite:2025.5 在抓取https网站时,burpsuite抓取不到https数据包,只显示: 解决该问题只需如下三个步骤: 1、浏览器中访问 http://burp 2、下载 CA certificate 证书 3、在设置--隐私与安全--…...
mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包
文章目录 现象:mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包遇到 rpm 命令找不到已经安装的 MySQL 包时,可能是因为以下几个原因:1.MySQL 不是通过 RPM 包安装的2.RPM 数据库损坏3.使用了不同的包名或路径4.使用其他包…...
GruntJS-前端自动化任务运行器从入门到实战
Grunt 完全指南:从入门到实战 一、Grunt 是什么? Grunt是一个基于 Node.js 的前端自动化任务运行器,主要用于自动化执行项目开发中重复性高的任务,例如文件压缩、代码编译、语法检查、单元测试、文件合并等。通过配置简洁的任务…...
从物理机到云原生:全面解析计算虚拟化技术的演进与应用
前言:我的虚拟化技术探索之旅 我最早接触"虚拟机"的概念是从Java开始的——JVM(Java Virtual Machine)让"一次编写,到处运行"成为可能。这个软件层面的虚拟化让我着迷,但直到后来接触VMware和Doc…...
C++中vector类型的介绍和使用
文章目录 一、vector 类型的简介1.1 基本介绍1.2 常见用法示例1.3 常见成员函数简表 二、vector 数据的插入2.1 push_back() —— 在尾部插入一个元素2.2 emplace_back() —— 在尾部“就地”构造对象2.3 insert() —— 在任意位置插入一个或多个元素2.4 emplace() —— 在任意…...
