Для решения нужно расшифровать строку, которая зашифрована с помощью операции XOR с одним байтом. Но ключ неизвестен. Его длина также неизвестна.
0e0b213f26041e480b26217f27342e175d0e070a3c5b103e2526217f27342e175d0e077e263451150104
Solution
Для нахождения ключа будем использовать брутфорс. Если ключ равен длине строки — то будет грустно.
Известен формат строки crypto{. Попробуем найти ключ для этой части. Если он будет повторяться, то возможно получится расшифровать всю строку.
Попробую сделать это:
flag = '0e0b213f26041e480b26217f27342e175d0e070a3c5b103e2526217f27342e175d0e077e263451150104'
s = b'crypto{'
def xor(s: bytes, key: list[int]) -> bytes:
return bytes([s[i] ^ key[i % len(key)] for i in range(len(s))])
flag = bytes.fromhex(flag)
key = [flag[i] ^ s[i] for i in range(len(s))]
print(key)
Для удобства написал xor для ключа разной длины. В key[i % len(key) мы всегда берем индекс по модулю его длины, так что не выйдем за границу списка.
Воть ключ:
[109, 121, 88, 79, 82, 107, 101]
Поксорим:
crypto{%r~n-LQCnAUaY6ifjtJJMvXeb_lGja
Получилась какая-то хрень. Но ключ подозрительно похож на отображаемые ASCII символы. Выведем его:
myXORke
Хмммм… Что-то это мне напоминает, может быть myKORkebab. Да не, бред какой-то. Пусть будет что-то безумное… Например myXORkey. Попробую расшифровать:
flag = '0e0b213f26041e480b26217f27342e175d0e070a3c5b103e2526217f27342e175d0e077e263451150104'
s = b'crypto{'
key = b'myXORkey'
def xor(s: bytes, key: list[int]) -> bytes:
return bytes([s[i] ^ key[i % len(key)] for i in range(len(s))])
flag = bytes.fromhex(flag)
flag = xor(flag, key)
print(flag.decode())
А вот и флаг:
crypto{1f_y0u_Kn0w_En0uGH_y0u_Kn0w_1t_4ll}