TEA/XTEA/XXTEA
这个嘛 一般出的都是XTEA XXTEA也是有XXXTEA 那什么是TEA呢 什么又是XTEA呢 下面来揭晓
加密原理
这个TEA没啥好说的 放一个标准回答吧

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

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

XXTEA(Corrected 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;
}
评论