算法详解
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 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
| #include <stdint.h> #include <stdio.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[5] = { 0x22A577C1,0x1C12C03,0x0C74C3EBD,0x0A9D03C85,0x0ADB8FFB3 }; uint32_t const k[4] = { 55,66,77,88 }; int n = 5; btea(v, -n, k); for (int i = 0; i < n; i++) { for (int j = 0; j < sizeof(uint32_t) / sizeof(uint8_t); j++) { printf("%c", (v[i] >> (j * 8)) & 0xFF); } } return 0; }
|
上文代码中n
代表待加密数据的长度,公式的含义是,对于给定的数据块长度,根据公式计算出加密轮数rounds
,以便在加密过程中执行足够的轮数,达到较高的安全性。
例题
[HNCTF 2022 WEEK3]What’s 1n DLL?
参考文章