[

CpawCTF - Main page
ctf.cpaw.site
](https://ctf.cpaw.site/questions.php?qnum=6 “CpawCTF - Main page”)
Q6.[Crypto] Classical Cipher
CpawCTFレベル1の二問目。暗号文をシーザー暗号のルールに従って解読するもの。アルファベットをN文字分ずらせばいいだけ。
シーザー暗号とは
アルファベットを一定の数ずらして文字列を変換する暗号。例えば、シフト数が1で順方向にずらすなら、AはBになり、BはCになる。具体的には、ABCD→BCDEという風に。暗号の中でもとてもメジャーなもので、CryptoHackというCTFでは、アカウント登録にシーザー暗号を解く必要がある。
[

CryptoHack – Register
![]()
cryptohack.org
](https://cryptohack.org/register “CryptoHack – Register”)
Solve this Roman emperor’s cipher: YBILT KLYIB QOLRYIB ZEROK
CryptoHackアカウント登録画面から引用
解法
暗号文を手動でずらすことも可能だが、手間がかかるのでPCもスマホもないとき以外は文字をずらすコードを書くか、そういうサイトを利用しよう。
①Pythonでの解読
def caesar_decrypt(text, shift):
result = ""
for char in text:
if 'a' <= char <= 'z':
result += chr((ord(char) - ord('a') - shift) % 26 + ord('a'))
elif 'A' <= char <= 'Z':
result += chr((ord(char) - ord('A') - shift) % 26 + ord('A'))
else:
result += char
return result
cipher_text = "fsdz{Fdhvdu_flskhu_lv_fodvvlfdo_flskhu}"
print(caesar_decrypt(cipher_text, 3))
print(caesar_decrypt(cipher_text, 3))の最初の引数cipher_textは最初に名付けた関数名で、暗号化された文字列を受け取る。その次の数字がスライドさせる数。
この問題はスライドする数が3なので、print(caesar_decrypt(cipher_text, 3))としている。スライド数を切り替えたいときは、数値を変更すればいい。
アルファベットは大文字と小文字があるので、if文3つ書くことになる。一つ目が小文字、二つ目が大文字、三つ目がアルファベット以外の記号。
Pythonでは、Uniコードの大小関係が比較できるので、if ‘a’ <= char <= ‘z’:では、Uniコードの大小を比較している。AのUniコードは65、Zは90、aは97、zは122という風に、段々大きくなっていく。ここでやっていることは、if ord(‘a’) <= ord(char) <= ord(‘z’)と同じ。
ord(char) – ord(‘a’) – shiftは、aを基準にして、(char)に入る文字が何番目かを算出する。それをshiftに入れた数字分差し引けば、その分ずらせる。
※ord()は括弧内の文字をUniコードに変換する関数。
※char()は、ord()とは逆に、数値を文字に変換できる。
②シーザー暗号を解読用のサイトを使う
「シーザー暗号 変換サイト」と検索するだけで沢山出てくる。以下はそのリンク。
[
![]()
シーザー暗号 暗号化 / 復号化 Online - DenCode
シーザー暗号の暗号化・復号化が行えます。
![]()
dencode.com
](https://dencode.com/ja/cipher/caesar “シーザー暗号 暗号化 / 復号化 Online - DenCode”)[

Caesar cipher
](http://www.net.c.dendai.ac.jp/crypto/caesar2.html “Caesar cipher”)[

シーザー暗号で暗号化
入力した文章をシーザー暗号で暗号化・復号化します。
![]()
linesegment.web.fc2.com
](https://linesegment.web.fc2.com/application/cipher/Caesar.html “シーザー暗号で暗号化”)
