Связь рейдеров перехвачена — они используют какой-то протокол для обмена ключами в реальном времени. Подключись к их каналу, разберись в механике обмена и найди способ расшифровать сообщение. Это последний шанс узнать их планы и защитить убежище!
Решение
Подключение для выполнения данного задания происходит по Netcat.
Для выполнения задания был дан файл с исходным кодом сервиса:
Сначала используются параметры p и g, заданные в коде, и случайно сгенерированный параметр a для рассчета значения параметра A
Далее эти параметры отправляются пользователю, и сервер ждет от пользователя параметр B
Сервер вычисляет ключ
Ключ переводится в байты, для которых берется хеш сумма
Далее полученная хеш сумма используется для шифрования флага с помощью AES в режиме CBC
Зашифрованный флаг отправляется пользователю
Для расшифровки флага необходимо вычислить ключ шифрования. Сервер программы отправляет пользователю такие данные:
g param: 2
p param: 21939064273961432692869235542893309434365296719508334253822045076157821650630047212279097400258209801635218687194014309421774539657826955718443612198193637894945215120269429964294507963612184795033175591635352291302967656747476846944244765600058091168639460934760860868326266514083637259374687840565001460873188850800163176147059578426285991042291544199555653768310302902708201893293049574742797280456632089035058341779138857865427898515383676243788195320008247816405690477742229224304949780665765133150285293936629056854719648258757922775143286326810180018785995447730996681389941725954432835063148737663764568414527
A result: 7836609260571610419397475408625198751625567856538952365788036450749229368559371198572323332899973755163519698867187857012805824993013911555984809799274301910115190772859503256139814116179006505411114917804792036479050884659650741500669206150402449587082295630080773890042276112694773040131308694111851530333542986809711943857130629658681388097431021356103305377220505853993031463508772348531695506926987989480090387484156436243581825774904798979950787528339768560663760643791694659481726287478209434998746179860633528639452805757005364917850985206813012984244780910595676358976265949919975467908194243553049629705026
Для рассчета параметра B, который сервер ожидает от пользователя, необходимо сгненерировать случайное число b и возвести полученное значение g в степень b по модулю p. Для рассчета общего ключа необходимо возвести B в степень a по модулю p. Далее необходимо перевести полученный ключ в байты и вычислить хеш аналогично тому, как это сделано в коде сервера. Преобразованный ключ можно использовать для расшифровки флага.