tea加密

算法特征
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'))

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值