from ctypes import *
import struct
def decrypt(v, k, num):
v0, v1 = c_uint32(v[0]), c_uint32(v[1])
delta = 0x81a5692e
k0, k1, k2, k3 = k[0], k[1], k[2], k[3]
total = c_uint32(delta * 33 * num)
for i in range(33):
v1.value -= ((v0.value<<4) + k2) ^ (v0.value + total.value) ^ ((v0.value>>5) + k3)
v0.value -= ((v1.value<<4) + k0) ^ (v1.value + total.value) ^ ((v1.value>>5) + k1)
total.value -= delta
return v0.value, v1.value
if __name__ == "__main__":
value = [0x422F1DED, 0x1485E472, 0x35578D5, 0xBF6B80A2, 0x97D77245, 0x2DAE75D1, 0x665FA963, 0x292E6D74, 0x9795FCC1, 0x0BB5C8E9]
key = [0x7CE45630, 0x58334908, 0x66398867, 0xC35195B1]
flag = b'DASCTF{'
res = decrypt(value[0:2], key, 1)
flag += struct.pack('<I', res[0]) + struct.pack('<I', res[1])
res = decrypt(value[2:4], key, 2)
flag += struct.pack('<I', res[0]) + struct.pack('<I', res[1])
res = decrypt(value[4:6], key, 3)
flag += struct.pack('<I', res[0]) + struct.pack('<I', res[1])
res = decrypt(value[6:8], key, 4)
flag += struct.pack('<I', res[0]) + struct.pack('<I', res[1])
res = decrypt(value[8:10], key, 5)
flag += struct.pack('<I', res[0]) + struct.pack('<I', res[1])
flag += b'}'
print(flag)