TEA算法解析

算法之TEA

一丶TEA简介

"TEA" 的全称为"Tiny Encryption Algorithm" 是1994年由英国剑桥大学的David j.wheeler发明的.

TEA算法也算是微型加密算法

其加密流程如下

在安全学领域,TEA(Tiny Encryption Algorithm)是一种分组加密算法,它的实现非常简单,通常只需要很精短的几行代码。TEA 算法最初是由剑桥计算机实验室的 David Wheeler 和 Roger Needham 在 1994 年设计的。 TEA算法使用64位的明文分组和128位的密钥,它使用Feistel分组加密框架,需要进行 64 轮迭代,尽管作者认为 32 轮已经足够了。该算法使用了一个神秘常数δ作为倍数,它来源于黄金比率以保证每一轮加密都不相同。但δ的精确值似乎并不重要,这里 TEA 把它定义为 δ=「(√5 - 1)231」(也就是程序中的 0×9E3779B9)。 之后 TEA 算法被发现存在缺陷,作为回应,设计者提出了一个 TEA 的升级版本——XTEA(有时也被称为“tean”)。XTEA 跟 TEA 使用了相同的简单运算,但它采用了截然不同的顺序,为了阻止密钥表攻击,四个子密钥(在加密过程中,原 128 位的密钥被拆分为 4 个 32 位的子密钥)采用了一种不太正规的方式进行混合,但速度更慢了

二丶加密解密代码演示

加密函数:

void Encrypt(long* EntryData, long* Key)
{
    //分别加密数组中的前四个字节与后4个字节,4个字节为一组每次加密两组
    unsigned long x = EntryData[0];
    unsigned long y = EntryData[1];

    unsigned long sum = 0;
    unsigned long delta = 0x9E3779B9;
    //总共加密32轮
    for (int i = 0; i < 32; i++)
    {
        sum += delta;
        x += ((y << 4) + Key[0]) ^ (y + sum) ^ ((y >> 5) + Key[1]);
        y += ((x << 4) + Key[2]) ^ (x + sum) ^ ((x >> 5) + Key[3]);
    }
    //最后加密的结果重新写入到数组中
    EntryData[0] = x;
    EntryData[1] = y;
}

其实这道题是在做CTF的时候遇到的,弄了半天百思不得其解最终搞出来了,发现其实是TEA算法.

说一下解密的思路吧.

x +=xxx

y+=xxx 这两个公式总共是执行了32轮,可以记做为

(x+=xxx)32

(y+=xxx)32
那么解密的时候肯定也是执行32轮,每次递减,且顺序变换过来
(y-=xxx)
(x-=xxx)
其中这里的xxx就是异或的公式,根据其特性我们不需要改公式中的内容.我们可以看做是 a ^ b ^ c 反过来
c ^ b ^ a 是一样的.
既然倒过来了.我们的变量(黄金分割)32轮的和也要依次递减来进行解密
所以解密算法如下
void Decrypt(long* EntryData, long* Key)
{
    //分别加密数组中的前四个字节与后4个字节,4个字节为一组每次加密两组
    unsigned long x = EntryData[0];
    unsigned long y = EntryData[1];

    unsigned long sum = 0;
    unsigned long delta = 0x9E3779B9;
    sum = delta << 5;   //注意这里,sum = 32轮之后的黄金分割值. 因为我们要反序解密.
    //总共加密32轮 那么反序也解密32轮
    for (int i = 0; i < 32; i++)
    {

// 先将y解开 然后参与运算在解x
        y -= ((x << 4) + Key[2]) ^ (x + sum) ^ ((x >> 5) + Key[3]);
        x -= ((y << 4) + Key[0]) ^ (y + sum) ^ ((y >> 5) + Key[1]);
        sum -= delta;
    }
    //最后加密的结果重新写入到数组中
    EntryData[0] = x;
    EntryData[1] = y;
}

最终实现结果

int main()
{
   
  

    long Data[3] = { 0x44434241,0x48474645,0x0 };
    printf("待加密的数值 = %s\r\n", (char*)Data);

    long key[4] = { 0x11223344,0x55667788,0x99AABBCC,0xDDEEFF11 };

    //Encrypt每次只是加密4字节数组中的两组(也就是每次加密8个字节) 如果你数据多.可以来个for循环来循环加密,但是Entrypt内部还有32次循环,所以速度上还是会有点影响.
    Encrypt(Data, key);
    printf("加密后的数值 = %s\r\n", (char*)Data);
    Decrypt(Data, key);
    printf("解密后的数值 = %s\r\n", (char*)Data);
    system("pause");
}

