TEA篇

吐槽

搞完分组加密再看tea真的是神清气爽

TEA

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
int main() {
uint32_t sum, i;
uint32_t delta = 0x114514;
uint32_t enc[10] = {0x78C594AB,0x22813B59,0x472A3144,0xF255108A,0x45CFB34,0x3949EA0C,
0xCB760968,0x1559C979,0xDEF9929D,0x71D1AAB};
unsigned int k[4] = {0x11451419,0x19810114,0x51419198,0x10114514};
for (int m=0;m<10;m+=2)
{
sum = delta*32;
for (i = 0; i < 32; i++) {
enc[m + 1] -= (k[3] + (enc[m] >> 5)) ^ (sum + enc[m]) ^ (k[2] + 16 * enc[m]);
enc[m] -= (k[1] + (enc[m + 1] >> 5)) ^ (sum + enc[m + 1]) ^ (*k + 16 * enc[m + 1]);
sum -= delta;
}
}
for (int i=0;i<10;i++)
{
for(int m=0;m<=3;m++)
{
printf("%c",(enc[i]>>(m*8))&0xff);
}
}
system("\npause");
}

XTEA

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
void decrypt(uint32_t v[2], uint32_t const key[4]) {
unsigned int i;
uint32_t v0 = v[0], v1 = v[1], delta = 0x9E3779B9, sum = delta * (-32);
for (i=0; i < 32; i++) {
v1 -= (((v0 << 4) ^ (v0 >> 5)) + v0) ^ (sum + key[(sum>>11) & 3]);
sum += delta;
v0 -= (((v1 << 4) ^ (v1 >> 5)) + v1) ^ (sum + key[sum & 3]);

}
v[0] = v0; v[1] = v1;
}

int main() {
uint32_t const k[4] = {0x19f8,0x11be,0x991,0x3418};
uint32_t enc[] = {0x8ccb2324,0x9a7741a,0xfb3c678d,0xf6083a79,0xf1cc241b,0x39fa59f2,0xf2abe1cc,0x17189f72};
for(int i=6; i>=0; i-=1){ //倒着解密
decrypt(&enc[i], k);
}
for (int i = 0; i < 8; i++) {
for (int m = 3; m>=0; m--) {
printf("%c", (enc[i] >> (8 * m)) & 0xff);
}
}
system("\npause");
return 0;
}

XXTEA

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
#include <stdio.h>
#include <stdint.h>
#include <string.h>
#include <stdlib.h>
#define DELTA 0x9E3779B9
#define MX (((z>>5^y<<2) + (y>>3^z<<4)) ^ ((sum^y) + (key[(p&3)^e] ^ z)))

void btea(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() {
uint32_t v[10] = {0x5D624C34, 0x8629FEAD, 0x9D11379B, 0xFCD53211, 0x460F63CE,
0xC5816E68, 0xFE5300AD, 0x0A0015EE, 0x9806DBBB, 0xEF4A2648};
uint32_t k[4] = {0x63656F6D, 0x21216674, 0x12345678, 0x9ABCDEF0};
int n = 10;
btea(v, -n, k);
for (int i = 0; i < 10; i++) {
printf("%c", v[i] & 0xff);
printf("%c", v[i] >> 8 & 0xff);
printf("%c", v[i] >> 16 & 0xff);
printf("%c", v[i] >> 24 & 0xff);
}
printf("\n");
system("pause");
return 0;
}

TEA篇
https://alenirving.github.io/2025/09/30/TEA篇/
作者
Ma5k
许可协议
CC-BY-NC-SA