算法详解
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; limit = rounds * delta; q = 6 + limit / delta; while (q-- > 0) { sum += delta; e = sum >> 2 & 3; 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; delta = 0x9E3779B9; limit = rounds * delta; q = 6 + limit / delta; while (q-- > 0) { e = sum >> 2 & 3; 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; } }
|
上文代码中n
代表待加密数据的长度,公式的含义是,对于给定的数据块长度,根据公式计算出加密轮数rounds
,以便在加密过程中执行足够的轮数,达到较高的安全性。
例题
(暂略)