Envaderで学ぶセキュリティ基礎「簡易的な暗号化について」でいきなり躓いたので解説を試みる
セキュリティ基礎をEnvaderで学んでいます。
実際に簡易的な暗号を復号するにあたり、Pythonが全然できなかったため躓いて悔しかったので、気合で学んだ部分をまとめたいと思います。
前提知識
運営にわけがわからないよ?と聞いたところPythonの知識がそれなりに必要なためわからなければ一旦飛ばしてくださいとのこと。
ProgateでPythonやって四則演算わかるよ!レベルでは涙目になるばかりでした。
(学校で一通り学んだハズなのですが当時は価値を理解しておらずその後全く利用しなかったため記憶がほぼ白紙になっていました…。)
簡易的な暗号解読
暗号化することをエンコード(Encode)、復号・解読することをデコード(Decode)といいます。
簡易的な暗号の場合は、暗号化したアルゴリズムがわかれば逆手順を踏めば復号できることがあります。
例えば、以下の暗号は「文字列を反転した」だけなので同じ手順を繰り返せば複合できます。
# 暗号化
text = "Hello World"
print(text[::-1])
dlrow olleh
# 復号
text = "dlrow olleh"
print(text[::-1])
Hello World
問題1の解き方
ここからが本題です。Python初学者は何書いてるかすらわからず撃沈しましたw
問題1.以下はlevel_1.pyで暗号化しました。secretを復号化しなさい。
sfeuiyC;iAc89895j78>6b:5h8j<8=89:;95j@9
level_1.pyの中身を見れば解けるとのことなので見てみましょう。
text = "secret=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
encrypted_text = ""
for i, v in enumerate(text):
encrypted_text += chr(ord(v)+(i % 10))
print(encrypted_text)
Python初学者にとっては初見殺しもいいところでしたが一つ一つ読み解くことでなんとか理解できました。
enumerate()
listの引数にイテラブル(繰り返し指定可能な)オブジェクトを指定し、インデックス番号と要素を取得できる。
chr
Python公式リファレンスによると
Unicode コードポイントが整数 i である文字を表す文字列を返します。
ord
Python公式リファレンスによると
その文字の Unicode コードポイントを表す整数を返す。
よくわからんけど文字列をキャラクターコード変換した後に+(i % 10)
としているので、ここがより複雑にするための暗号化処理だと思われるので、逆の操作すればいいんだな(雑)
解答は以下に伏せておきます。
問題1の解答
encrypted_text = "sfeuiyC;iAc89895j78>6b:5h8j<8=89:;95j@9"
text= ""
for i, v in enumerate(encrypted_text):
# 復号するため-(i % 10)とした
text += chr(ord(v)-(i % 10))
print(text)
引用元:簡易的な暗号化について
問題2は皆さん是非Envaderで解いてみて下さい。
学んだこと
暗号基礎を学びに来たはずがPython基礎を学んだでござる。
プログラムのどこで複雑にするための処理をしているかがわかると、解ける気がします。
セキュリティ基礎、特に暗号を学ぶに当たり理解を深めるためPythonが必須スキルであることがわかったので今めちゃくちゃ習得努力をしています。
参考にした資料
これまで学んだ基礎的セキュリティ
フリー画像
Discussion