🐙

Envaderで学ぶセキュリティ基礎「簡易的な暗号化について」でいきなり躓いたので解説を試みる

2022/03/16に公開

セキュリティ基礎をEnvaderで学んでいます。
実際に簡易的な暗号を復号するにあたり、Pythonが全然できなかったため躓いて悔しかったので、気合で学んだ部分をまとめたいと思います。

前提知識

運営にわけがわからないよ?と聞いたところPythonの知識がそれなりに必要なためわからなければ一旦飛ばしてくださいとのこと。
ProgateでPythonやって四則演算わかるよ!レベルでは涙目になるばかりでした。
(学校で一通り学んだハズなのですが当時は価値を理解しておらずその後全く利用しなかったため記憶がほぼ白紙になっていました…。)

簡易的な暗号解読

暗号化することをエンコード(Encode)、復号・解読することをデコード(Decode)といいます。
簡易的な暗号の場合は、暗号化したアルゴリズムがわかれば逆手順を踏めば復号できることがあります。

例えば、以下の暗号は「文字列を反転した」だけなので同じ手順を繰り返せば複合できます。

# 暗号化
text = "Hello World"
print(text[::-1])
dlrow olleh
# 復号
text = "dlrow olleh"
print(text[::-1])
Hello World

https://qiita.com/tanuk1647/items/276d2be36f5abb8ea52e

問題1の解き方

ここからが本題です。Python初学者は何書いてるかすらわからず撃沈しましたw

問題1.以下はlevel_1.pyで暗号化しました。secretを復号化しなさい。

sfeuiyC;iAc89895j78>6b:5h8j<8=89:;95j@9

level_1.pyの中身を見れば解けるとのことなので見てみましょう。

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が必須スキルであることがわかったので今めちゃくちゃ習得努力をしています。

参考にした資料

https://qiita.com/okkn/items/54e81346d8f35733ab5e
https://note.nkmk.me/python-enumerate-start/

これまで学んだ基礎的セキュリティ

https://zenn.dev/terralien/articles/4f8446bae35e1f
https://zenn.dev/terralien/articles/1ac2eb63810101

フリー画像

https://pixabay.com/images/id-5723449/

Discussion