演算法識別(一)--TEA及其魔改

Cia1lo發表於2024-07-23

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則改動較大,需要獲取明文長度,透過明文長度來控制輪數,同時有新的變數控制陣列下標

相關文章