RE_TEA加密

news2024/11/25 13:36:53

TEA这段时间遇到的是真多,有直接原始加密,也有 XTEA,XXTEA,更有在此上魔改的,之前也是能认出来,知道还是不够。

en,TEA加密解密脚本还是用 C 好一些,什么溢出之类不用考虑。

TEA

也有可能是 64 轮迭代

def encrypt(v, k):
    v0, v1 = v[0], v[1]
    sum = 0
    delta = 0x9e3779b9
    k0, k1, k2, k3 = k[0], k[1], k[2], k[3]
    for i in range(32):
        sum = (sum + delta) & 0xffffffff
        v0 = (v0 + (((v1 << 4) + k0) ^ (v1 + sum) ^ ((v1 >> 5) + k1))) & 0xffffffff
        v1 = (v1 + (((v0 << 4) + k2) ^ (v0 + sum) ^ ((v0 >> 5) + k3))) & 0xffffffff
    return [v0, v1]
#确保它们在 32 位整数范围内
if __name__ == "__main__":
    data = [1234, 5678]
    key = [1, 2, 3, 4]
    enc = encrypt(data, key)
    print(enc)
def decrypt(v,k):
    v0,v1=v[0],v[1]
    delta=0x9e3779b9
    k0,k1,k2,k3=k[0],k[1],k[2],k[3]
    sum=(delta*32)&0xffffffff
    for i in range(32):
        v1 = (v1 - (((v0 << 4) + k2) ^ (v0 + sum) ^ ((v0 >> 5) + k3))) & 0xffffffff
        v0 = (v0 - (((v1 << 4) + k0) ^ (v1 + sum) ^ ((v1 >> 5) + k1))) & 0xffffffff
        sum = (sum - delta) & 0xffffffff
    v[0],v[1]=v0,v1
    return v

if __name__=="__main__":
    data=[731179895, 2211051369]
    key=[1,2,3,4]
    res=decrypt(data,key)
    print(res)

在python中, 最好不要使用 “-=”,和 C 不同,害我改了半天,xp。

XTEA

就是每轮加密不同
 

def encrypt(v, k):
    v0, v1 = v[0], v[1]
    sum = 0
    delta = 0x9e3779b9
    k0, k1, k2, k3 = k[0], k[1], k[2], k[3]
    for i in range(32):
        v0=v0+((((v1<<4) ^ (v1>>5))+v1) ^ (sum+k[sum&3]))&0xffffffff
        sum=(sum+delta)&0xffffffff
        v1=v1+((((v0<<4) ^ (v0>>5))+v0) ^ (sum+k[(sum>>11)&3]))&0xffffffff
    return [v0, v1]
#确保它们在 32 位整数范围内
if __name__ == "__main__":
    data = [1234, 5678]
    key = [1,2, 3, 4]
    enc = encrypt(data, key)
    print(enc)

key[sum & 3 ]

sum & 3 保证索引在 k0 到 k3 之间循环, 3 是 ‘11’,故只保留sum后两位

(sum + k[sum & 3]) 

这个操作首先将 sum 右移 11 位,然后再进行按位与操作 & 3。这个操作同样可以确保结果在 0 到 3 之间,但它使用的是 sum 的第 12 和 13 位

 

def encrypt(v, k):
    v0, v1 = v[0], v[1]
    sum = (0x9e3779b9*32)&0xffffffff
    delta = 0x9e3779b9
    k0, k1, k2, k3 = k[0], k[1], k[2], k[3]
    for i in range(32):
        v1 = v1 - ((((v0 << 4) ^ (v0 >> 5)) + v0) ^ (sum + k[(sum >> 11) & 3])) & 0xffffffff
        sum=(sum-delta)&0xffffffff
        v0 = v0 - ((((v1 << 4) ^ (v1 >> 5)) + v1) ^ (sum + k[sum & 3])) & 0xffffffff
    return [v0, v1]
#确保它们在 32 位整数范围内
if __name__ == "__main__":
    data = [1787803488, 3495090297]
    key = [1,2, 3, 4]
    enc = encrypt(data, key)
    print(enc)

XXTEA

例题:

[HNCTF 2022 WEEK2]TTTTTTTTTea

应该是XTEA加密

 key 都是 32位数,故写成四个八位的数组

key=[0x00010203,0x04050607,0x08090a0b,0x0c0d0e0f]

也可以按 D 换成 dw ,dd

唉,没几个大佬分析前面的,是我太菜了!

exp:

大佬都是用 C 写的,确实好写一些好像

为加强理解,我用 python写一个,还是有一点小问题:

enc = [0xC11EE75A, 0xA4AD0973, 0xF61C9018, 0x32E37BCD, 0x2DCC1F26, 0x344380CC]

