这个嘛 一般出的都是XTEA XXTEA也是有XXXTEA 那什么是TEA呢 什么又是XTEA呢 下面来揭晓

加密原理

这个TEA没啥好说的 放一个标准回答吧

image

"TEA" 的全称为"Tiny Encryption Algorithm" 1994年由英国剑桥大学的David j.wheeler发明的TEA算法也算是一种微型加密算法的
在安全学领域,TEATiny Encryption  Algorithm)是一种分组加密算法,它的实现非常简单,通常只需要很精短的几行代码。TEA 算法最初是由剑桥计算机实验室的 David  Wheeler  Roger Needham  1994 年设计的。
TEA算法使用64位的明文分组和128位的密钥,它使用Feistel分组加密框架,需要进行 64 轮迭代,尽管作者认为 32 轮已经足够了。该算法使用了一个神秘常数δ作为倍数,它来源于黄金比率,以保证每一轮加密都不相同。但δ的精确值似乎并不重要,这里 TEA 把它定义为 δ=(5 - 1)231」(也就是程序中的 0×9E3779B9)。

XTEA 也就是相当于魔改的TEA

image

之后 TEA 算法被发现存在缺陷,作为回应,设计者提出了一个 TEA 的升级版本——XTEA(有时也被称为“tean”)。XTEA  TEA 使用了相同的简单运算,但它采用了截然不同的顺序,为了阻止密钥表攻击,四个子密钥(在加密过程中,原 128 位的密钥被拆分为 4  32 位的子密钥)采用了一种不太正规的方式进行混合,但速度更慢了

XXTEA

image

XXTEACorrected Block TEA)是 Tiny Encryption Algorithm (TEA) 家族中安全性最高、设计最完善的一个版本。它由 Roger Needham  David Wheeler  1998 年提出,旨在修复 TEA  XTEA 中存在的安全性缺陷。
与它的前辈们不同,XXTEA 是一种分组大小可变的分组密码,它不再局限于 64 位(8 字节)的分组,而是可以对任何长度(至少为两个 32 位字,即 64 位)的数据块进行整体加密。

代码实现

TEA

#include <stdio.h>
#include <stdint.h>

// TEA 加密函数
void encrypt_tea(uint32_t* v, uint32_t* k) {
    uint32_t v0 = v[0], v1 = v[1], sum = 0;
    uint32_t delta = 0x9E3779B9; // 黄金分割率常数
    
    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;
}

