Mod 26
tags: PicoCTF
Cryptography
2021
問題
暗号は簡単です。ROT13を知っていますか?
Cryptography can be easy, do you know what ROT13 is?
問題サイト:PicoCTF
配布された文字列:cvpbPGS{arkg_gvzr_V'yy_gel_2_ebhaqf_bs_ebg13_jdJBFOXJ}
ROT13とは
以下のような特徴がある。
- シーザー暗号、単換字式暗号と呼ばれるものの一種で、アルファベットを後ろに13文字分ずらす処理。(ex. a → n, b → o)
- アルファベットのみが対象であるため数字や記号は変化しない。
- 変換前と変換後は大文字小文字が変わらない。(ex. a → n, A → N)
- アルファベットは26種類存在しているため2回ROT13の処理を行うと元の文に戻る。(26文字分ずらしたことになり丁度一周している)
解法
サイトでROT13について検索をかけると暗号化や解読ができるサイトが複数あった。それらを利用してもよいがせっかくなので自力でプログラムを組んで復号していく。
ROT13を復号するには、まずアルファベットであるか、真ならそれが大文字か小文字かを判別したあと、その文字のASCIIコードに13を足すことで元に戻すことを1文字ずつやればよい。
solve.py
import string
flag = "cvpbPGS{arkg_gvzr_V'yy_gel_2_ebhaqf_bs_ebg13_jdJBFOXJ}"
print(flag)
#文字列を1文字づつ分割してリスト化
flag = list(flag)
for i in range(len(flag)):
#要素がアルファベットか否かを判別
if flag[i] in string.ascii_letters:
#大文字の場合
if ord(flag[i]) < 97:
base = 65
#小文字の場合
else:
base = 97
#13文字ずらす
num = (ord(flag[i]) - base + 13)%26
flag[i] = chr(num + base)
flag = ''.join(flag)
print(flag)
解答
$ python3 solve.py
cvpbPGS{arkg_gvzr_V'yy_gel_2_ebhaqf_bs_ebg13_jdJBFOXJ}
picoCTF{next_time_I'll_try_2_rounds_of_rot13_wqWOSBKW}
復元成功
picoCTF{next_time_I'll_try_2_rounds_of_rot13_wqWOSBKW}