def decrypt(enc1, enc2):
    key = [0x00010203, 0x04050607, 0x08090a0b, 0x0c0d0e0f]
    delta = 0x9e3779b9
    sum = (delta * 32) & 0xffffffff
    for i in range(32):
        enc2 = (enc2 - ((((enc1 >> 5) ^ (enc1 << 4)) + enc1) ^ (key[(sum >> 11) & 3] + sum))) & 0xffffffff
        sum = (sum - delta) & 0xffffffff
        enc1 = (enc1 - ((((enc2 >> 5) ^ (enc2 << 4)) + enc2) ^ (key[sum & 3] + sum))) & 0xffffffff
    return enc1, enc2

data = []
for i in range(0, 6, 2):
    res1, res2 = decrypt(enc[i], enc[i + 1])
    data.append(res1)
    data.append(res2)

print(data)
for value in data:
    print(chr((value >> 24) & 0xff) + chr((value >> 16) & 0xff) + chr((value >> 8) & 0xff) + chr(value & 0xff), end='')
#CSSNT{FTT_aeT_AET_Ae}+aE

啊!差了一点,去看看哪里有问题,啊,没找到

#include<stdio.h>

int main()
{
	unsigned int enc[6] = { 0xC11EE75A, 0xA4AD0973, 0xF61C9018, 0x32E37BCD, 0x2DCC1F26, 0x344380CC };
	unsigned int key[4] = { 0x10203, 0x4050607, 0x8090A0B, 0x0C0D0E0F };
	int i, j;
	long sum = 0, delta = 0x61C88647;
	// 解码
	for (i = 0; i < 6; i += 2) {
		sum = 0 - (32 * delta);
		for (j = 0; j < 32; j++) {
			enc[i + 1] -= (((enc[i] >> 5) ^ (16 * enc[i])) + enc[i]) ^ (key[((sum >> 11) & 3)] + sum);
			sum += delta;
			enc[i] -= ((((enc[i + 1] >> 5) ^ (16 * enc[i + 1])) + enc[i + 1]) ^ key[sum & 3] + sum);
		}
	}
	// 打印
	for (i = 0; i < 6; i++)
	{
		for (j = 0; j <= 3; j++)
		{
			printf("%c", (enc[i] >> (j * 8)) & 0xFF);
		}
	}

	return 0;
}

[MoeCTF 2022]ezTea

#include <stdio.h>
#include <stdint.h>

void encrypt (uint32_t* v, uint32_t* k) {                       // 主要加密函数,试着搞定它
    uint32_t v0 = v[0], v1 = v[1], sum = 0;
    uint32_t delta = 0xd33b470;
    for (int i = 0; i < 32; i++) {
        sum += delta;
        v0 += ((v1<<4) + k[0]) ^ (v1 + sum) ^ ((v1>>5) + k[1]);
        v1 += ((v0<<4) + k[2]) ^ (v0 + sum) ^ ((v0>>5) + k[3]);
    }
    v[0] = v0;
    v[1] = v1;
}
void decrypt(uint32_t* v, uint32_t* k) {
    uint32_t v0 = v[0], v1 = v[1], sum = 0;
    uint32_t delta = 0xd33b470*32;
    for (int i = 0; i < 32; i++) {
        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[0] = v0;
    v[1] = v1;
}
int main() {
    uint32_t k[4] = {1, 2, 3, 4};
    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 };
    
    scanf("%32s", input);
    for (int i = 0; i < 32; i+=8) {
        uint32_t v[2] = {*(uint32_t *)&input[i], *(uint32_t *)&input[i+4]};
        decrypt(v, k);
        for (int j = 0; j < 2; j++) {                           // 这一段主要是把 v 按单字节输出,另外可以了解一下 “大小端序” 在这题是如何体现的
            for (int k = 0; k < 4; k++) {
                printf("%#x, ", v[j] & 0xff);
                v[j] >>= 8;
            }
        }
    }
    return 0;
}

直接对照 encrypt()函数来写 decrypt()函数,然后修改一些问题。

#include <stdio.h>
#include <stdint.h>

void encrypt(uint32_t* v, uint32_t* k) {
    uint32_t v0 = v[0], v1 = v[1], sum = 0;
    uint32_t delta = 0xd33b470;
    for (int i = 0; i < 32; i++) {
        sum += delta;
        v0 += ((v1 << 4) + k[0]) ^ (v1 + sum) ^ ((v1 >> 5) + k[1]);
        v1 += ((v0 << 4) + k[2]) ^ (v0 + sum) ^ ((v0 >> 5) + k[3]);
    }
    v[0] = v0;
    v[1] = v1;
}

