pbctf2020 | Ainissethai

pbctf2020

enigma

#!/bin/env python3

from string import ascii_uppercase as UC
from random import SystemRandom
from enigma.machine import EnigmaMachine
from secretstuff import FLAG, PLUGBOARD_SETTINGS

assert FLAG.isupper() # Without pbcft{...}
random = SystemRandom()

for _ in range(50):
    ROTORS = [random.choice(("I","II","III","IV","V","VI","VII","VIII")) for _ in range(3)]
    REFLECTOR = random.choice(("B", "C", "B-Thin", "C-Thin"))
    RING_SETTINGS = [random.randrange(26) for _ in range(3)]

    machine = EnigmaMachine.from_key_sheet(
           rotors=ROTORS,
           reflector=REFLECTOR,
           ring_settings=RING_SETTINGS,
           plugboard_settings=PLUGBOARD_SETTINGS)

    machine.set_display(''.join(random.sample(UC, 3)))

    ciphertext = machine.process_text(FLAG)

    print(ciphertext)

enigmaによる文字cの変換を f(c) = d とかくと、必ず c \ne dらしいというのを使う

from ptrlib import Socket
from string import ascii_uppercase

groups = [set() for _ in range(17)]

for i in range(10):
    sock = Socket("ainissesthai.chal.perfect.blue", 1)
    for _ in range(50):
        cipher = sock.recvline().strip().decode()
        for group, c in zip(groups, cipher):
            group.add(c)

flag = ""
ans = set(ascii_uppercase)
for group in groups:
    m = ans - group
    print(m)
    flag += m.pop()

print(flag) #FATALFLAWINENIGMA