Tea&XTea&XXTea解密脚本总结
Jsjsj Lv2

##总结下常用的tea系列解密包括tea、xtea、xxtea解密,详细步骤就不解释了

Tea加解密

tea加密脚本,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
#include <stdio.h>
#include <stdint.h>

void tea_encrypt(uint32_t* v, uint32_t* k) {
uint32_t v0 = v[0], v1 = v[1];
uint32_t sum = 0;
uint32_t delta = 0x9e3779b9;
uint32_t k0 = k[0], k1 = k[1], k2 = k[2], k3 = k[3];

for (int i = 0; i < 32; i++) {
sum += delta;
v0 += ((v1 << 4) + k0) ^ (v1 + sum) ^ ((v1 >> 5) + k1);
v0 = v0 & 0xFFFFFFFF;
v1 += ((v0 << 4) + k2) ^ (v0 + sum) ^ ((v0 >> 5) + k3);
v1 = v1 & 0xFFFFFFFF;
}

v[0] = v0;
v[1] = v1;
}

int main() {
uint32_t v[2] = {0x01234567, 0x89abcdef}; // Plaintext (64 bits)
uint32_t k[4] = {0x01234567, 0x89abcdef, 0xfedcba98, 0x76543210}; // Key (128 bits)

printf("Original: v0 = %08x, v1 = %08x\n", v[0], v[1]);

tea_encrypt(v, k);

printf("Encrypted: v0 = %08x, v1 = %08x\n", v[0], v[1]);

return 0;
}

在这个示例中,tea_encrypt 函数接受两个32位整数数组 vk,分别代表待加密的数据和密钥。你可以根据需要修改 vk 的值。

tea 解密脚本:

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
def tea_decrypt(ciphertext, key):
def decode_uint32(data, offset):
return (data[offset] & 0xFF) | ((data[offset + 1] & 0xFF) << 8) | ((data[offset + 2] & 0xFF) << 16) | ((data[offset + 3] & 0xFF) << 24)

def encode_uint32(data, offset, value):
data[offset] = value & 0xFF
data[offset + 1] = (value >> 8) & 0xFF
data[offset + 2] = (value >> 16) & 0xFF
data[offset + 3] = (value >> 24) & 0xFF

if len(ciphertext) % 8 != 0:
raise ValueError("Ciphertext length must be a multiple of 8")

key = key.encode('utf-8')
data = ciphertext.encode('latin-1')

num_rounds = 32
delta = 0x9e3779b9
key_schedule = [0, 0]

result = bytearray(len(data))
for i in range(0, len(data), 8):
v0 = decode_uint32(data, i)
v1 = decode_uint32(data, i + 4)
sum = (delta * num_rounds) & 0xFFFFFFFF
for _ in range(num_rounds):
v1 -= ((v0 << 4 ^ v0 >> 5) + v0) ^ (sum + key_schedule[sum >> 11 & 3]) & 0xFFFFFFFF
v1 &= 0xFFFFFFFF
sum -= delta
v0 -= ((v1 << 4 ^ v1 >> 5) + v1) ^ (sum + key_schedule[sum & 3]) & 0xFFFFFFFF
v0 &= 0xFFFFFFFF
encode_uint32(result, i, v0)
encode_uint32(result, i + 4, v1)

return result.decode('latin-1')

# 密文和密钥
cipher_text = "YourCipherTextHere"
encryption_key = "YourEncryptionKeyHere"

# 解密
decrypted_data = tea_decrypt(cipher_text, encryption_key)
print("Decrypted Data:", decrypted_data)

替换 “YourCipherTextHere” 和 “YourEncryptionKeyHere” 为你的实际密文和密钥。这个脚本使用Python的 cryptography 库进行解密,同时使用 PBKDF2 密钥派生函数来生成加密密钥。在实际使用中,确保替换为适当的密钥派生方法和参数

XTea加解密

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
#include <stdio.h>
#include <stdint.h>

void xtea_encrypt(uint32_t v[2], uint32_t key[4]) {
uint32_t sum = 0;
uint32_t delta = 0x9e3779b9;
uint32_t v0 = v[0], v1 = v[1];
uint32_t k0 = key[0], k1 = key[1], k2 = key[2], k3 = key[3];

for (int i = 0; i < 32; i++) {
v0 += (((v1 << 4) ^ (v1 >> 5)) + v1) ^ (sum + k0);
v0 = v0 & 0xFFFFFFFF;
sum += delta;
v1 += (((v0 << 4) ^ (v0 >> 5)) + v0) ^ (sum + k1);
v1 = v1 & 0xFFFFFFFF;
sum += delta;
}

v[0] = v0;
v[1] = v1;
}

int main() {
uint32_t v[2] = {0x01234567, 0x89abcdef}; // Plaintext (64 bits)
uint32_t key[4] = {0x01234567, 0x89abcdef, 0xfedcba98, 0x76543210}; // Key (128 bits)

printf("Original: v0 = %08x, v1 = %08x\n", v[0], v[1]);

xtea_encrypt(v, key);

printf("Encrypted: v0 = %08x, v1 = %08x\n", v[0], v[1]);

return 0;
}

