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--) {
sum-=delta;
v1-=((v0<<=4)+k[2])^(v0+sum)^((v0>>5)+k[3]);
v0=((v1<<=4)+k[0])^(v1+sum)^((v1>>5)+k[1]);
}
v[0]=v0,v[1]=v1;
/*
* 關於輸出,printf("%x")將整個陣列輸出,然後進行16進位制轉換字串
*/
}
0x03 魔改部分
1.對delta進行修改
可能將delta的值進行其他操作
2.修改加密輪數
加密輪數可能大於32輪
3.對金鑰進行修改
每次加密時可能對金鑰進行一定的修改
0x04 關於衍生
在TEA演算法的基礎上又進行了派生,如XTEA以及XXTEA,XTEA的加密邏輯仍然大體相同,只是在進行加密操作時運算進行了改動,XXTEA則改動較大,需要獲取明文長度,透過明文長度來控制輪數,同時有新的變數控制陣列下標