// TEA 解密函数
void decrypt_tea(uint32_t* v, uint32_t* k) {
    uint32_t v0 = v[0], v1 = v[1];
    uint32_t delta = 0x9E3779B9;
    uint32_t sum = delta * 32; // 初始值为 delta * 轮数
    
    for (int i = 0; i < 32; 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;
}

int main() {
    // 待加密的 64 位数据(分为两个 32 位无符号整数)
    uint32_t data[2] = {0x12345678, 0x9ABCDEF0};
    // 128 位密钥(分为四个 32 位无符号整数)
    uint32_t key[4] = {0x11111111, 0x22222222, 0x33333333, 0x44444444};

    printf("--- TEA 算法演示 ---\n");
    printf("原始数据: 0x%08X 0x%08X\n", data[0], data[1]);

    encrypt_tea(data, key);
    printf("加密后:   0x%08X 0x%08X\n", data[0], data[1]);

    decrypt_tea(data, key);
    printf("解密后:   0x%08X 0x%08X\n", data[0], data[1]);

    return 0;
}

XTEA

#include <stdio.h>
#include <stdint.h>

// XTEA 加密函数
// num_rounds 通常建议为 32 轮
void encrypt_xtea(unsigned int num_rounds, uint32_t v[2], uint32_t const k[4]) {
    uint32_t v0 = v[0], v1 = v[1], sum = 0;
    uint32_t delta = 0x9E3779B9;
    
    for (unsigned int i = 0; i < num_rounds; i++) {
        // 根据 sum 的值动态选择密钥索引
        v0 += (((v1 << 4) ^ (v1 >> 5)) + v1) ^ (sum + k[sum & 3]);
        sum += delta;
        v1 += (((v0 << 4) ^ (v0 >> 5)) + v0) ^ (sum + k[(sum >> 11) & 3]);
    }
    v[0] = v0; v[1] = v1;
}

// XTEA 解密函数
void decrypt_xtea(unsigned int num_rounds, uint32_t v[2], uint32_t const k[4]) {
    uint32_t v0 = v[0], v1 = v[1];
    uint32_t delta = 0x9E3779B9;
    uint32_t sum = delta * num_rounds;
    
    for (unsigned int i = 0; i < num_rounds; i++) {
        v1 -= (((v0 << 4) ^ (v0 >> 5)) + v0) ^ (sum + k[(sum >> 11) & 3]);
        sum -= delta;
        v0 -= (((v1 << 4) ^ (v1 >> 5)) + v1) ^ (sum + k[sum & 3]);
    }
    v[0] = v0; v[1] = v1;
}

int main() {
    uint32_t data[2] = {0xDEADBEEF, 0xCAFEBABE};
    uint32_t key[4] = {0xA5A5A5A5, 0x5A5A5A5A, 0x12345678, 0x87654321};
    unsigned int rounds = 32;

    printf("--- XTEA 算法演示 ---\n");
    printf("原始数据: 0x%08X 0x%08X\n", data[0], data[1]);

    encrypt_xtea(rounds, data, key);
    printf("加密后:   0x%08X 0x%08X\n", data[0], data[1]);

    decrypt_xtea(rounds, data, key);
    printf("解密后:   0x%08X 0x%08X\n", data[0], data[1]);

    return 0;
}

XXTEA

#include <stdio.h>
#include <stdint.h>

// 定义 XXTEA 所需的宏
#define DELTA 0x9e3779b9
#define MX (((z>>5^y<<2) + (y>>3^z<<4)) ^ ((sum^y) + (key[(p&3)^e] ^ z)))

/**
 * XXTEA 核心算法
 * @param v:   指向 32位无符号整数数组的指针(待处理数据)
 * @param n:   数据长度。
 * n > 1 表示加密,n 是数组元素个数。
 * n < -1 表示解密,-n 是数组元素个数。
 * @param key: 128位密钥,由 4 个 32 位整数组成。
 */
void xxtea(uint32_t *v, int n, uint32_t const key[4]) {
    uint32_t y, z, sum;
    unsigned p, rounds, e;

    if (n > 1) {            /* 加密过程 */
        rounds = 6 + 52 / n;
        sum = 0;
        z = v[n - 1];
        do {
            sum += DELTA;
            e = (sum >> 2) & 3;
            for (p = 0; p < n - 1; p++) {
                y = v[p + 1];
                z = v[p] += MX;
            }
            y = v[0];
            z = v[n - 1] += MX;
        } while (--rounds);
    } 
    else if (n < -1) {      /* 解密过程 */
        n = -n;
        rounds = 6 + 52 / n;
        sum = rounds * DELTA;
        y = v[0];
        do {
            e = (sum >> 2) & 3;
            for (p = n - 1; p > 0; p--) {
                z = v[p - 1];
                y = v[p] -= MX;
            }
            z = v[n - 1];
            y = v[0] -= MX;
            sum -= DELTA;
        } while (--rounds);
    }
}

int main() {
    // 待加密数据:XXTEA 支持变长,这里演示 3 个 32位字(12字节)
    uint32_t data[] = {0x11111111, 0x22222222, 0x33333333};
    int n = sizeof(data) / sizeof(uint32_t);
    
    // 128位密钥
    uint32_t key[4] = {0x01234567, 0x89ABCDEF, 0xFEDCBA98, 0x76543210};

    printf("--- XXTEA 算法演示 ---\n");
    printf("原始数据: ");
    for(int i=0; i<n; i++) printf("0x%08X ", data[i]);
    printf("\n");

    // 加密:n 为正数
    xxtea(data, n, key);
    printf("加密后:   ");
    for(int i=0; i<n; i++) printf("0x%08X ", data[i]);
    printf("\n");

    // 解密:n 传负数
    xxtea(data, -n, key);
    printf("解密后:   ");
    for(int i=0; i<n; i++) printf("0x%08X ", data[i]);
    printf("\n");

    return 0;
}