void decrypt(uint32_t* v, uint32_t* k) {
    uint32_t v0 = v[0], v1 = v[1];
    uint32_t delta = 0xd33b470;
    uint32_t sum = delta * 32;
    for (int i = 0; i < 32; i++) {
        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[0] = v0;
    v[1] = v1;
}
int main() {
    uint32_t k[4] = { 1, 2, 3, 4 };
    uint8_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 };

    //scanf("%32s", input);

    for (int i = 0; i < 32; i += 8) {
        uint32_t v[2] = { *(uint32_t*)&input[i], *(uint32_t*)&input[i + 4] };
        decrypt(v, k);
        for (int j = 0; j < 2; j++) {
            for (int b = 0; b < 4; b++) {
                printf("%c", (v[j] >> (8 * b)) & 0xff);
            }
        }
    }
    return 0;
}
//moectf{Th3_TEA_!S_s0_t4s7y~~!!!}

[HGAME 2023 week1]a_cup_of_tea

难道每一个 Buf2[i]都进行了TEA加密?

 si128 = _mm_load_si128((const __m128i *)&xmmword_1400022B0);

英特尔的 SIMD指令集的一个SSE2指令,从内存中加载一个 128 位的整数向量到一个 __m128i 类型的寄存器中 .

先得到 key

ant='0x45678901345678902345678912345678'[2:]
print(ant)
print(len(ant))
key=[]
for i in range(0,len(ant),8):
    key.append(int(ant[i:i+8],16))
print(key)

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

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

相关文章

JimuReport 积木报表 v1.7.5 版本发布,免费的低代码报表

项目介绍 一款免费的数据可视化报表工具&#xff0c;含报表和大屏设计&#xff0c;像搭建积木一样在线设计报表&#xff01;功能涵盖&#xff0c;数据报表、打印设计、图表报表、大屏设计等&#xff01; Web 版报表设计器&#xff0c;类似于excel操作风格&#xff0c;通过拖拽完…

Java Web学习笔记13——JSON

JavaScript自定义对象 定义格式&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Js-对…

(求一个整数各位数的和)编写程序,读取一个在0和1000之间的整数,并将该整数的各位数字相加。例如:整数是 932,各位数字之和为14。

(求一个整数各位数的和)编写程序&#xff0c;读取一个在0和1000之间的整数&#xff0c;并将该整数 的各位数字相加。例如:整数是 932&#xff0c;各位数字之和为14。 提示:利用操作符%分解数字,然后使用操作符/去掉分解出来的数字。例如: 932%10-2 932/10-93。下面是一个运行示…

如何使用Python提取Excel中固定单元格的内容

正文共&#xff1a;1234 字 31 图&#xff0c;预估阅读时间&#xff1a;1 分钟 之前转载了颜总的Python环境搭建文章&#xff08;Python办公自动化—环境搭建&#xff09;&#xff0c;很久过去了&#xff0c;颜总也没有再更新。现在我有一个需求&#xff0c;就是我手上有大量格…

利用医学Twitter进行病理图像分析的视觉-语言基础模型| 文献速递-视觉通用模型与疾病诊断

Title 题目 A visual–language foundation model for pathology image analysis using medical Twitter 利用医学Twitter进行病理图像分析的视觉-语言基础模型 01 文献速递介绍 缺乏公开可用的医学图像标注是计算研究和教育创新的一个重要障碍。同时&#xff0c;许多医生…

HEXO博客常用命令(自用)

1、配置类命令 预览命令 hexo s 上传本地仓库&#xff1a; hexo g提交&#xff1a; hexo d更换主题&#xff1a;在_config.yml文件中&#xff1a;注意属性后面要跟着 # Extensions ## Plugins: https://hexo.io/plugins/ ## Themes: https://hexo.io/themes/ theme: vola…

进入某个页面时将VUE中的某个Button按钮设置为选中状态

进入某个页面时将VUE中的某个Button按钮设置为选中状态 我想达到的效果如标题所说&#xff0c;目的是为了表示页面展示的内容是由于该按钮被选择的结果。 解决思路是使用VUE中的mounted()钩子函数&#xff0c;在该函数中调用按钮得到焦点方法、按钮被点击方法。具体代码如下&am…

【文献阅读】LORA: LOW-RANK ADAPTATION OF LARGE LANGUAGE MODELS

目录 1. motivation2. overall3. model3.1 low rank parametrized update matrices3.2 applying lora to transformer 4. limitation5. experiment6. 代码参考文献 1. motivation 常规的adaptation需要的微调成本过大现有方法的不足&#xff1a; Adapter Layers Introduce Inf…

RPA机器人流程自动化技术方案(30页PPT)

方案介绍&#xff1a; RPA机器人流程自动化技术方案通过模拟人类在计算机上的操作&#xff0c;实现了业务流程的自动化处理。该方案具有高效性、准确性、易用性、可扩展性和安全性等特点&#xff0c;可以广泛应用于各种业务场景。随着企业信息化水平的不断提高&#xff0c;RPA…

