ISC2C 2018: S0R (150 Points)
Masalah
Decrypt pesan IxVudEE3IEdBByBpTi8gRgsPZ25ZWyA6dAVURhNCaDE5J19TDh1mdDEmblMORWZ0DQdsZX0AAAA dan temukan flagnya!
Penyelesaian
Terdapat algoritma enkripsi sederhana dengan Shift dan XOR. Untuk menyelesaikannya bisa menggunakan Reverse Shift dan XOR seperti pada script dibawah ini.
import struct
import sys
import base64
def reverse_right_shift(value, shift, mult=0xffffffff):
output, i = 0, 0
while i * shift < 32:
compartment = int(bin(0xffffffff << (32 - shift))[-32:], 2) >> (shift * i)
part_output = value & compartment
value ^= part_output >> shift & mult
output |= part_output
i += 1
return output
def reverse_left_shift(value, shift, mult=0xffffffff):
output, i = 0, 0
while i * shift < 32:
compartment = int(bin((0xffffffff >> (32- shift)) << (shift * i))[-32:], 2)
part_output = value & compartment
value ^= part_output << shift & mult
output |= part_output
i += 1
return output
# value = 3009615726
# _value = value ^ value >> 10
# assert reverse_right_shift(_value, 10) == value
# _value = value ^ value << 15 & 15141003
# assert reverse_left_shift(_value, 15, 15141003) == value
def enc(data):
padding = 4 - len(data) % 4
if padding != 0:
data = data + "\x00" * padding
result = []
blocks = struct.unpack("I" * (len(data) / 4), data)
for block in blocks:
print block, [block ^ block >> 16]
result += [block ^ block >> 16]
output = ''
for block in result:
output += struct.pack("I", block)
return base64.b64encode(output)
def dec(final):
output = final.decode('base64')
blocks = struct.unpack("I" * (len(output) / 4), output)
for block in blocks:
sys.stdout.write(struct.pack("I", rrs(block, 16)))
if __name__ == '__main__':
ctx = 'IxVudEE3IEdBByBpTi8gRgsPZ25ZWyA6dAVURhNCaDE5J19TDh1mdDEmblMORWZ0DQdsZX0AAAA='
print dec(ctx)