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

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;}
}
http://www.lryc.cn/news/483302.html

相关文章:

  • 信号量和线程池
  • 【人工智能】10分钟解读-深入浅出大语言模型(LLM)——从ChatGPT到未来AI的演进
  • 「QT」几何数据类 之 QPointF 浮点型点类
  • 可能是全网第一个MySQL Workbench插件编写技巧
  • D62【python 接口自动化学习】- python基础之数据库
  • 探索美赛:从准备到挑战的详细指南
  • IP地址查询——IP归属地离线库
  • “倒时差”用英语怎么说?生活英语口语学习柯桥外语培训
  • Linux入门攻坚——37、Linux防火墙-iptables-3
  • 微服务架构面试内容整理-安全性-Spring Security
  • 新的服务器Centos7.6 安装基础的环境配置(新服务器可直接粘贴使用配置)
  • 深度学习:广播机制
  • 音视频入门基础:FLV专题(25)——通过FFprobe显示FLV文件每个packet的信息
  • Openstack7--安装消息队列服务RabbitMQ
  • day55 图论章节刷题Part07([53.寻宝]prim算法、kruskal算法)
  • LeetCode 93-复制 IP地址
  • 海底捞点单
  • It’s All About Your Sketch: Democratising Sketch Control in Diffusion Models
  • Java基础-组件及事件处理(下)
  • npm list -g --depth=0(用来列出全局安装的所有 npm 软件包而不显示它们的依赖项)
  • 深度学习:nn.Linear
  • 大数据新视界 -- 大数据大厂之 Impala 性能提升:高级执行计划优化实战案例(下)(18/30)
  • 常用的Anaconda Prompt命令行指令
  • 如何低成本、零代码开发、5分钟内打造一个企业AI智能客服?
  • 全网最全最新最细的MYSQL5.7下载安装图文教程
  • NoSQL数据库与关系型数据库的主要区别
  • ubuntu24.04安装matlab失败
  • Oracle 11g rac 集群节点的修复过程
  • c++:string(一)
  • github和Visual Studio