bad-patterns

автор: BaboonWithTheGoon

Таск нельзя отнести к мискалине, но и в криптографию не очень хочется закидывать, поэтому пускай там и остается. В двух словах про таск: Есть входная и выходная строка. Нужно понять какой алгоритм используется для шифрования.

Задача выглядит так:

A hacker was too lazy to do proper encryption. However, they left us some examples of how their encryption “algo” was supposed to work.

original text :

"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum." 

encoded:

"Lpthq jrvym!frpos"vmt!cpit-"fsntgfxeuwu$aeksmsdkqk fnlx,!uhh eq#iivupsd!vhqppt#mndkgmdvpw$uu"oebpth$eu"gslpth$mbiqe bnluub0#Yt!gqmm!cg$mjplq wgqman.#uuju#rotvuyd!g{irdkwetjqq$umndqcp"oebptlw okvm vv#eljsxmp!g{$eb"fsmnqgs dqqwerwdx.!Fxms!cxxe!kuyrf"gslpt#mn!thtrfjhrdftlx jp#zomwsxaug#zemkw$etuh$cjnoym!frposg#iu!hxkibv#rumnd$pbtletvt1$Eyehttfwu$sjpw$odedicbv#guqkgetbv#roo"svojfhrt-"vynu"lr dwota!sxm phimcjc#hetguynu"pslmkw$aokp$ie"hwt!ndfoswp2"

Find the pattern! Maybe you should try the same pattern on this string:

bagelarenotwholewheatsometimes Make sure you wrap your solution with dam{…}!

Разведка

Начнем с исследования строк. Сразу в глаза бросается, что хоть символы и разные, но в некоторых местах совпадают пробелы. Да и по длине они равны. Мне в голову пришло проверить шифр цезаря и другие возможные ROT (как-нибудь напишу статью о них) шифры. Ничего интересного, и похожего на нашу строку. Просто неосмысленные буквы.

Результат шифрования через ROT

Пристально смотрим на строку в течение часа и понимаем, насколько ответ очевиден. Каждый пятый символ совпадает в обеих строчках. А последующие символы смещаются на 1 символ по мере удаления от нулевого смещения. Переводя с псевдонаучного: каждая следующая буква передвигается на 1 символ по английскому алфавиту, пока количество смещенных букв не станет равно 5. Так, например, первая буква L имеет смещение 0, значит, остается собой. Следующая буква O переходит на 1 символ вправо (в англ. алфавите O, P, Q, R, S) и превращается в p, r в t, e в h и m в q

Схема смещения

На ноль приходится смещение равное нулю, поэтому пробел остается пробелом. Надеюсь объяснил, но все равно, вот код:

Код

keyw = r'0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ !"#$%&()*+,-./:;<=>?@[\]^_`{|}~ '

inter = 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.'
#inter = 'bagelarenotwholewheatsometimes'
outer = 'Lpthq jrvym!frpos"vmt!cpit-"fsntgfxeuwu$aeksmsdkqk fnlx,!uhh eq#iivupsd!vhqppt#mndkgmdvpw$uu"oebpth$eu"gslpth$mbiqe bnluub0#Yt!gqmm!cg$mjplq wgqman.#uuju#rotvuyd!g{irdkwetjqq$umndqcp"oebptlw okvm vv#eljsxmp!g{$eb"fsmnqgs dqqwerwdx.!Fxms!cxxe!kuyrf"gslpt#mn!thtrfjhrdftlx jp#zomwsxaug#zemkw$etuh$cjnoym!frposg#iu!hxkibv#rumnd$pbtletvt1$Eyehttfwu$sjpw$odedicbv#guqkgetbv#roo"svojfhrt-"vynu"lr dwota!sxm phimcjc#hetguynu"pslmkw$aokp$ie"hwt!ndfoswp2'
res = ''

offset = 0
for index in range(0,len(inter)):
    letter = inter[index]
    if index % 5==0:
        offset=0
    index_in_keyw = keyw.index(letter)
    letter_with_offset = keyw[index_in_keyw+offset]
    res+=letter_with_offset
    offset+=1
print('\n')
print(res)
print('\n')

Дальше все просто. Берем строку “bagelarenotwholewheatsometime” и прогоняем через полученный алгоритм. Это и будет флаг.

dam{bbihpasgqstxjrpexjhettqpitjohw}