TEA密码系列

TEA / XTEA / XXTEA

TEA

微型加密算法(Tiny Encryption AlgorithmTEA)是一种易于描述和执行的块密码,通常只需要很少的代码就可实现。TEA 操作处理在两个 32 位无符号整型上(可能源于一个 64 位数据),并且使用一个 128 位的密钥。设计者是 Roger NeedhamDavid Wheeler

加解密代码如下:

#include <iostream>

class tea{

public:
    uint32_t delta = 0x9E3779B9;
    void encrypt(uint32_t * v,uint32_t *key);
    void decrypt(uint32_t * v,uint32_t *key);
};

void tea::encrypt(uint32_t *v, uint32_t *key) {
    uint32_t v0=v[0],v1=v[1],i;
    uint32_t k0=key[0],k1=key[1],k2=key[2],k3=key[3];
    uint32_t x=0;
    for(i=0;i<32;i++){
        x += delta;
        v0 += ((v1<<4) + k0) ^ (v1 + x) ^ ((v1>>5) + k1);
        v1 += ((v0<<4) + k2) ^ (v0 + x) ^ ((v0>>5) + k3);
    }
    v[0] = v0;
    v[1] = v1;
}

void tea::decrypt(uint32_t *v, uint32_t *key) {
    uint32_t v0=v[0],v1=v[1],i;
    uint32_t k0=key[0],k1=key[1],k2=key[2],k3=key[3];
    uint32_t x=32*delta;
    for(i=0;i<32;i++){
        v1 -= ((v0<<4) + k2) ^ (v0 + x) ^ ((v0>>5) + k3);
        v0 -= ((v1<<4) + k0) ^ (v1 + x) ^ ((v1>>5) + k1);
        x -= delta;
    }
    v[0] = v0;
    v[1] = v1;
}

int main(){
    char m[] = "flag{hh}";
    uint32_t key[4] = {'2','0','2','4'};
    tea *t = new tea();
    t->encrypt((uint32_t *)m,key);
    std::cout << "加密结果: ";
    for (int i = 0; i < 8; ++i) {
        //std::cout << std::hex << static_cast<int>(static_cast<unsigned char>(m[i])) << " ";
        printf("%02x ",(unsigned char )m[i]);
    }
    std::cout << std::endl;
    t->decrypt((uint32_t *)m,key);
    std::cout << "解密结果: ";
    for (int i = 0; i < 8; ++i) {
        //std::cout << std::hex << static_cast<int>(static_cast<unsigned char>(m[i])) << " ";
        printf("%02x ",(unsigned char )m[i]);
    }
    std::cout << std::endl;
}

XTEA

XTEATEA 的升级版,增加了更多的密钥表,移位和异或操作等等(没看出核心改变...)。

加解密代码如下:

class xtea{
public:
    uint32_t delta = 0x9E3779B9;
    void encrypt(uint32_t * v,uint32_t *key);
    void decrypt(uint32_t * v,uint32_t *key);
};

void xtea::encrypt(uint32_t *v, uint32_t *key) {
    uint32_t v0=v[0],v1=v[1];
    uint32_t x=0;
    for (int i = 0; i < 32; ++i) {
        v0 += (((v1<<4) ^ (v1>>5)) + v1) ^ (x + key[x&3]);
        x += delta;
        v1 += (((v0<<4) ^ (v0>>5)) + v0) ^ (x + key[x&3]);
    }
    v[0] = v0;
    v[1] = v1;
}

void xtea::decrypt(uint32_t *v, uint32_t *key) {
    uint32_t v0=v[0],v1=v[1];
    uint32_t x=32*delta;
    for (int i = 0; i < 32; ++i) {
        v1 -= (((v0<<4) ^ (v0>>5)) + v0) ^ (x + key[x&3]);
        x -= delta;
        v0 -= (((v1<<4) ^ (v1>>5)) + v1) ^ (x + key[x&3]);
    }
    v[0] = v0;
    v[1] = v1;
}

