Как решать подобные задачи по криптографии?
Для начала прочитать условия и заглянуть в код. Увидеть в нём вот это:
key_val = b""
seed_val = plain_text[0]
random.seed(seed_val)
for i in range(16):
key_val += random.randrange(1, 255).to_bytes()
понять, что key_val однозначно генерируется из первого символа открытого текста.
Флаг имеет формат вида ntcontest{FLAG_VALUE}
Я не понял эту часть, имеется в виду, что первый символ открытого текста флага -- 'n'? Если так, то вообще решение в одно действие, если нет, то в любом случае можно организовать перебор всех возможных первых символов, генерировать по ним key_val, расшифровывать им и проверять, что первый символ полученного текста совпадает с символом использованным для генерации ключа.