Mod 26
/icons/hr.icon
Writeupt6o_o6t.icon
問題文を読む
キーワード
知らない場合は検索して準備する
Cryptographyにはそのタイプの問題が多い
cvpbPGS{arkg_gvzr_V'yy_gel_2_ebhaqf_bs_ebg13_uJdSftmh}
小文字4個 + 大文字3個 + {}
これはpicoCTF{}を暗号化したものだと思うt6o_o6t.icon
CTFでは、FLAGに似ている文字列を探す
c → p、 p → c
方針
大文字のもの
復号するには、大文字の中で13個前に相当する文字を計算する必要がある
ROT13は、平文の文字を13個後の文字に置き替える方法だから 小文字のもの
以下のようなコードを書く
code:solve.py
s = "cvpbPGS{arkg_gvzr_V'yy_gel_2_ebhaqf_bs_ebg13_uJdSftmh}"
ans = ""
for c in s:
decrypted = c
if decrypted.isupper():
decrypted = chr(((ord(c) - 13 - ord('A')) % 26) + ord('A'))
elif decrypted.islower():
decrypted = chr((ord(c) - 13 - ord('a')) % 26 + ord('a'))
ans += decrypted
print(ans)
13個前の文字の文字コードは、ord(c) - 13で表せそうだが、これでは大文字 / 小文字の区別をはみ出してしまう
はみ出さないように実装する
Aを0として文字コードを考える
Aの文字コードを引き去ることで、同じことができる
文字コードが26以上になってはならないので、26で余りを取る
なぜ「26以上」なのかというと、いまAを0として考えている
Zは25となるから、26以上になってはならない
最後に、Aを0とした変換を解除する
$ python3 solve.py
picoCTF{next_time_I'll_try_2_rounds_of_rot13_hWqFsgzu}
/icons/hr.icon
別解を思いついたt6o_o6t.icon
RecipeのROT13を指定して、入力値を入れたら完了