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)

Referensi

results matching ""

    No results matching ""