Python学習【365日チャレンジ!】236日目のマスターU(@Udemy11)です。
ネットをウロウロしていて【TENET】の予告やメイキングを見てしまいました。
人の意識に潜入する【インセプション】と同じく内容を理解するのが難解そうですが、ジャンボジェットを実際に建物に突っ込ませて爆発させるなど、CGを使わないリアルな撮影にこだわっているところや逆行というこれまでにないような演出が魅力的です。
ミッション・インポッシブルのトム・クルーズのように、主役のジョン・デヴィッド・ワシントンが、スタントマンを使わずに自身でアクションシーンを演じているところも魅力の一つです
私は、理解するのがちょっと難解で、いろいろ考察しないといけないような映画が好きなので、【TENET】はすぐにでも見に行きたい映画の一つです。
それでは、今日もPython学習をはじめましょう。
昨日の復習
昨日は、暗号化と復号化の基本について学習しました。
アスキーコードの文字列から16文字をランダムに選んでAES
を使ったアルゴリズムで任意の文字列を暗号化したり、暗号化したコードを復号化してもとの文字列に戻したりしました。
暗号化するには文字列の数が16の倍数である必要があるため、任意の文字列の数を16で割った余りを16から引いた数を16進数にしてその数の分だけ任意の文字列に付け加える作業もしました。
文字に羅列すると分かりづらいので、昨日の記事を参考にしてみてください。
今日は、ファイルを暗号化、復号化してみたいと思います。
ファイルの暗号化
昨日は、任意の文字列を入れて暗号化、復号化しましたが、今日は、ファイルを読み込んで暗号化と復号化をしたいと思います。
plaintext.txt
Hello.
I am MasterU
How are you?
上記のようなテキストファイルを作成して、このファイルを読み込んで暗号化します。
import string
import random
from Crypto.Cipher import AES
key = ''.join(
random.choice(string.ascii_letters) for _ in range(AES.block_size)
)
iv = ''.join(
random.choice(string.ascii_letters) for _ in range(AES.block_size)
)
with open('plaintext', 'r') as f, open('encode.dat', 'wb'), as e:
plaintext = f.read()
cipher = AES.new(key, AES.MODE_CBC, iv)
padding_length = AES.block_size - len(plaintext) % AES.block_size
plaintext += chr(padding_length) * padding_length
cipher_text = cipher.encrypt(plaintext)
e.write(cipher_text)
暗号化に関するフォーマットは昨日と同じです。
with
ステートメントで、先に作成したplaintext
を読み込みで開いて、新しくencode.dat
をバイナリ書き込みモードで作成します。
任意の文字を入れていたplaintext
に読み込んだファイルを代入して、昨日と同じように暗号化しています。
最後の21行目で、暗号化したコードをencode.dat
に書き込んでいます。
Pythonファイルを実行すれば、encode.dat
というファイルが作成されるので、開いてみると次のようにわけのわからない暗号化されたデータが入っているのがわかるかと思います。
encode.dat
��ϕ�k�
������%��G�Iy������yN�U��%�K��c'��
ファイルの復号化
次に、先程暗号化したファイルを復号化してみましょう。
with open('encode.dat', 'rb') as f, open('decode.dat', 'wb') as d:
cipher2 = AES.new(key, AES.MODE_CBC, iv)
decrypted_text = cipher2.decrypt(f.read())
d.write(decrypted_text[:-decrypted_text[-1]])
暗号化したコードの下に続けて記述します。
暗号化したencode.dat
をバイナリリードモードで開き、中身を復号化したあとdecode.dat
にバイナリモードで書き込みます。
24行目は暗号化のときと同じアルゴリズムのコードになります。
25行目では、encode.dat
を読み込んだデータを復号化して、decrypted_text
に代入しています。
26行目で、暗号化したときに付け足した余分なコードを削除して、decode.dat
に書き込んでいます。
decode.dat
Hello.
I am MasterU
How are you?
プロジェクトの中に新しくdecode.dat
ができているので、開いてみると、上記のようなデータが保存されているのがわかるかと思います。
本日のまとめ
酒井さんの講座では、復号化したあとは、print
で結果を出力していましたが、暗号化のときのように、ファイルに保存してみました。
レクチャー自体は、あくまで一例で紹介されているものなので、そこから自分のスキルを上げるためには、いろいろと試してみることが大切です。
同じコードを入力して、同じ動作ができるか確認することももちろん重要です。
何もわかっていない状態から自分でコードを書くのは不可能なので、見本を写経して実行することは必要ですし、第一歩を踏み出すために重要なことです。
ただ、それだけでは学習したことを自分のものにはできないので、ちょっとコードを変更してみたり、調べたコードを付け足してみることで新しいことがわかってきます。
好奇心をもってコードを書くように意識しましょう。
それでは明日もGood Python!