【Linux-buildroot,】

Linux-buildroot, ■ buildroot■ 1、简介■ 2、下载■ 2、编译■ 问题一&#xff1a;buildroot 编译的时候会先从网上下载所需的软件源码&#xff0c;下载cmake-3.8.2.tar.gz或下载很慢的情况 ■ buildroot-构建根文件系统■ 1、配置 buildroot■ 2、■ 3、 ■ buildroot-构建…

[职场] 生活管家的工作要求 #其他#职场发展

生活管家的工作要求 生活管家是一个为人们提供全方位生活管理服务的职业&#xff0c;通过协助处理各类日常事务&#xff0c;为客户提供便利和舒适。他们需要具备良好的沟通、组织和管理能力&#xff0c;同时具备多领域的知识和技能。 一.工作内容 生活管家是一个为人们提供全…

替代UCC28250抗干扰支持预偏置启动|支持半桥全桥|增强型驱动器

1. 产品特性(替代UCC28250) ➢ 支持预偏置启动 ➢ 死区时间可调的同步整流输出 ➢ 支持电压模控制和电流模控制 ➢ 支持源边控制和副边控制 ➢ 5V&#xff0c;精度3%电压输出 ➢ 软启动和打嗝恢复时间可调 ➢ 同步整流软启动阈值和时间可调 ➢ 斜坡补偿信号斜率可调 ➢…

1501 - JUC高并发

须知少许凌云志&#xff0c;曾许人间第一流 看的是尚硅谷的视频做的学习总结&#xff0c;感恩老师&#xff0c;下面是视频的地址 传送门https://www.bilibili.com/video/BV1Kw411Z7dF 0.思维导图 1.JUC简介 1.1 什么是JUC JUC&#xff0c; java.util.concurrent工具包的简称…

自动驾驶仿真(高速道路)LaneKeeping

前言 A high-level decision agent trained by deep reinforcement learning (DRL) performs quantitative interpretation of behavioral planning performed in an autonomous driving (AD) highway simulation. The framework relies on the calculation of SHAP values an…

代码审计(1):CVE-2022-4957分析及复现

0x00漏洞描述&#xff1a; ѕрееdtеѕt iѕ а vеrу liɡhtԝеiɡ&#xff48;t nеtԝоrk ѕрееd tеѕtinɡ tооl imрlеmеntеd in Jаvаѕсriрt. Thеrе iѕ а Crоѕѕ-ѕitе Sсriрtinɡ vulnеrаbilitу in librеѕроndеd ѕрееdtеѕt…

大学侵权责任法试题及答案,分享几个实用搜题和学习工具 #其他#媒体#知识分享

当今社会&#xff0c;技术的发展给我们带来了许多便利&#xff0c;包括了许多实用的学习工具。 1.东西题库 这是一个网站 为学校教师提供试题试卷、课件及教案等服务的题库资源共享型网站&#xff0c;由必刷题、必刷卷教研团队研发与审核&#xff0c;涵盖初高中全学段、全学…

Foxmail邮箱的简单实用

Foxmail邮箱是我们办公邮箱中比较有代表性和使用性的一款邮箱软件&#xff0c;今天笔者为大家介绍一下Foxmail邮箱的功能和使用方法。 1、首先我们从安装Foxmail邮箱开始 2、点击安装等待安装成功 3、双击打开 &#xff0c;出现邮箱设置界面输入我们的账号密码&#xff0c;点击…

轻松解决问题!教你文件怎么解除只读模式!

在日常使用电脑时&#xff0c;我们有时会遇到文件或文件夹被设定为只读模式的情况&#xff0c;这可能会限制我们对文件的修改和编辑。然而&#xff0c;解除只读模式并获得文件的完全控制是一个相对简单的过程&#xff0c;只需要掌握一些基本的技巧和方法。在本文中&#xff0c;…

SpringBootWeb 篇-深入了解 AOP 面向切面编程与 AOP 记录操作日志案例

&#x1f525;博客主页&#xff1a; 【小扳_-CSDN博客】 ❤感谢大家点赞&#x1f44d;收藏⭐评论✍ 文章目录 1.0 AOP 概述 1.1 构造简单 AOP 类 2.0 AOP 核心概念 2.1 AOP 执行流程 3.0 AOP 通知类型 4.0 AOP 通知顺序 4.1 默认按照切面类的类名字母排序 4.2 用 Order(数字) 注…

ubuntu-server(22.04)安装

准备工作 首先我们先从网上获取ubuntu的iso镜像文件 Index of /ubuntu-releases/22.04/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror 我们安装这个最小包即可 找到我们ubuntu安装完成后所需要下载安装源的网址&#xff08;常用是阿里云&#xff09; ubuntu安装…