在这个示例中,xtea_encrypt 函数接受两个32位整数数组 vkey,分别代表待加密的数据和密钥。你可以根据需要修改 vkey 的值。

xtea解密脚本

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
def xtea_decrypt(ciphertext, key):
def int32(x):
return x & 0xFFFFFFFF

def to_bytes(data):
return bytes([data >> 24, (data >> 16) & 0xFF, (data >> 8) & 0xFF, data & 0xFF])

def from_bytes(data):
return (data[0] << 24) | (data[1] << 16) | (data[2] << 8) | data[3]

key = key.encode('utf-8')
data = bytes.fromhex(ciphertext) # 假设密文是十六进制字符串

key_schedule = [int.from_bytes(key[i:i+4], 'little') for i in range(0, 16, 4)]
num_rounds = 64 # 固定轮数

v0, v1 = from_bytes(data[:4]), from_bytes(data[4:8])
delta = 0x9e3779b9
sum = (delta * num_rounds) & 0xFFFFFFFF

for _ in range(num_rounds):
v1 -= ((v0 << 4 ^ (v0 >> 5)) + v0) ^ (sum + key_schedule[sum >> 11 & 3]) & 0xFFFFFFFF
v1 = int32(v1)
sum = int32(sum - delta)
v0 -= ((v1 << 4 ^ (v1 >> 5)) + v1) ^ (sum + key_schedule[sum & 3]) & 0xFFFFFFFF
v0 = int32(v0)

result = to_bytes(v0) + to_bytes(v1)
return result.decode('utf-8', errors='ignore')

# 密文和密钥
cipher_text = "YourCipherTextHere" # 用实际的XTEA加密密文替换
encryption_key = "YourEncryptionKeyHere" # 用实际的密钥替换

# 解密
decrypted_data = xtea_decrypt(cipher_text, encryption_key)
print("Decrypted Data:", decrypted_data)

确保将 “YourCipherTextHere” 和 “YourEncryptionKeyHere” 替换为实际的XTEA加密密文和密钥。这个脚本手动实现了XTEA的解密算法。

XXTea加解密

xxtea加密脚本:

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
#include <stdio.h>
#include <stdint.h>
#include <string.h>

#define DELTA 0x9e3779b9
#define MX 0x10

void btea(uint32_t v[4], int n, uint32_t key[4]) {
uint32_t y, z, sum;
uint32_t 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 * (z ^ ((y >> 5) ^ (y << 4))) + key[(p & 3) ^ e] ^ (y + sum);
}

y = v[0];
z = v[n - 1] += MX * (z ^ ((y >> 5) ^ (y << 4))) + key[(p & 3) ^ e] ^ (y + sum);
} while (--rounds);
}
}

int main() {
uint32_t v[2] = {0x01234567, 0x89abcdef}; // Plaintext (64 bits)
uint32_t key[4] = {0x01234567, 0x89abcdef, 0xfedcba98, 0x76543210}; // Key (128 bits)

printf("Original: v0 = %08x, v1 = %08x\n", v[0], v[1]);

btea(v, 2, key);

printf("Encrypted: v0 = %08x, v1 = %08x\n", v[0], v[1]);

return 0;
}

xxtea解密脚本

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
def xxtea_decrypt(data, key):
def int32(x):
return x & 0xFFFFFFFF

def to_bytes(data):
return bytes((data >> 24, data >> 16, data >> 8, data))

key = key.encode('utf-8')
data = bytes.fromhex(data)

key_schedule = [int.from_bytes(key[i:i+4], 'little') for i in range(0, 16, 4)]
num_rounds = 6 + 52 // len(key_schedule)

v0, v1 = int.from_bytes(data[:4], 'little'), int.from_bytes(data[4:8], 'little')
delta = 0x9e3779b9
sum = int32(delta * num_rounds)

for _ in range(num_rounds):
v1 -= (int32((v0 << 4) ^ (v0 >> 5)) + v0) ^ (int32(sum + key_schedule[sum >> 11 & 3]))
v1 = int32(v1)
sum -= delta
v0 -= (int32((v1 << 4) ^ (v1 >> 5)) + v1) ^ (int32(sum + key_schedule[sum & 3]))
v0 = int32(v0)

result = to_bytes(v0) + to_bytes(v1)
return result.decode('utf-8', errors='ignore')

# 密文和密钥
cipher_text = "YourCipherTextHere" # 用实际的XXTEA加密密文替换
encryption_key = "YourEncryptionKeyHere" # 用实际的密钥替换

# 解密
decrypted_data = xxtea_decrypt(cipher_text, encryption_key)
print("Decrypted Data:", decrypted_data)

确保将 “YourCipherTextHere” 和 “YourEncryptionKeyHere” 替换为实际的XXTEA加密密文和密钥。这个脚本手动实现了XXTEA的解密算法。

总结:很多比赛的关于xtea系列的加密都是没有魔改的,有时候我们只需找到加密的密文和密钥就可以选择对应的脚本进行解密了,这里简单记录下,没有过多的记录

 Comments