算法识别(一)--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则改动较大,需要获取明文长度,通过明文长度来控制轮数,同时有新的变量控制数组下标