//-------------------------------------------------------------------------
int main(){
    char m[] = "flag{hh}";
    uint32_t key[4] = {'2','0','2','4'};
    xtea *t = new xtea();
    t->encrypt((uint32_t *)m,key);
    std::cout << "加密结果: ";
    for (int i = 0; i < 8; ++i) {
        //std::cout << std::hex << static_cast<int>(static_cast<unsigned char>(m[i])) << " ";
        printf("%02x ",(unsigned char )m[i]);
    }
    std::cout << std::endl;
    t->decrypt((uint32_t *)m,key);
    std::cout << "解密结果: ";
    for (int i = 0; i < 8; ++i) {
        //std::cout << std::hex << static_cast<int>(static_cast<unsigned char>(m[i])) << " ";
        printf("%02x ",(unsigned char )m[i]);
    }
    std::cout << std::endl;
}

XXTEA

XXTEA,又称 Corrected Block TEA,是 XTEA 的升级版。

加解密代码如下:

class xxtea{

public:
    uint32_t delta = 0x9E3779B9;
    void encrypt(uint32_t * v,uint32_t len,uint32_t *key);
    void decrypt(uint32_t * v,uint32_t len,uint32_t *key);

private:
    uint32_t shift(uint32_t z,uint32_t y, uint32_t x, uint32_t *key, uint32_t p, uint32_t e);

};

uint32_t xxtea::shift(uint32_t z, uint32_t y, uint32_t x, uint32_t *key, uint32_t p, uint32_t e) {
    return ((((z >> 5) ^ (y << 2)) + ((y >> 3) ^ (z << 4))) ^ ((x ^ y) + (key[(p & 3) ^ e] ^ z)));
}

void xxtea::encrypt(uint32_t *v , uint32_t len, uint32_t *key) {
    uint32_t rounds = 6 + 52 / len,x=0,e,p,y;
    uint32_t z = v[len-1];
    for (int i = 0; i < rounds; ++i) {
        x += delta;
        e = (x >> 2) & 3;
        for (p = 0; p < len-1; ++p) {
            y = v[p+1];
            v[p] += shift(z,y,x,key,p,e);
            z = v[p];
        }
        //p += 1;
        y = v[0];
        v[len-1] += shift(z,y,x,key,p,e);
        z = v[len-1];
    }
}

void xxtea::decrypt(uint32_t *v, uint32_t len, uint32_t *key) {
    uint32_t rounds = 6 + 52 / len,x,e,p,z;
    uint32_t y = v[0];
    x = rounds * delta;
    for (int i = 0; i < rounds; ++i) {
        e = (x >> 2) & 3;
        for(p=len-1;p > 0;--p){
            z = v[p-1];
            v[p] -= shift(z,y,x,key,p,e);
            y = v[p];
        }
        //p -= 1;
        z = v[len-1];
        v[0] -= shift(z,y,x,key,p,e);
        y = v[0];
        x -= delta;

    }
}

//-------------------------------------------------------------------------
int main(){
    char m[] = "flag{hh}";
    uint32_t key[4] = {'2','0','2','4'};
    xxtea *t = new xxtea();
    t->encrypt((uint32_t *)m,2,key);
    std::cout << "加密结果: ";
    for (int i = 0; i < 8; ++i) {
        //std::cout << std::hex << static_cast<int>(static_cast<unsigned char>(m[i])) << " ";
        printf("%02x ",(unsigned char )m[i]);
    }
    std::cout << std::endl;
    t->decrypt((uint32_t *)m,2,key);
    std::cout << "解密结果: ";
    for (int i = 0; i < 8; ++i) {
        //std::cout << std::hex << static_cast<int>(static_cast<unsigned char>(m[i])) << " ";
        printf("%02x ",(unsigned char )m[i]);
    }
    std::cout << std::endl;
}
posted @ 2024-12-25 14:59  zacsn12  阅读(129)  评论(0)    收藏  举报