简介
省流:TEA的大杯版
因为TEA加密有密钥调度算法过于简单(直接调用),密钥之间等价(每个密钥都被平均的使用)这两个缺陷,所以有了XTEA加密,XTEA将密钥调度的算法改为非线性的,并且略微修改了轮加密计算方法
特征
XTEA最大的特征就是每次加密使用的密钥由当前sum的累加值决定,通常是sum经过计算后&3,其余的特征和TEA加密基本相同
实现
1 2 3 4 5 6 7 8 9 10 11 12 13
   | void xteaEncrypt(uint32_t *v, uint32_t *k) {     uint32_t sum = 0, v0 = v[0], v1 = v[1];     uint32_t delta = 0x9E3779B9;     for (int i = 0; i < 32; i++)     {         v0 += (((v1 << 4) ^ (v1 >> 5)) + v1) ^ (sum + k[sum & 3]);          sum += delta;         v1 += (((v0 << 4) ^ (v0 >> 5)) + v0) ^ (sum + k[(sum >> 11) & 3]);     }     v[0] = v0;     v[1] = v1; }
   | 
 
解密
虽然XTEA针对TEA进行了很多改进,但是对于逆向工程来说,我们并不是进行黑盒分析,所以XTEA和TEA并没有很大不同,直接使用Feistel密码的解法把运算过程反过来即可
1 2 3 4 5 6 7 8 9 10 11 12 13 14
   | void xteaDecrypt(uint32_t *v, uint32_t *k) {     uint32_t sum = 0, v0 = v[0], v1 = v[1];     uint32_t delta = 0x9E3779B9;     sum = delta * 32;     for (int i = 0; i < 32; i++)     {         v1 -= (((v0 << 4) ^ (v0 >> 5)) + v0) ^ (sum + k[(sum >> 11) & 3]);         sum -= delta;         v0 -= (((v1 << 4) ^ (v1 >> 5)) + v1) ^ (sum + k[sum & 3]);     }     v[0] = v0;     v[1] = v1; }
   | 
 
完整代码
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
   | #include <bits/stdc++.h> using namespace std; void xteaEncrypt(uint32_t *v, uint32_t *k) {     uint32_t sum = 0, v0 = v[0], v1 = v[1];     uint32_t delta = 0x9E3779B9;     for (int i = 0; i < 32; i++)     {         v0 += (((v1 << 4) ^ (v1 >> 5)) + v1) ^ (sum + k[sum & 3]);         sum += delta;         v1 += (((v0 << 4) ^ (v0 >> 5)) + v0) ^ (sum + k[(sum >> 11) & 3]);     }     v[0] = v0;     v[1] = v1; } void xteaDecrypt(uint32_t *v, uint32_t *k) {     uint32_t sum = 0, v0 = v[0], v1 = v[1];     uint32_t delta = 0x9E3779B9;     sum = delta * 32;     for (int i = 0; i < 32; i++)     {         v1 -= (((v0 << 4) ^ (v0 >> 5)) + v0) ^ (sum + k[(sum >> 11) & 3]);         sum -= delta;         v0 -= (((v1 << 4) ^ (v1 >> 5)) + v1) ^ (sum + k[sum & 3]);     }     v[0] = v0;     v[1] = v1; } int main() {     uint32_t key[4] = {0x01234567, 0x89ABCDEF, 0xFEDCBA98, 0x76543210};     char plaintext[] = "Eleven11";     xteaEncrypt((uint32_t *)plaintext, key);     for (int i = 0; i < 8; i++)         printf("%02X ", plaintext[i] & 0xFF);     printf("\n");     xteaDecrypt((uint32_t *)plaintext, key);     for (int i = 0; i < 8; i++)         printf("%c", plaintext[i]);     return 0; }
   | 
 
refernce
XTEA-wikipedia
Feistel network-wikipedia