読者です 読者をやめる 読者になる 読者になる

田舎院生のセキュログ

自分用のメモとかWrite-up

#2 Easy Cipher

ksnctf Write-up

はてなブログデビュー!

今までは他のブログサービスを使ってたのですが、コードも書いた方がいいなぁーと思って、コードが見やすい?はてなブログを始めました(。・ω・)ノ゙

初投稿はテストも兼ねて、前のブログに書いてた内容を書きます。

======================================================

ksnctfの2問目
http://ksnctf.sweetduet.info/problem/2

知ってる人は見た瞬間に分かると思うけど、シーザー暗号を解読する問題(-ω-)

で、問題になるのは何文字シフトすればいいか。

コツとしては、1文字~3文字で出現頻度の多い文字列を探す。

この問題だと、「vf」が多く使われていることが分かる。

ここで、一般的に英語の文章では、「a」、「is」、「the」などの単語が多く使われているので、「vf」は「is」に置換できるんじゃないかと予想する。

シフト数を計算してみると・・・

v → i は13文字

f → s も13文字

さらに、一文字で多く出現している「n」を13文字ずらすと「a」になる。


以上のことから、この問題はROT13であると予想できる。

あとはネット上でROT13を計算できるサイトを探して復号すれば解ける!


せっかくなので、自分は勉強中のPythonで復号プログラムを組んでみた。

# coding:utf-8

import sys

# 引数:読み込みファイル名、シフト数
input = sys.argv
file_name = str(input[1])
no = int(input[2])
plain_text = ""

# ファイル読み込み
file = open(file_name, 'rt')
text = file.read()
string_list = list(text)

for string in string_list:
    ascii = ord(string[0])
    new_ascii = ""

    # 大文字
    if 64 < ascii < 91:
        new_ascii = (ascii - 65 + no) % 26 + 65

    # 小文字
    elif 96 < ascii < 123:
        new_ascii = (ascii - 97 + no) % 26 + 97

    # それ以外
    else:
        new_ascii = ascii

    plain_text += chr(new_ascii)

print(plain_text)

Pythonの勉強始めたばかりだから大目に見てね。。。

で、出力結果↓↓

“ROT XIII is a simple letter substitution cipher that replaces a letter with the letter XIII letters after it in the alphabet. ROT XIII is an example of the Caesar cipher, developed in ancient Rome. Flag is FLAGSwagxBJSAMqwxxAU. Insert an underscore immediately after FLAG.”

FLAGの後にアンダースコアを入れてーってことなので、答えは・・・

“FLAG_SwagxBJSAMqwxxAU”

======================================================


自分が書いたコードを公開するのって物凄く恥ずかしい。。。笑