TEA加密解密流程
参考代码:(源自:常见加密算法和编码识别 - CTF Wiki (ctf-wiki.org))
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
| #include <stdint.h>
void encrypt (uint32_t* v, uint32_t* k) { uint32_t v0=v[0], v1=v[1], sum=0, i; uint32_t delta=0x9e3779b9; uint32_t k0=k[0], k1=k[1], k2=k[2], k3=k[3]; for (i=0; i < 32; i++) { sum += delta; v0 += ((v1<<4) + k0) ^ (v1 + sum) ^ ((v1>>5) + k1); v1 += ((v0<<4) + k2) ^ (v0 + sum) ^ ((v0>>5) + k3); } v[0]=v0; v[1]=v1; }
void decrypt (uint32_t* v, uint32_t* k) { uint32_t v0=v[0], v1=v[1], sum=0xC6EF3720, i; uint32_t delta=0x9e3779b9; uint32_t k0=k[0], k1=k[1], k2=k[2], k3=k[3]; for (i=0; i<32; i++) { v1 -= ((v0<<4) + k2) ^ (v0 + sum) ^ ((v0>>5) + k3); v0 -= ((v1<<4) + k0) ^ (v1 + sum) ^ ((v1>>5) + k1); sum -= delta; } v[0]=v0; v[1]=v1; }
|
注意事项
- 在其他的TEA加密解密流程中,部分过程或许有偏差,但整体上还是大差不差的。
- 注意使用的变量是32位的unsigned int类型变量。
具体示例
在此TEA加密流程中,v5、v6并不完全按照示例进行,但只要按照其反思路来做就可以了。
解密脚本
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
| #include<stdio.h> #include<string.h> void decrypt(int *res, int *key){ unsigned int v6=res[0]; unsigned int v5=res[1]; unsigned int sum = 0xC6EF3720; unsigned int delta = 0x61C88647; int i; for ( i = 0; i <= 0x1F; ++i ) { v5 -= (((v6 >> 5) ^ (16 * v6)) + v6) ^ (key[(sum>>11)&3] + sum); sum += 0x61C88647; v6 -= (((v5 >> 5) ^ (16 * v5)) + v5) ^ (key[sum&3] + sum); } printf("结果:%x,%x\n",v6,v5); return; }
void encrypt(int *res, int *key){ unsigned int v6=res[0]; unsigned int v5=res[1]; unsigned int sum = 0; unsigned int delta = 0x61C88647; unsigned int i; for ( i = 0; i <= 0x1F; ++i ) { v6 += (((v5 >> 5) ^ (16 * v5)) + v5) ^ (key[sum&3] + sum); sum -= 0x61C88647; v5 += (((v6 >> 5) ^ (16 * v6)) + v6) ^ (key[(sum>>11)&3] + sum); } printf("结果:%X,%X\n",v6,v5); return; }
int main(){ int res[6]={ 0xC11EE75A, 0xA4AD0973, 0xF61C9018, 0x32E37BCD, 0x2DCC1F26, 0x344380CC }; int key[4]={ 0x010203, 0x04050607, 0x08090A0B, 0x0C0D0E0F }; int i; for(i=0;i<3;i++){ decrypt(&res[i*2],key); } return 0; }
|
最后所得到的结果要注意是小端存储。