CTF(Capture The Flag) に初めて挑戦してみた

CTFというのがあるというのを最近知った。
よくわかってはいないけど、システムをクラッキングしたり、暗号を解析したりして、「フラッグ」という文字列を発見するゲームみたいなものらしい。
というので、少し試しにやってみた。

問題はこれ
CpawCTF - Main page

問題文で与えられている文字列からフラッグを探す。
与えられている文字列は、シーザー暗号で暗号化されているから、復号しないといけない。
シーザー暗号は、アルファベットの文字を3文字ずらすという手法なので、3文字前に戻してやればいい。たとえば、"a"という文字をシーザー暗号で暗号化すると、3文字ずらせばよいので、"d"となる。これを復号化するときは3文字前にもどせばよいので、c, b, aと数えていって、答えは"a"となる。

というわけで、復号するプログラムはこんな感じに書いてみた。

# https://ctf.cpaw.site/questions.php?qnum=6
# 暗号には大きく分けて、古典暗号と現代暗号の2種類があります。
# 特に古典暗号では、古代ローマの軍事的指導者ガイウス・ユリウス・カエサル(英語読みでシーザー)が初めて使ったことから、名称がついたシーザー暗号が有名です。
# これは3文字分アルファベットをずらすという単一換字式暗号の一つです。次の暗号文は、このシーザー暗号を用いて暗号化しました。暗号文を解読してフラグを手にいれましょう。

# 暗号文: fsdz{Fdhvdu_flskhu_lv_fodvvlfdo_flskhu}

import re   # 正規表現モジュール

def alphabetShiftThree(cryptedString):
    targetString = list(cryptedString)
    decodeString = list()
    pattern = '[a-zA-Z]'
    for i in range(len(targetString)):
        if re.match(pattern, targetString[i]):  # アルファベットの時だけ3文字ずらす
            decodeString.append(chr(ord(targetString[i])-3))
        else:
            decodeString.append(targetString[i])
    return "".join(decodeString)

s = "fsdz{Fdhvdu_flskhu_lv_fodvvlfdo_flskhu}"
print(alphabetShiftThree(s))

スクリプトを書いていて、少し気になったのは、シーザー暗号はアルファベットだけが対象っぽいってところ。なので、暗号化された文字列がアルファベットのときだけ復号処理をしないといけないので、正規表現で判定することにした。
「3文字ずらす」という方法は、文字をord関数に与えると、そのユニコード値を返してくれるので、それを-3した数値をchr()関数で再度文字化することで実現。
最後は、全部joinして、文字列化したものを返せばOK。

おぉ… これってハッカー感が味わえる…w
AtCoderに続いてハマりそうな予感がしてます。