##总结下常用的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}; uint32_t k[4] = {0x01234567, 0x89abcdef, 0xfedcba98, 0x76543210};
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位整数数组 v
和 k
,分别代表待加密的数据和密钥。你可以根据需要修改 v
和 k
的值。
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}; uint32_t key[4] = {0x01234567, 0x89abcdef, 0xfedcba98, 0x76543210};
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位整数数组 v
和 key
,分别代表待加密的数据和密钥。你可以根据需要修改 v
和 key
的值。
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" 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}; uint32_t key[4] = {0x01234567, 0x89abcdef, 0xfedcba98, 0x76543210};
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" encryption_key = "YourEncryptionKeyHere"
decrypted_data = xxtea_decrypt(cipher_text, encryption_key) print("Decrypted Data:", decrypted_data)
|
确保将 “YourCipherTextHere” 和 “YourEncryptionKeyHere” 替换为实际的XXTEA加密密文和密钥。这个脚本手动实现了XXTEA的解密算法。
总结:很多比赛的关于xtea系列的加密都是没有魔改的,有时候我们只需找到加密的密文和密钥就可以选择对应的脚本进行解密了,这里简单记录下,没有过多的记录