算法特征
tea算法的主要特征表现在sum和delta变量,以及3行核心加密中出现的右移4左移5,两行各有3个小括号互相异或
在题目中看到这些特征时就应该警醒这是tea相关算法
delta的值一般为0x9E3779B9(-0x61C88647),但题目中往往会改变它的值,并不影响算法的逆向
加密解密py
def encrypt(v, k):
y, z = [int.from_bytes(v[i:i + 4], 'little') for i in range(0, len(v), 4)]
sum_ = 0
delta = 0x9E3779B9
rounds = 32
for _ in range(rounds):
sum_ += delta
y += ((z << 4) + k[0]) ^ (z + sum_) ^ ((z >> 5) + k[1])
y &= 0xFFFFFFFF
z += ((y << 4) + k[2]) ^ (y + sum_) ^ ((y >> 5) + k[3])
z &= 0xFFFFFFFF
return (y.to_bytes(4, 'little') + z.to_bytes(4, 'little'))
def decrypt(v, k):
y, z = [int.from_bytes(v[i:i + 4], 'little') for i in range(0, len(v), 4)]
sum_ = 0xC6EF3720
delta = 0x9E3779B9
rounds = 32
for _ in range(rounds):
z -= ((y << 4) + k[2]) ^ (y + sum_) ^ ((y >> 5) + k[3])
z &= 0xFFFFFFFF
y -= ((z << 4) + k[0]) ^ (z + sum_) ^ ((z >> 5) + k[1])
y &= 0xFFFFFFFF
sum_ -= delta
return (y.to_bytes(4, 'little') + z.to_bytes(4, 'little'))
# 示例用法
key = b'\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f'
plaintext = b'hello world'
while len(plaintext) % 8!= 0:
plaintext += b'\0'
encrypted_data = b''
for i in range(0, len(plaintext), 8):
encrypted_data += encrypt(plaintext[i:i + 8], key)
print("加密后的数据:", encrypted_data.hex())
decrypted_data = b''
for i in range(0, len(encrypted_data), 8):
decrypted_data += decrypt(encrypted_data[i:i + 8], key)
print("解密后的数据:", decrypted_data.rstrip(b'\0').decode('utf-8'))