算法详解

XXTEA使用更复杂的运算方式,它的块大小可以是任意的,密钥也可以是任意长度的(可以不是4的倍数)。

在加密时,XXTEA会对明文进行分块,然后每个块都会进行加密,加密后的结果再进行拼接,最终形成密文。

在解密时,XXTEA会对密文进行分块,然后每个块都会进行解密,解密后的结果再进行拼接,最终形成明文。

加密过程示意图:

代码实现

下面是XXTEA算法加密过程的C语言函数实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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算法解密过程的C语言函数实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
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
}
}

上文代码中n代表待加密数据的长度,公式的含义是,对于给定的数据块长度,根据公式计算出加密轮数rounds,以便在加密过程中执行足够的轮数,达到较高的安全性。

例题

(暂略)