#ifndef WORK_TEA_H
#define WORK_TEA_H#endif #include <cstdint>
#include <cstdio>
#define TEA_ROUNDS 32
#define DELTA 0x9e3779b9
void TEA_encrypt(uint32_t* v, const uint32_t* key) {uint32_t v0 = v[0], v1 = v[1];uint32_t sum = 0;for (int i = 0; i < TEA_ROUNDS; i++) {sum += DELTA;v0 += ((v1 << 4) + key[0]) ^ (v1 + sum) ^ ((v1 >> 5) + key[1]);v1 += ((v0 << 4) + key[2]) ^ (v0 + sum) ^ ((v0 >> 5) + key[3]);}v[0] = v0;v[1] = v1;
}
void TEA_decrypt(uint32_t* v, const uint32_t* key) {uint32_t v0 = v[0], v1 = v[1];uint32_t sum = DELTA * TEA_ROUNDS;for (int i = 0; i < TEA_ROUNDS; i++) {v1 -= ((v0 << 4) + key[2]) ^ (v0 + sum) ^ ((v0 >> 5) + key[3]);v0 -= ((v1 << 4) + key[0]) ^ (v1 + sum) ^ ((v1 >> 5) + key[1]);sum -= DELTA;}v[0] = v0;v[1] = v1;
}void TEA_fast_decrypt(uint32_t* data, int data_length, const uint32_t* key) {if (data_length % 2 != 0) {printf("error1输入数组的长度必须是偶数。\n");return;}for (int i = 0; i < data_length; i += 2) {uint32_t v[2] = { data[i], data[i + 1] };TEA_decrypt(v, key);printf("%08x %08x\n", v[0], v[1]);}
}#define XTEA_ROUNDS 64
#define XTEA_DELTA 0x9E3778B9
void XTEA_encrypt(uint32_t* v, const uint32_t* key) {uint32_t v0 = v[0], v1 = v[1];uint32_t sum = 0;for (int i = 0; i < XTEA_ROUNDS; i++) {v0 += ((v1 << 4 ^ v1 >> 5) + v1) ^ (sum + key[sum & 3]);sum += XTEA_DELTA;v1 += ((v0 << 4 ^ v0 >> 5) + v0) ^ (sum + key[(sum >> 11) & 3]);}v[0] = v0;v[1] = v1;
}
void XTEA_decrypt(uint32_t* v, const uint32_t* key) {uint32_t v0 = v[0], v1 = v[1];uint32_t sum = XTEA_DELTA * XTEA_ROUNDS;for (int i = 0; i < XTEA_ROUNDS; i++) {v1 -= (((v0 << 4 ^ v0 >> 5) + v0) ^ (sum + key[(sum >> 11) & 3])) ^ v0;sum -= XTEA_DELTA;v0 -= (((v1 << 4 ^ v1 >> 5) + v1) ^ (sum + key[sum & 3])) ^ v1;}v[0] = v1;v[1] = v0;
}void XTEA_fast_decrypt(uint32_t* data, int data_length, const uint32_t* key) {if (data_length % 2 != 0) {printf("error1输入数组的长度必须是偶数。\n");return;}for (int i = 0; i < data_length; i += 2) {uint32_t v[2] = { data[i], data[i + 1] };XTEA_decrypt(v, key);printf("%08x %08x\n", v[0], v[1]);}
}
#define XXTEA_DELTA 0x9E3779B9
void XXTEA_encrypt(uint32_t *v, int n, const uint32_t k[4]) {if (n < 2) return;uint32_t z = v[n - 1], y = v[0], sum = 0;uint32_t rounds = 6 + 52 / n;for (uint32_t i = 0; i < rounds; i++) {sum += XXTEA_DELTA;uint32_t e = (sum >> 2) & 3;for (uint32_t p = 0; p < n - 1; p++) {y = v[p + 1]; v[p] += ((z >> 5) ^ (y << 2)) + ((y >> 3) ^ (z << 4)) ^ (sum ^ y) + (k[(p & 3) ^ e] ^ z);z = v[p]; }y = v[0]; v[n - 1] += ((z >> 5) ^ (y << 2)) + ((y >> 3) ^ (z << 4)) ^ (sum ^ y) + (k[((n - 1) & 3) ^ e] ^ z);z = v[n - 1]; }
}void XXTEA_decrypt(uint32_t *v, int n, const uint32_t k[4]) {if (n < 2) return;uint32_t z = v[n - 1], y = v[0];uint32_t sum = XXTEA_DELTA * (6 + 52 / n);for (uint32_t i = 0; i < 6 + 52 / n; i++) {uint32_t e = (sum >> 2) & 3;for (uint32_t p = n - 1; p > 0; p--) {z = v[p - 1]; v[p] -= ((z >> 5) ^ (y << 2)) + ((y >> 3) ^ (z << 4)) ^ (sum ^ y) + (k[(p & 3) ^ e] ^ z);y = v[p]; }z = v[n - 1]; v[0] -= ((z >> 5) ^ (y << 2)) + ((y >> 3) ^ (z << 4)) ^ (sum ^ y) + (k[(0 & 3) ^ e] ^ z);y = v[0]; sum -= XXTEA_DELTA;}
}