TEA、XTEA、XXTEA加密解密算法 - 简书

以下均为标准加解密流程,正式题目中会有魔改

TEA

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
def tea_encrypt(v, k, rounds=32):
v0, v1 = v
sum = 0
delta = 0x9E3779B9
for _ in range(rounds):
sum = (sum + delta) & 0xFFFFFFFF
v0 = (v0 + (((v1 << 4) + k[0]) ^ (v1 + sum) ^ ((v1 >> 5) + k[1]))) & 0xFFFFFFFF
v1 = (v1 + (((v0 << 4) + k[2]) ^ (v0 + sum) ^ ((v0 >> 5) + k[3]))) & 0xFFFFFFFF
return v0, v1

def tea_decrypt(v, k, rounds=32):
v0, v1 = v
delta = 0x9E3779B9
sum = (delta * rounds) & 0xFFFFFFFF
for _ in range(rounds):
v1 = (v1 - (((v0 << 4) + k[2]) ^ (v0 + sum) ^ ((v0 >> 5) + k[3]))) & 0xFFFFFFFF
v0 = (v0 - (((v1 << 4) + k[0]) ^ (v1 + sum) ^ ((v1 >> 5) + k[1]))) & 0xFFFFFFFF
sum = (sum - delta) & 0xFFFFFFFF
return v0, v1


XTEA

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
def xtea_encrypt(v, k, rounds=32):
v0, v1 = v
sum = 0
delta = 0x9E3779B9
for _ in range(rounds):
v0 = (v0 + (((v1 << 4 ^ v1 >> 5) + v1) ^ (sum + k[sum & 3]))) & 0xFFFFFFFF
sum = (sum + delta) & 0xFFFFFFFF
v1 = (v1 + (((v0 << 4 ^ v0 >> 5) + v0) ^ (sum + k[(sum >> 11) & 3]))) & 0xFFFFFFFF
return v0, v1

def xtea_decrypt(v, k, rounds=32):
v0, v1 = v
delta = 0x9E3779B9
sum = (delta * rounds) & 0xFFFFFFFF
for _ in range(rounds):
v1 = (v1 - (((v0 << 4 ^ v0 >> 5) + v0) ^ (sum + k[(sum >> 11) & 3]))) & 0xFFFFFFFF
sum = (sum - delta) & 0xFFFFFFFF
v0 = (v0 - (((v1 << 4 ^ v1 >> 5) + v1) ^ (sum + k[sum & 3]))) & 0xFFFFFFFF
return v0, v1


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
def xxtea_encrypt(data, key):
def mx(sum, y, z, p, e, k):
return (((z >> 5 ^ y << 2) + (y >> 3 ^ z << 4)) ^ ((sum ^ y) + (k[(p & 3) ^ e] ^ z))) & 0xFFFFFFFF

n = len(data)
if n < 2: return data
delta = 0x9E3779B9
rounds = 6 + 52 // n
sum = 0
z = data[-1]
for _ in range(rounds):
sum = (sum + delta) & 0xFFFFFFFF
e = (sum >> 2) & 3
for p in range(n - 1):
y = data[p + 1]
data[p] = (data[p] + mx(sum, y, z, p, e, key)) & 0xFFFFFFFF
z = data[p]
y = data[0]
data[-1] = (data[-1] + mx(sum, y, z, n - 1, e, key)) & 0xFFFFFFFF
return data

def xxtea_decrypt(data, key):
def mx(sum, y, z, p, e, k):
return (((z >> 5 ^ y << 2) + (y >> 3 ^ z << 4)) ^ ((sum ^ y) + (k[(p & 3) ^ e] ^ z))) & 0xFFFFFFFF

n = len(data)
if n < 2: return data
delta = 0x9E3779B9
rounds = 6 + 52 // n
sum = (rounds * delta) & 0xFFFFFFFF
y = data[0]
for _ in range(rounds):
e = (sum >> 2) & 3
for p in range(n - 1, 0, -1):
z = data[p - 1]
data[p] = (data[p] - mx(sum, y, z, p, e, key)) & 0xFFFFFFFF
y = data[p]
z = data[-1]
data[0] = (data[0] - mx(sum, y, z, 0, e, key)) & 0xFFFFFFFF
sum = (sum - delta) & 0xFFFFFFFF
return data