Python ファイルの暗号化と復号化

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で結果を出力していましたが、暗号化のときのように、ファイルに保存してみました。

Udemy講師 酒井さん プログラミング Python

レクチャー自体は、あくまで一例で紹介されているものなので、そこから自分のスキルを上げるためには、いろいろと試してみることが大切です。

同じコードを入力して、同じ動作ができるか確認することももちろん重要です。

何もわかっていない状態から自分でコードを書くのは不可能なので、見本を写経して実行することは必要ですし、第一歩を踏み出すために重要なことです。

ただ、それだけでは学習したことを自分のものにはできないので、ちょっとコードを変更してみたり、調べたコードを付け足してみることで新しいことがわかってきます。

好奇心をもってコードを書くように意識しましょう。

それでは明日もGood Python!