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
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
|
c
#include <stdio.h>
#include <stdint.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) /* Encoding Part */
{
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) /* Decoding Part */
{
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[2]= {1,2};
uint32_t const k[4]= {2,2,3,4};
int n= 2; //n的绝对值表示v的长度,取正表示加密,取负表示解密
// v为要加密的数据是两个32位无符号整数
// k为加密解密密钥,为4个32位无符号整数,即密钥长度为128位
printf("加密前原始数据:%u %u\n",v[0],v[1]);
btea(v, n, k);
printf("加密后的数据:%u %u\n",v[0],v[1]);
btea(v, -n, k);
printf("解密后的数据:%u %u\n",v[0],v[1]);
return 0;
}
//////////////////////同x/////////////////////////////
#include <stdint.h>
/* XXTEA加密算法的加密过程 */
void xxtea_encrypt(uint32_t *v, int n, uint32_t *key) {
uint32_t y, z, sum, delta, e;
uint32_t p, q, rounds, limit;
uint32_t *k = key;
rounds = 6 + 52 / n; // 计算加密轮数
sum = 0;
delta = 0x9E3779B9; // 初始化delta常数
limit = rounds * delta; // 计算sum的最大值
q = 6 + limit / delta;
while (q-- > 0) { // 执行加密轮数
sum += delta; // 更新sum
e = sum >> 2 & 3; // 计算e值
for (p = 0; p < n; p++) { // 对每个数据块执行加密操作
y = v[(p + 1) % n];
z = v[p] += ((v[(p + n - 1) % n] >> 5) ^ (y << 2)) + ((y >> 3) ^ (v[(p + n - 1) % n] << 4)) ^ ((sum ^ y) + (k[(p ^ e) & 3] ^ v[(p + n - 1) % n]));
// 计算加密后的数据块
}
}
}
/* XXTEA加密算法的解密过程 */
void xxtea_decrypt(uint32_t *v, int n, uint32_t *key) {
uint32_t y, z, sum, delta, e;
uint32_t p, q, rounds, limit;
uint32_t *k = key;
rounds = 6 + 52 / n; // 计算加密轮数
sum = rounds * 0x9E3779B9; // 初始化sum常数
delta = 0x9E3779B9; // 初始化delta常数
limit = rounds * delta; // 计算sum的最大值
q = 6 + limit / delta;
while (q-- > 0) { // 执行加密轮数
e = sum >> 2 & 3; // 计算e值
for (p = n - 1; p > 0; p--) { // 对每个数据块执行解密操作
z = v[(p + n - 1) % n];
y = v[p] -= ((v[(p + n - 1) % n] >> 5) ^ (v[(p + 1) % n] << 2)) + ((v[(p + 1) % n] >> 3) ^ (v[(p + n - 1) % n] << 4)) ^ ((sum ^ v[(p + 1) % n]) + (k[(p ^ e) & 3] ^ v[(p + n - 1) % n]));
// 计算解密后的数据块
}
z = v[(n + n - 1) % n];
y = v[0] -= ((v[(n + n - 1) % n] >> 5) ^ (v[(1) % n] << 2)) + ((v[(1) % n] >> 3) ^ (v[(n + n - 1) % n] << 4)) ^ ((sum ^ v[(1) % n]) + (k[(0 ^ e) & 3] ^ v[(n + n - 1) % n]));
// 特殊处理第一个和最后一个数据块
sum -= delta; // 更新sum
}
}
|