かたはらいたし。

個人的な技術的な活動をまとめていきたい。

ksnctf #2 Easy Cipher

1問目は書いてあるフラグを入力するだけの簡単なものだったのですが、2問目からはいよいよ問題を解いていきます。

ksnctf - 2 Easy Cipher

Problem

問題文には何やらアルファベットの羅列が。

EBG KVVV vf n fvzcyr yrggre fhofgvghgvba pvcure gung ercynprf n yrggre jvgu gur yrggre KVVV yrggref nsgre vg va gur nycunorg. EBG KVVV vf na rknzcyr bs gur Pnrfne pvcure, qrirybcrq va napvrag Ebzr. Synt vf SYNTFjmtkOWFNZdjkkNH. Vafreg na haqrefpber vzzrqvngryl nsgre SYNT.

ところどころスペースが空いているので、文章であることが予想できそうです。

Answer

これはもう暗号の勉強をちょっとでもかじったことがある人なら知っているシーザー暗号ってやつですな。(参考:シーザー暗号 - Wikipedia

元々シーザー暗号はアルファベットを辞書順に3文字ずらすのが基本みたいなのですが、この手の問題では3文字じゃないことの方が多いと思います。

で、何文字ずらすのかを推測するためにどこを見ればいいのかというと、1行目のvfnです。

英語の文章で2文字っていうと、僕の場合まず考えられるのがisです。1文字でいうとaIかなって感じですね。ここでvf->isだとすると、辞書順に13文字ずれていることがわかります。念の為nを13文字ずらしてみるとaになっているので大丈夫そうです。

あとは、自分で1文字ずつずらしてもいいんですが、それも面倒なのでオンライン上のツールを使って復号します。

Caesar cipher decryption tool • Code is poetryを使って復号すると以下の文字列が出力されます。

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 ********************. Insert an underscore immediately after FLAG.

Flag is 以下のフラグにアンダースコア_を挿入してフラグゲットです。

感想とか

最初の問題から考えると急にCTFぽく(?)なってきた感じがしました。とはいってもまだまだ有名どころの暗号なんでかなり簡単な方なのかな。

今回は最後の復号のところで、オンライン上のツールを使ったけど、プログラミングスキルを向上させるためには自分でコード書いたほうがよかったのかも。

と思ったので書いてみたけど、無駄が多そう。

#!/usr/bin/env python
# coding: UTF-8

import sys

str = 'EBG KVVV vf n fvzcyr yrggre fhofgvghgvba pvcure gung ercynprf n yrggre jvgu gur yrggre KVVV yrggref nsgre vg va gur nycunorg. EBG KVVV vf na rknzcyr bs gur Pnrfne pvcure, qrirybcrq va napvrag Ebzr. Synt vf SYNTFjmtkOWFNZdjkkNH. Vafreg na haqrefpber vzzrqvngryl nsgre SYNT.'
for x in str:
	x = ord(x)	# xをASCIIコードに変換

	if 65 < x & x < 90:		# A~Zの場合
		x = x + 13
		if x > 90:
			x = x - 26

	elif 97 < x & x < 122:	# a~zの場合
		x = x + 13
		if x > 122:
			x = x - 26

	sys.stdout.write(chr(x))