Решения
Задание (crypto)

Подробное описание
Условия задачи: "Один из нас изобрел новую криптосистему! Вы сможете ее сломать? Сервис client.py работает на 54.234.245.15:13797 или 54.235.50.140:13797". Смотрим код client.py Ага, алгоритм шифрования находится в функции encrypt(m, N), а зашифрованные данные в переменной ciphertext. Ясно, чтобы получить флаг, нам надо расшифровать данные из ciphertext. Теперь подключаемся к серверу. Сервер предлагает три варианта действий: зашифровать, расшифровать, показать открытый ключ.
Если попробовать самый простой способ: послать серверу данные из переменной ciphertext, то он ответит незамысловато "..Nice try.." (хорошая попытка). Но если сервису указать другие данные, то процесс шифрования/расшифрования заработает, значит, на самом сервере стоит проверка на точное совпадение с шифрованным текстом из ciphertext. Вывод, надо обмануть службу и получить расшифрованные данные. Изучаем алгоритм шифрования. Сообщение просто XORится с гаммой (ее длина L = 375 совпадает с длиной сообщения). Сама гамма создается в цикле: берется самый младший бит из преобразования: ![]() Выберем n = 8. Считаем новое значение ciphertext. def encrypt_ext(): c = ciphertext[0] y = ciphertext[1] L = ciphertext[2] L_ = L + 8 for k in range(L, L_): c = c << 1 y = pow(y, 2, pubkey) return (c, y, L_) Новое значение ciphertext посылаем на сервер.
Расшифрованное сообщение сдвигаем вправо на n = 8 бит. def inttostr(s): if s == 0: return "" c = chr(s & 0xFF) return inttostr(s >> 8) + c m_ = 115852513101412539308623955877941922091663879367670844145001264779602413 95989561157460977131994123827546368473595209 m_ = m_ >> 8 print("[+]Flag = "+inttostr(m_)) Результат: Флаг: |