TEA与XTEA算法:

news/2025/3/28 6:32:05/文章来源:https://www.cnblogs.com/msjs/p/18784729

TEA算法使用64位的明文分组和128位的密钥,它使用Feistel分组加密框架,需要进行 64 轮迭代,尽管作者认为 32 轮已经足够了。该算法使用了一个神秘常数δ作为倍数,它来源于黄金比率,以保证每一轮加密都不相同。但δ的精确值似乎并不重要,这里 TEA 把它定义为 δ=「(√5 - 1)231」(也就是程序中的 0×9E3779B9

简单的说就是,TEA加密解密是以原文以8字节(64位bit)为一组,密钥16字节(128位bit)为一组,(char为1字节,int为4字节,double为8字节),该算法加密轮次可变,作者建议为32轮,因为被加密的明文为64位,所以最终加密的结果也是64位。

代码实现:

加密:

void encry(unsigned int *v,unsigned int *k){unsigned int v0=v[0],v1=v[1];unsigned sum=0;unsigned k0=k[0],k1=k[1],k2=k[2],k3=k[3];unsigned int delta = 0x9e3779b9;for(int i=0;i<32;i++){sum+=delta;v0+=((v1<<4)+k0)^(v1+sum)^((v1>>5)+k1);v1+=((v0<<4)+k2)^(v0+sum)^((v0>>5)+k3);}v[0]=v0;v[1]=v1;
}

解密:

void decry(unsigned int *v,unsigned int *k){unsigned int v0=v[0],v1=v[1],sum=0xC6EF3720;unsigned k0=k[0],k1=k[1],k2=k[2],k3=k[3];unsigned int delta = 0x9e3779b9;for(int i=0;i<32;i++){v1-=((v0<<4)+k2)^(v0+sum)^((v0>>5)+k3);v0-=((v1<<4)+k0)^(v1+sum)^((v1>>5)+k1);sum-=delta;}v[0]=v0;v[1]=v1;}

完整代码:

测试用例:v[]={1,567},k[]={2,2,3,4}

#include <iostream>
#include <string>
#include <queue>
using namespace std;
void encry(unsigned int *v,unsigned int *k){unsigned int v0=v[0],v1=v[1];unsigned sum=0;unsigned k0=k[0],k1=k[1],k2=k[2],k3=k[3];unsigned int delta = 0x9e3779b9;for(int i=0;i<32;i++){sum+=delta;v0+=((v1<<4)+k0)^(v1+sum)^((v1>>5)+k1);v1+=((v0<<4)+k2)^(v0+sum)^((v0>>5)+k3);}v[0]=v0;v[1]=v1;
}
void decry(unsigned int *v,unsigned int *k){unsigned int v0=v[0],v1=v[1],sum=0xC6EF3720;unsigned k0=k[0],k1=k[1],k2=k[2],k3=k[3];unsigned int delta = 0x9e3779b9;for(int i=0;i<32;i++){v1-=((v0<<4)+k2)^(v0+sum)^((v0>>5)+k3);v0-=((v1<<4)+k0)^(v1+sum)^((v1>>5)+k1);sum-=delta;}v[0]=v0;v[1]=v1;}
int main(){unsigned int v[2]={1,567};unsigned int k[4]={2,2,3,4};encry(v,k);cout<<v[0]<<" "<<v[1]<<endl; decry(v,k);cout<<v[0]<<" "<<v[1]<<endl;}

注意事项:

detla 可以为任意值,解密的sum必须等于32*detla
<<与>>后的数可以为任意值,只要加密的与解密的相等即可。
v[]中的内容是32位的,两个加一起是64位。

例子:

2025HnuSec寒假招新ez_so

WP:

典型的TEA算法

密文。

当时做的时候看到这里就不会了,不是应该一次加密2组数吗,有三组数什么回事,而且这大小也不对吧,

使用Shift+E提取数据:

这感觉这也不对啊,当时也没好好做,也没有去学习TEA的原理,什么也看不出来,等后面官方WP出来后,也看不懂那12个数是怎么来的,现在终于明白了。

xmmword是一个128位的数据块,正好可以分成4个数据,两组V。

例如第一个:xmmword_5A0 xmmword 0ADCFB94655774D31F09B1CD9828FE749h

可以分为:ADCFB946 55774D31 F09B1CD 9828FE749

我不太理解为什么要逆序的来放.(这是小端序)

9828FE749 F09B1CD 55774D31 ADCFB946

这样就行了,但很费手

其他同理

exp:

#include <iostream>
using namespace std;
void decry(unsigned int *v,unsigned int *k,int n){unsigned int v0=v[n],v1=v[n+1],sum=0xC6EF3720;unsigned k0=k[0],k1=k[1],k2=k[2],k3=k[3];unsigned int delta = 0x9e3779b9;for(int i=0;i<32;i++){v1-=((v0<<4)+k2)^(v0+sum)^((v0>>5)+k3);v0-=((v1<<4)+k0)^(v1+sum)^((v1>>5)+k1);sum-=delta;}v[n]=v0;v[n+1]=v1;}
int main(){unsigned int v[12] = {0x828fe749, 0xf09b1cd9, 0x55774d31, 0xadcfb946,0x8d1c0b0, 0x8821441d, 0xa124ff59, 0x520f4848, 0xa124ff59, 0x520f4848,0x1214b05a, 0x5fc89b6b};unsigned int k[4]={1668048215, 1415933295, 2003127919, 1918989395};
for (int i=0;i<12;i+=2){decry(v,k,i);
}
for (int i=0;i<12;i++){char c = static_cast<char>(v[i]);cout<<c;
}}

flag{ohhhhh}

XTEA:

XTEA算法与TEA算法最大不同的是对密钥的运用,在TEA算法中,密钥是直接暴露的,而在XTEA中,密钥的运用是采取流的方式,不再固定,此外就是异或顺序的更改,其他的就没有什么区别了。

代码实现:

加密:

void encrypt(uint32_t *v,uint32_t *k,unsigned int n,int rounds){uint32_t v0=v[n],v1=v[n+1];uint32_t sum=0;uint32_t delta = 0x9E3779B9;for(int i = 0;i<rounds;i++){v0 += ((v1<<4)^(v1>>5)+v1)^(sum+k[sum&3]);sum += delta;v1 += ((v0<<4)^(v0>>5)+v0)^(sum+k[(sum>>11)&3]);}v[n]=v0;v[n+1]=v1;
}

解密:

void decrypt (uint32_t *v,uint32_t *k,unsigned int n,int rounds){uint32_t v0=v[n],v1=v[n+1];uint32_t sum=0xC6EF3720;uint32_t delta = 0x9E3779B9;for(int i = 0;i<rounds;i++){v1 -= ((v0<<4)^(v0>>5)+v0)^(sum+k[(sum>>11)&3]);sum -= delta;v0 -= ((v1<<4)^(v1>>5)+v1)^(sum+k[sum&3]);}v[n]=v0;v[n+1]=v1;
}

完整代码:

#include <iostream>
#include <cstdint>
using namespace std;void encrypt(uint32_t *v,uint32_t *k,unsigned int n,int rounds){uint32_t v0=v[n],v1=v[n+1];uint32_t sum=0;uint32_t delta = 0x9E3779B9;for(int i = 0;i<rounds;i++){v0 += ((v1<<4)^(v1>>5)+v1)^(sum+k[sum&3]);sum += delta;v1 += ((v0<<4)^(v0>>5)+v0)^(sum+k[(sum>>11)&3]);}v[n]=v0;v[n+1]=v1;
}
void decrypt (uint32_t *v,uint32_t *k,unsigned int n,int rounds){uint32_t v0=v[n],v1=v[n+1];uint32_t sum=0xC6EF3720;uint32_t delta = 0x9E3779B9;for(int i = 0;i<rounds;i++){v1 -= ((v0<<4)^(v0>>5)+v0)^(sum+k[(sum>>11)&3]);sum -= delta;v0 -= ((v1<<4)^(v1>>5)+v1)^(sum+k[sum&3]);}v[n]=v0;v[n+1]=v1;
}
int main(){uint32_t v[]={5,25};uint32_t k[]={1,2,3,4};encrypt(v,k,0,32);cout<<v[0]<<" "<<v[1]<<endl;decrypt(v,k,0,32);cout<<v[0]<<" "<<v[1]<<endl;
}

测试用例为5,25,密钥为 1,2,3,4

注意事项:

detla 可以为任意值,解密的sum必须等于32*detla
<<与>>后的数可以为任意值,只要加密的与解密的相等即可。
v[]中的内容是32位的,两个加一起是64位。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ui中的控件stackwidget如何拖拽添加widget

QStackedWidget界面的操作步骤-百度经验

UPX加壳原理,加壳及去壳:

加壳: 先写一个简单的代码:生成text.exe文件,然后把这个文件放到与upx同一个文件夹里: 输入指令./upx text.exe 即可加壳 使用IDA打开,可以明显发现被upx加壳了,其大小也由原来的55kb压缩到42KB: 去壳: 工具去壳: 使用指令./upx -d text.exe即可脱壳大小也变回去了,用…

vscode remote ssh内存异常占用高问题

参考:https://blog.csdn.net/sigmarising/article/details/107615035 点开设置搜索search.follow。在用户/远程/工作区都取消勾选Follow Symlinks,如图所示。

Hook(钩子技术)

一.介绍 1.当代码执行到某行时,获取寄存器值和内存里的值,进行调试分析,例如hook明文包. 2.当代码执行到某行时,插入想执行的代码.例如迅雷拦截发包函数. 3.当代码执行到某行时,修改寄存器,达到某些篡改目的. 拿FishingKit这道题举例就是本来运行流程是: a--->b 而使用了H…

2024年1月Java项目开发指南20:windows下使用Nignx部署应用

命令 启动start nginx重新加载配置文件 nginx -s reload nginx -t修改配置后执行上面两个语句下载地址 https://nginx.org/en/download.html 部署Vue项目 1 打包Vue项目 得到dist文件件 2 启动Nginx,访问localhost 注意:Nginx需要占用80端口。 启动后访问localhost,成功后如…

Z3-solve 求解器(SMT求解器)解方程:

Int(name, ctx=None),创建一个整数变量,name是名字 Ints (names, ctx=None),创建多个整数变量,names是空格分隔名字 IntVal (val, ctx=None),创建一个整数常量,有初始值,没名字。 对于实数类型的API与整数类型一致,向量(BitVec)则稍有区别: Bitvec(name,bv,ctx=None),…

CSS 如何设置父元素的透明度而不影响子元素的透明度

CSS 如何设置父元素的透明度而不影响子元素的透明度CSS 如何设置父元素的透明度而不影响子元素的透明度 在 CSS 中,设置父元素的透明度(如通过 opacity 属性)会影响所有子元素的透明度,因为 opacity 是作用于整个元素及其内容的。如果想让父元素透明但不影响子元素的透明度…

ASE20N40-ASEMI工业电源专用ASE20N40

ASE20N40-ASEMI工业电源专用ASE20N40编辑:LL ASE20N40-ASEMI工业电源专用ASE20N40 型号:ASE20N40 品牌:ASEMI 封装:TO-220 最大漏源电流:20A 漏源击穿电压:400V 批号:最新 RDS(ON)Max:216mΩ 引脚数量:3 沟道类型:N沟道MOS管 封装尺寸:如图 特性:MOS管、N沟道MO…

GreatSQL 为何选择全表扫描而不选索引

GreatSQL 为何选择全表扫描而不选索引 1. 问题背景 在生产环境中,发现某些查询即使有索引,也没有使用索引,反而选择了全表扫描。这种现象的根本原因在于优化器评估索引扫描的成本时,认为使用索引的成本高于全表扫描。 2. 场景复现 2.1 环境信息机器 IP:192.168.137.120 Gr…

Profibus DP转EtherCAT实例展示欧姆龙PLC对接西门子变频器操作

一. 案例背景 在一个小型工厂,现场设备需求是Profibus DP转EtherCAT,两端设备分别是西门子变频器和欧姆龙PLC通讯,。为提高现场的工作效率,采纳捷米特JM-DPM-ECT网关模块来实现数据的互联互通。二.设备介绍 1.欧姆龙PLC 欧姆龙PLC是一种功能完善的紧凑型PLC,能为业界领先的…

bayaim-如何保证Redis中的数据都是热点数据?

——————————————————————————————————————————————————— ---- bayaim,申明:本文摘自:https://mp.weixin.qq.com/s?__biz=MzAwNDUxOTQ5MQ==&mid=2247623691&idx=1&sn=35e1b6e9206458f9fcd99e48bebccc13&…

translator

import streamlit as st import time import base64 from streamlit.components.v1 import html# 自定义CSS样式 def set_custom_style():st.markdown(""" <style>/* 页面背景:浅色渐变,提高可读性 */.main {background: linear-gradient(135deg, #E0F7…