算法识别(一)--TEA及其魔改

0x01 算法概要

TEA(tiny encryption algorithm),属于分组算法,每次操作64位数,分成2个4字节无符号整数(unsigned int),密钥128位,为4个4字节无符号整型(unsigned int),delta(unsigned int)一般为0x9e3779b9,进行轮数一般>=32轮.

0x02 算法实现

c实现

#include <cstdint>


unsigned int delta=0x9e3779b9;
using namespace std;
//flag{c0ng3atu1a_ezTEA!!}
void encrypt(uint32_t* v,const uint32_t *k)
{
    unsigned int sum=0;
    uint32_t v0=v[0];
    uint32_t v1=v[1];
    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,const uint32_t *k)
{
    uint32_t v1,v0;
    uint32_t delta=0x9e3779b9;
    uint32_t sum=delta*32;
    v0=v[0], v1=v[1];
    for (int i=31;i>=0;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;
    /*
     * 关于输出,printf("%x")将整个数组输出,然后进行16进制转换字符串
     */
}

0x03 魔改部分

1.对delta进行修改

可能将delta的值进行其他操作

2.修改加密轮数

加密轮数可能大于32轮

3.对密钥进行修改

每次加密时可能对密钥进行一定的修改

0x04 关于衍生

在TEA算法的基础上又进行了派生,如XTEA以及XXTEA,XTEA的加密逻辑仍然大体相同,只是在进行加密操作时运算进行了改动,XXTEA则改动较大,需要获取明文长度,通过明文长度来控制轮数,同时有新的变量控制数组下标

posted @ 2024-07-23 11:58  Cia1lo  阅读(28)  评论(0编辑  收藏  举报