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 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105
| #include <stdio.h> #include <stdint.h> #include <string.h> #include <stdlib.h>
uint32_t data1 = 0x5F797274; uint32_t data2 = 0x64726168;
void Byte2uint32(uint8_t* key, uint32_t* key1, int key_len) { for (int i = 0; i < key_len; i += 4) { key1[i / 4] = ((uint32_t)key[i] << 24) | ((uint32_t)key[i + 1] << 16) | ((uint32_t)key[i + 2] << 8) | (uint32_t)key[i + 3]; } }
void update_data1_data2(uint32_t v0, uint32_t v1, uint32_t* key) { data1 ^= v0; data2 ^= v1; v0 = data1; v1 = data2; uint32_t delta = 0x6675636b; uint32_t sum = 0; for (int i = 0; i < 32; i++) { sum += delta; v0 += (((v1 << 4) + key[0]) ^ (v1 + sum) ^ ((v1 >> 5) + key[1]) ^ (v1 + sum)); v1 += (((v0 << 4) + key[2]) ^ (v0 + sum) ^ ((v0 >> 5) + key[3]) ^ (v0 + sum)); } data1 = v0; data2 = v1; }
void cbc_tea_decrypt(uint32_t* v0, uint32_t* v1, uint32_t* key) { uint32_t delta = 0x6675636b; uint32_t sum = (delta * 32); for (int i = 0; i < 32; i++) { *v1 -= (((*v0 << 4) + key[2]) ^ (*v0 + sum) ^ ((*v0 >> 5) + key[3]) ^ (*v0 + sum)); *v0 -= (((*v1 << 4) + key[0]) ^ (*v1 + sum) ^ ((*v1 >> 5) + key[1]) ^ (*v1 + sum)); sum -= delta; } *v0 = data1 ^ *v0; *v1 = data2 ^ *v1; }
void Tea_decrypto(uint8_t* data, uint8_t* key, uint8_t* dec_data, int data_len, int key_len) { data1 = 0x5F797274; data2 = 0x64726168; uint32_t* data_uint32 = (uint32_t*)malloc((data_len / 4) * sizeof(uint32_t)); uint32_t* key_uint32 = (uint32_t*)malloc((key_len / 4) * sizeof(uint32_t));
if (data_uint32 == NULL || key_uint32 == NULL) { fprintf(stderr, "内存分配失败\n"); return; }
Byte2uint32(data, data_uint32, data_len); Byte2uint32(key, key_uint32, key_len);
int dec_data_len = 0; for (int i = 0; i < data_len / 4; i += 2) { uint32_t temp0 = data_uint32[i]; uint32_t temp1 = data_uint32[i + 1]; cbc_tea_decrypt(&temp0, &temp1, key_uint32); dec_data[dec_data_len++] = (uint8_t)(temp0 >> 24); dec_data[dec_data_len++] = (uint8_t)(temp0 >> 16); dec_data[dec_data_len++] = (uint8_t)(temp0 >> 8); dec_data[dec_data_len++] = (uint8_t)temp0; dec_data[dec_data_len++] = (uint8_t)(temp1 >> 24); dec_data[dec_data_len++] = (uint8_t)(temp1 >> 16); dec_data[dec_data_len++] = (uint8_t)(temp1 >> 8); dec_data[dec_data_len++] = (uint8_t)temp1; update_data1_data2(temp0, temp1, key_uint32); }
while (dec_data_len > 0 && dec_data[dec_data_len - 1] == 0x00) { dec_data_len--; } dec_data[dec_data_len] = '\0';
free(data_uint32); free(key_uint32); }
void ReverseArraySelfXor0(uint8_t* arr, int arr_len) { for (int i = arr_len - 1; i >= 0; i--) { arr[i] ^= arr[(i + 1) % arr_len]; } }
#define CMP_SIZE 16 int main() { uint8_t cmp[CMP_SIZE] = { 0x04, 0x0a, 0xf3, 0xbd, 0x68, 0x8c, 0xb7, 0x76, 0x36, 0x25, 0x2d, 0x96, 0xca, 0x62, 0xa3, 0x41 }; uint8_t key_[] = { 113, 49, 119, 100, 53, 53, 54, 113, 119, 49, 53, 54, 54, 51, 53, 49 }; uint8_t dec_data[CMP_SIZE]; Tea_decrypto(cmp, key_, dec_data, sizeof(cmp), sizeof(key_)); ReverseArraySelfXor0(dec_data, strlen((char*)dec_data)); printf("%s\n", dec_data); return 0; }
|