实现结果

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 使用tea算法对数据进行加密

        对QQ协议进行分析过的同学可能知道,QQ的数据传输是使用tea算法进行的加密。

    phith0n
  • 逆向实战|DASCTF_2021_re

    题目为drinksome tea,注意这个tea,作为一个提示,该题目全程用tea来作为名称

    辞令
  • TS 设计模式01 - 工厂模式

    工厂,在现实中是生产产品的地方。在 oop 中,就是生产对象的地方。其核心是封装一个生产(new)行为。

    love丁酥酥
  • 模板方法模式.

    我们打算定义一个咖啡因饮料冲泡流程,把流程中相同的步骤放在一起,同时,不同的饮料还能有自己的具体实现。

    JMCui
  • QQ协议深度解析(一)

    本篇文章主要讲述PC QQ协议的入门和腾讯的迷惑操作 Warning:如果没有一定协议基础看此类文章会觉得很魔幻

    月萌
  • C++实现对16进制字符串和字节数组的tea加密和解密算法

    TEA(Tiny Encryption Algorithm) 是一种简单高效的加密算法,以加密解密速度快,实现简单著称。算法真的很简单,TEA算法每一次可以操作...

    ccf19881030
  • python设计模式-模板方法模式

    仔细看上边两端代码会发现,茶和咖啡的实现方式基本类似,都有prepare_recipe,boil_water,pour_in_cup 这三个方法。

    goodspeed
  • JavaScript设计模式--模板方法模式

    模板方法是基于继承的设计模式,可以很好的提高系统的扩展性。 java中的抽象父类、子类 模板方法有两部分结构组成,第一部分是抽象父类,第二部分是具体的实现子类...

    奋飛
  • 享元模式浅析

    面向对象技术可以很好地解决一些灵活性或可以扩展性问题,但是很多情况下需要在系统中增加类和对象的个数。当对象数量太多时,将导致对象创建以及垃圾回收的代价过高,造成...

    孟君
  • Java设计模式学习记录-外观模式

    这次要介绍的是外观模式(也称为门面模式),外观模式也属于结构型模式,其实外观模式还是非常好理解的,简单的来讲就是将多个复杂的业务封装成一个方法,在调用此方法时可...

    纪莫
  • C++实现对16进制字符串和字节数组的tea加密和解密算法

    [TEA(Tiny Encryption Algorithm) ](https://en.wikipedia.org/wiki/Tiny_Encryption_...

    ccf19881030
  • 设计模式之生活中的模板模式

    在讲模板模式原理前,我们按照惯例,先来个生活中例子。茶馆需要开发一个自动的泡咖啡和泡茶的程序。

    凯哥Java
  • 设计模式之模板方法模式(一)

    学习了前面的朋友都知道,目前为止,我们的议题都是绕着封装转;我们已经封装了对象创建、方法调用、复杂接口、鸭子、比萨…那接下来呢?

    程序员小跃
  • 设计模式,一看就懂的桥模式,解耦可变量与主体逻辑

    桥模式的主要功能也是解耦,把会独立变化的量从整个逻辑中抽离出来,从而节省我们的代码量。我们用奶茶来举个简单的例子。

    TechFlow-承志
  • 设计模式之模板方法模式(二)

    上一篇我们已经学会了模板方法模式,这次我们继续来深入学习下。毕竟学会只是第一步,还有更进一步的学习和深入等着我们呢。

    程序员小跃
  • Golang语言情怀-第22期 Go 语言设计模式 装饰

    抽象构件(Component) 表示“被”装饰的本体的抽象定义,这个定义通常是一个接口(Interface),定义了若干方法(能力),这些方法可以用来在被具体装...

    李海彬
  • 实战案例浅析JS加密 - RSA与XXTEA

    尝试了上面流程里面列举的可能的参数名,并没有发现有用的信息,所以试了下直接搜索password关键字,找到一个可能和登陆相关的文件,搜索发现疑似的加密代码:

    咸鱼学Python
  • 模板方法模式

    《Head First Design Pattern》中的英文定义:The Template Method defines the skeleton of a...

    卡尔曼和玻尔兹曼谁曼
  • javascript设计模式七:模板方法模式

    模板方法模式,是一种典型的通过封装变化提高系统扩展性的设计模式。在传统的面向对象语言中,一个运用了模板方法模式的程序中,子类的方法种类和执行顺序都是基本不变的,...

    前端_AWhile

扫码关注云+社区

领取腾讯云代金券